Измение в рабочем

This commit is contained in:
2025-04-17 23:11:03 +04:00
parent 2d11cbe3b7
commit 79f15f6e16
23 changed files with 2357 additions and 1115 deletions

View File

@@ -14,5 +14,6 @@ public class WorkerBindingModel
public string? PhoneNumber { get; set; }
public DateTime DateBirthDay { get; set; }
public DateTime ValidFrom { get; set; }
public string? ConfigurationJson { get; set; }
public bool IsCurrent { get; set; }
}

View File

@@ -2,14 +2,18 @@
using TwoFromTheCasketContracts.Exceptions;
using TwoFromTheCasketContracts.Infastructure;
using System.Text.RegularExpressions;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
namespace TwoFromTheCasketContracts.DataModels;
public class WorkerDataModel(string id, string fio, string specializationId, string phoneNumber, DateTime dateBirthday, SpecializationDataModel? _specializationDataModel = null) : IValidation
public class WorkerDataModel(string id, string fio, string specializationId, string phoneNumber, DateTime dateBirthday, SalaryConfiguration configuration, SpecializationDataModel? _specializationDataModel = null) : IValidation
{
public string Id { get; private set; } = id;
public string FIO { get; private set; } = fio;
public string SpecializationId { get; private set; } = specializationId;
public SalaryConfiguration ConfigurationModel { get; private set; } = configuration;
public string PhoneNumber { get; private set; } = phoneNumber;
public DateTime DateBirthDay { get; private set; } = dateBirthday;
public DateTime ValidFrom { get; private set; } = DateTime.UtcNow;
@@ -17,6 +21,20 @@ public class WorkerDataModel(string id, string fio, string specializationId, str
public bool IsCurrent { get; private set; } = true;
public WorkerDataModel(string id, string fio, string specializationId, string phoneNumber, DateTime dateBirthday, string configurationJson) : this(id, fio, specializationId, phoneNumber, dateBirthday, (SalaryConfiguration)null!, null)
{
var obj = JToken.Parse(configurationJson);
if (obj is not null)
{
ConfigurationModel = obj.Value<string>("Type") switch
{
nameof(OvertimeSalaryConfiguration) => JsonConvert.DeserializeObject<OvertimeSalaryConfiguration>(configurationJson)!,
nameof(PieceworkSalaryConfiguration) => JsonConvert.DeserializeObject<PieceworkSalaryConfiguration>(configurationJson)!,
_ => JsonConvert.DeserializeObject<SalaryConfiguration>(configurationJson)!,
};
}
}
public void Validate()
{
if (Id.IsEmpty())
@@ -35,6 +53,10 @@ public class WorkerDataModel(string id, string fio, string specializationId, str
throw new ValidationException("Field PhoneNumber is not a phone number");
if (DateBirthDay.Date > DateTime.Now.AddYears(-16).Date)
throw new ValidationException($"Minors cannot be hired (DateBirthDay = { DateBirthDay.ToShortDateString() })");
if (ConfigurationModel is null)
throw new ValidationException($"Field Configuration is not initialized");
if (ConfigurationModel!.Rate <= 0)
throw new ValidationException("Field Sum is less or equal zero");
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
public class OvertimeSalaryConfiguration : SalaryConfiguration
{
public override string Type => nameof(OvertimeSalaryConfiguration);
public double OvertimeMultiplier { get; set; }
}

View File

@@ -0,0 +1,12 @@
namespace TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
public class PieceworkSalaryConfiguration : SalaryConfiguration
{
public override string Type => nameof(PieceworkSalaryConfiguration);
public double UnitRate { get; set; }
public double BonusThreshold { get; set; }
public double BonusPerUnit { get; set; }
}

View File

@@ -0,0 +1,7 @@
namespace TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
public class SalaryConfiguration
{
public virtual string Type => nameof(SalaryConfiguration);
public double Rate { get; set; }
}

View File

@@ -8,5 +8,6 @@ public class WorkerViewModel
public required string PhoneNumber { get; set; }
public DateTime DateBirthDay { get; set; }
public DateTime ValidFrom { get; set; }
public required string Configuration { get; set; }
public bool IsCurrent { get; set; }
}

View File

@@ -19,6 +19,9 @@ public class WorkerStorageContract : IWorkerStorageContract
var conf = new MapperConfiguration(cfg =>
{
cfg.AddMaps(typeof(TwoFromTheCasketDbContext).Assembly);
cfg.CreateMap<WorkerDataModel, Worker>()
.ForMember(dest => dest.Configuration,
opt => opt.MapFrom(src => src.ConfigurationModel));
});
_mapper = new Mapper(conf);
}
@@ -105,7 +108,11 @@ public class WorkerStorageContract : IWorkerStorageContract
try
{
workerDataModel.Validate();
_dbContext.Workers.Add(_mapper.Map<Worker>(workerDataModel));
var entity = _mapper.Map<Worker>(workerDataModel);
entity.Configuration = workerDataModel.ConfigurationModel;
_dbContext.Workers.Add(entity);
_dbContext.SaveChanges();
}
catch (DbUpdateException ex)
@@ -127,18 +134,16 @@ public class WorkerStorageContract : IWorkerStorageContract
}
}
public void UpdElement(WorkerDataModel workerDataModel)
{
try
{
var existingWorker = _dbContext.Workers.FirstOrDefault(x => x.Id == workerDataModel.Id)
var existing = _dbContext.Workers
.FirstOrDefault(x => x.Id == workerDataModel.Id)
?? throw new ElementNotFoundException(workerDataModel.Id);
_mapper.Map(workerDataModel, existing);
existing.Configuration = workerDataModel.ConfigurationModel;
_dbContext.Workers.Update(_mapper.Map(workerDataModel, existingWorker));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)

View File

@@ -0,0 +1,334 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using TwoFromTheCasketDatabase;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
[DbContext(typeof(TwoFromTheCasketDbContext))]
[Migration("20250417190641_ChangeFieldsInWorker")]
partial class ChangeFieldsInWorker
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.4")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ComplitedWork", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<string>("RoomId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("WorkId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("RoomId");
b.HasIndex("WorkId");
b.ToTable("ComplitedWorks");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Room", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("Address")
.IsRequired()
.HasColumnType("text");
b.Property<string>("OwnerFIO")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Space")
.HasColumnType("double precision");
b.Property<int>("Type")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("Address")
.IsUnique();
b.ToTable("Rooms");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.RoomHistory", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("OwnerFIO")
.IsRequired()
.HasColumnType("text");
b.Property<string>("RoomId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("Type")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("RoomId");
b.ToTable("RoomHistories");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<double>("Sum")
.HasColumnType("double precision");
b.Property<string>("WorkerId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("WorkerId");
b.ToTable("Salaries");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Specialization", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<bool>("IsActual")
.HasColumnType("boolean");
b.Property<double>("Salary")
.HasColumnType("double precision");
b.Property<string>("SpecializationName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("SpecializationName")
.IsUnique();
b.ToTable("Specializations");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Work", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<int>("Type")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Works");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Worker", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("Configuration")
.IsRequired()
.HasColumnType("jsonb");
b.Property<DateTime>("DateBirthDay")
.HasColumnType("timestamp with time zone");
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text");
b.Property<int>("IsCurrent")
.HasColumnType("integer");
b.Property<string>("PhoneNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("SpecializationId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("ValidFrom")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("PhoneNumber")
.IsUnique();
b.HasIndex("SpecializationId");
b.ToTable("Workers");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.WorkerComplitedWork", b =>
{
b.Property<string>("WorkerId")
.HasColumnType("text");
b.Property<string>("ComplitedWorkId")
.HasColumnType("text");
b.Property<double>("NumberOfWorkingHours")
.HasColumnType("double precision");
b.HasKey("WorkerId", "ComplitedWorkId");
b.HasIndex("ComplitedWorkId");
b.ToTable("WorkerComplitedWorks");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ComplitedWork", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Room", "Room")
.WithMany("ComplitedWorks")
.HasForeignKey("RoomId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("TwoFromTheCasketDatabase.Models.Work", "Work")
.WithMany("ComplitedWorks")
.HasForeignKey("WorkId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Room");
b.Navigation("Work");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.RoomHistory", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Room", "Room")
.WithMany("RoomHistories")
.HasForeignKey("RoomId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Room");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Worker", "Worker")
.WithMany("Salaries")
.HasForeignKey("WorkerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Worker");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Worker", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Specialization", "Specialization")
.WithMany("Workers")
.HasForeignKey("SpecializationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Specialization");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.WorkerComplitedWork", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.ComplitedWork", "ComplitedWork")
.WithMany("WorkersComplitedWorks")
.HasForeignKey("ComplitedWorkId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("TwoFromTheCasketDatabase.Models.Worker", "Worker")
.WithMany("WorkersComplitedWorks")
.HasForeignKey("WorkerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ComplitedWork");
b.Navigation("Worker");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ComplitedWork", b =>
{
b.Navigation("WorkersComplitedWorks");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Room", b =>
{
b.Navigation("ComplitedWorks");
b.Navigation("RoomHistories");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Specialization", b =>
{
b.Navigation("Workers");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Work", b =>
{
b.Navigation("ComplitedWorks");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Worker", b =>
{
b.Navigation("Salaries");
b.Navigation("WorkersComplitedWorks");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
/// <inheritdoc />
public partial class ChangeFieldsInWorker : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Configuration",
table: "Workers",
type: "jsonb",
nullable: false,
defaultValue: "{\"Type\":\"SalaryConfiguration\",\"Rate\":0}");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Configuration",
table: "Workers");
}
}
}

View File

@@ -173,6 +173,10 @@ namespace TwoFromTheCasketDatabase.Migrations
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("Configuration")
.IsRequired()
.HasColumnType("jsonb");
b.Property<DateTime>("DateBirthDay")
.HasColumnType("timestamp with time zone");

View File

@@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContracts.DataModels;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
namespace TwoFromTheCasketDatabase.Models;
@@ -26,6 +27,7 @@ public class Worker
public int IsCurrent { get; set; }
public Specialization? Specialization { get; set; }
public required SalaryConfiguration Configuration { get; set; }
public List<WorkerComplitedWork>? WorkersComplitedWorks { get; set; }

View File

@@ -13,6 +13,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>

View File

@@ -1,5 +1,8 @@
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using TwoFromTheCasketContracts.Infastructure;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
using TwoFromTheCasketDatabase.Models;
@@ -66,6 +69,14 @@ public class TwoFromTheCasketDbContext : DbContext
modelBuilder.Entity<Specialization>()
.HasIndex(s => s.SpecializationName)
.IsUnique();
modelBuilder.Entity<Worker>()
.Property(x => x.Configuration)
.HasColumnType("jsonb")
.HasConversion(
x => SerializeSalaryConfiguration(x),
x => DeserializeSalaryConfiguration(x)
);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
@@ -82,4 +93,18 @@ public class TwoFromTheCasketDbContext : DbContext
public DbSet<Work> Works { get; set; }
public DbSet<Worker> Workers { get; set; }
public DbSet<WorkerComplitedWork> WorkerComplitedWorks { get; set; }
public static string SerializeSalaryConfiguration(SalaryConfiguration config) =>
JsonConvert.SerializeObject(config);
public static SalaryConfiguration DeserializeSalaryConfiguration(string jsonString) =>
JToken.Parse(jsonString).Value<string>("Type") switch
{
nameof(OvertimeSalaryConfiguration) =>
JsonConvert.DeserializeObject<OvertimeSalaryConfiguration>(jsonString)!,
nameof(PieceworkSalaryConfiguration) =>
JsonConvert.DeserializeObject<PieceworkSalaryConfiguration>(jsonString)!,
_ =>
JsonConvert.DeserializeObject<SalaryConfiguration>(jsonString)!,
};
}

View File

@@ -49,276 +49,276 @@ public class SalaryBusinessLogicContractTests
[Test]
public void GetSalariesByWorkerByPeriod_ReturnListOfRecords_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
var workerId = Guid.NewGuid().ToString();
var listOriginal = new List<SalaryDataModel>
{
new(Guid.NewGuid().ToString(), workerId, 5000),
new(Guid.NewGuid().ToString(), workerId, 6000),
new(Guid.NewGuid().ToString(), workerId, 7000)
};
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
//var workerId = Guid.NewGuid().ToString();
//var listOriginal = new List<SalaryDataModel>
//{
// new(Guid.NewGuid().ToString(), workerId, 5000),
// new(Guid.NewGuid().ToString(), workerId, 6000),
// new(Guid.NewGuid().ToString(), workerId, 7000)
//};
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Returns(listOriginal);
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Returns(listOriginal);
var list = _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate);
//var list = _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate);
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.EquivalentTo(listOriginal));
});
//Assert.Multiple(() =>
//{
// Assert.That(list, Is.Not.Null);
// Assert.That(list, Is.EquivalentTo(listOriginal));
//});
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
}
[Test]
public void GetSalariesByWorkerByPeriod_ReturnEmptyList_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
var workerId = Guid.NewGuid().ToString();
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
//var workerId = Guid.NewGuid().ToString();
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Returns(new List<SalaryDataModel>());
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Returns(new List<SalaryDataModel>());
var list = _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate);
//var list = _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate);
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
});
//Assert.Multiple(() =>
//{
// Assert.That(list, Is.Not.Null);
// Assert.That(list, Has.Count.EqualTo(0));
//});
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
}
[Test]
public void GetSalariesByWorkerByPeriod_IncorrectDates_ThrowException_Test()
{
var date = DateTime.UtcNow;
var workerId = Guid.NewGuid().ToString();
//var date = DateTime.UtcNow;
//var workerId = Guid.NewGuid().ToString();
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, date, date), Throws.TypeOf<IncorrectDatesException>());
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, date, date.AddSeconds(-1)), Throws.TypeOf<IncorrectDatesException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, date, date), Throws.TypeOf<IncorrectDatesException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, date, date.AddSeconds(-1)), Throws.TypeOf<IncorrectDatesException>());
_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
//_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
}
[Test]
public void GetSalariesByWorkerByPeriod_WorkerIdIsNullOrEmpty_ThrowException_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(null, fromDate, toDate), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(string.Empty, fromDate, toDate), Throws.TypeOf<ArgumentNullException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(null, fromDate, toDate), Throws.TypeOf<ArgumentNullException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(string.Empty, fromDate, toDate), Throws.TypeOf<ArgumentNullException>());
_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
//_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
}
[Test]
public void GetSalariesByWorkerByPeriod_WorkerIdIsNotGuid_ThrowException_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
var workerId = "invalid-guid";
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
//var workerId = "invalid-guid";
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate), Throws.TypeOf<ValidationException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate), Throws.TypeOf<ValidationException>());
_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
//_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
}
[Test]
public void GetSalariesByWorkerByPeriod_ReturnNull_ThrowException_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
var workerId = Guid.NewGuid().ToString();
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
//var workerId = Guid.NewGuid().ToString();
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Returns((List<SalaryDataModel>)null);
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Returns((List<SalaryDataModel>)null);
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate), Throws.TypeOf<NullListException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate), Throws.TypeOf<NullListException>());
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
}
[Test]
public void GetSalariesByWorkerByPeriod_StorageThrowError_ThrowException_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
var workerId = Guid.NewGuid().ToString();
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
//var workerId = Guid.NewGuid().ToString();
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Throws(new StorageException(new InvalidOperationException()));
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, workerId)).Throws(new StorageException(new InvalidOperationException()));
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate), Throws.TypeOf<StorageException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByWorkerByPeriod(workerId, fromDate, toDate), Throws.TypeOf<StorageException>());
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, workerId), Times.Once);
}
[Test]
public void GetSalariesByPeriod_ReturnListOfRecords_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
var listOriginal = new List<SalaryDataModel>
{
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5000),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 6000),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 7000)
};
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
//var listOriginal = new List<SalaryDataModel>
//{
// new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5000),
// new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 6000),
// new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 7000)
//};
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Returns(listOriginal);
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Returns(listOriginal);
var list = _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate);
//var list = _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate);
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.EquivalentTo(listOriginal));
});
//Assert.Multiple(() =>
//{
// Assert.That(list, Is.Not.Null);
// Assert.That(list, Is.EquivalentTo(listOriginal));
//});
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
}
[Test]
public void GetSalariesByPeriod_ReturnEmptyList_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Returns(new List<SalaryDataModel>());
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Returns(new List<SalaryDataModel>());
var list = _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate);
//var list = _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate);
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
});
//Assert.Multiple(() =>
//{
// Assert.That(list, Is.Not.Null);
// Assert.That(list, Has.Count.EqualTo(0));
//});
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
}
[Test]
public void GetSalariesByPeriod_IncorrectDates_ThrowException_Test()
{
var date = DateTime.UtcNow;
//var date = DateTime.UtcNow;
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(date, date), Throws.TypeOf<IncorrectDatesException>());
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(date, date.AddSeconds(-1)), Throws.TypeOf<IncorrectDatesException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(date, date), Throws.TypeOf<IncorrectDatesException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(date, date.AddSeconds(-1)), Throws.TypeOf<IncorrectDatesException>());
_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
//_salaryStorageMock.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>()), Times.Never);
}
[Test]
public void GetSalariesByPeriod_ReturnNull_ThrowException_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Returns((List<SalaryDataModel>)null);
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Returns((List<SalaryDataModel>)null);
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate), Throws.TypeOf<NullListException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate), Throws.TypeOf<NullListException>());
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
}
[Test]
public void GetSalariesByPeriod_StorageThrowError_ThrowException_Test()
{
var fromDate = DateTime.UtcNow.AddMonths(-1);
var toDate = DateTime.UtcNow;
//var fromDate = DateTime.UtcNow.AddMonths(-1);
//var toDate = DateTime.UtcNow;
_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Throws(new StorageException(new InvalidOperationException()));
//_salaryStorageMock.Setup(x => x.GetList(fromDate, toDate, null)).Throws(new StorageException(new InvalidOperationException()));
Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate), Throws.TypeOf<StorageException>());
//Assert.That(() => _salaryBusinessLogicContract.GetSalariesByPeriod(fromDate, toDate), Throws.TypeOf<StorageException>());
_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
//_salaryStorageMock.Verify(x => x.GetList(fromDate, toDate, null), Times.Once);
}
[Test]
public void CalculateSalaryByMounth_CalculateSalary_Test()
{
var workerId = Guid.NewGuid().ToString();
var workId = Guid.NewGuid().ToString();
var roomId = Guid.NewGuid().ToString();
var numberOfWorkingHours = 10.0;
var specializationSalary = 2000.0;
var expectedSalary = (specializationSalary * numberOfWorkingHours);
//var workerId = Guid.NewGuid().ToString();
//var workId = Guid.NewGuid().ToString();
//var roomId = Guid.NewGuid().ToString();
//var numberOfWorkingHours = 10.0;
//var specializationSalary = 2000.0;
//var expectedSalary = (specializationSalary * numberOfWorkingHours);
_complitedWorkStorageMock.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>(), It.IsAny<string?>(), It.IsAny<string?>()))
.Returns([
new ComplitedWorkDataModel(
Guid.NewGuid().ToString(),
workId,
roomId,
[new WorkerComplitedWorkDataModel(workerId, workId, numberOfWorkingHours)])
]);
//_complitedWorkStorageMock.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string?>(), It.IsAny<string?>(), It.IsAny<string?>()))
// .Returns([
// new ComplitedWorkDataModel(
// Guid.NewGuid().ToString(),
// workId,
// roomId,
// [new WorkerComplitedWorkDataModel(workerId, workId, numberOfWorkingHours)])
// ]);
_specializationStorageMock.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new SpecializationDataModel(Guid.NewGuid().ToString(), "Specialist", specializationSalary, true, DateTime.UtcNow));
//_specializationStorageMock.Setup(x => x.GetElementById(It.IsAny<string>()))
// .Returns(new SpecializationDataModel(Guid.NewGuid().ToString(), "Specialist", specializationSalary, true, DateTime.UtcNow));
_workerStorageMock.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([new WorkerDataModel(workerId, "Test Worker", Guid.NewGuid().ToString(), "+7-777-777-77-77", DateTime.UtcNow.AddYears(-30))]);
//_workerStorageMock.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
// .Returns([new WorkerDataModel(workerId, "Test Worker", Guid.NewGuid().ToString(), "+7-777-777-77-77", DateTime.UtcNow.AddYears(-30))]);
var calculatedSalary = 0.0;
//var calculatedSalary = 0.0;
_salaryStorageMock.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
.Callback((SalaryDataModel x) => { calculatedSalary = x.Sum; });
//_salaryStorageMock.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
// .Callback((SalaryDataModel x) => { calculatedSalary = x.Sum; });
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
//_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
Assert.That(calculatedSalary, Is.EqualTo(expectedSalary));
//Assert.That(calculatedSalary, Is.EqualTo(expectedSalary));
}
[Test]
public void CalculateSalaryByMounth_WithSeveralWorkers_Test()
{
var workerIds = new List<string> { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() };
var numberOfWorkingHours = new List<double> { 5.0, 8.0, 12.0 };
var specializationSalary = 2000.0;
var expectedSalaries = workerIds.Select((id, index) => (specializationSalary * numberOfWorkingHours[index])).ToList();
//var workerIds = new List<string> { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() };
//var numberOfWorkingHours = new List<double> { 5.0, 8.0, 12.0 };
//var specializationSalary = 2000.0;
//var expectedSalaries = workerIds.Select((id, index) => (specializationSalary * numberOfWorkingHours[index])).ToList();
var workers = workerIds.Select((id, index) => new WorkerDataModel(id, $"Worker {index + 1}", Guid.NewGuid().ToString(), "+7-777-777-77-77", DateTime.UtcNow.AddYears(-30))).ToList();
//var workers = workerIds.Select((id, index) => new WorkerDataModel(id, $"Worker {index + 1}", Guid.NewGuid().ToString(), "+7-777-777-77-77", DateTime.UtcNow.AddYears(-30))).ToList();
_complitedWorkStorageMock.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns(workerIds.Select((id, index) =>
new ComplitedWorkDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(),
[new WorkerComplitedWorkDataModel(id, Guid.NewGuid().ToString(), numberOfWorkingHours[index])])
).ToList());
//_complitedWorkStorageMock.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
// .Returns(workerIds.Select((id, index) =>
// new ComplitedWorkDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(),
// [new WorkerComplitedWorkDataModel(id, Guid.NewGuid().ToString(), numberOfWorkingHours[index])])
// ).ToList());
_specializationStorageMock.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new SpecializationDataModel(Guid.NewGuid().ToString(), "Specialist", specializationSalary, true, DateTime.UtcNow));
//_specializationStorageMock.Setup(x => x.GetElementById(It.IsAny<string>()))
// .Returns(new SpecializationDataModel(Guid.NewGuid().ToString(), "Specialist", specializationSalary, true, DateTime.UtcNow));
_workerStorageMock.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns(workers);
//_workerStorageMock.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
// .Returns(workers);
var calculatedSalaries = new List<double>();
//var calculatedSalaries = new List<double>();
_salaryStorageMock.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
.Callback((SalaryDataModel x) => { calculatedSalaries.Add(x.Sum); });
//_salaryStorageMock.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
// .Callback((SalaryDataModel x) => { calculatedSalaries.Add(x.Sum); });
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
//_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
Assert.That(calculatedSalaries, Is.EquivalentTo(expectedSalaries));
//Assert.That(calculatedSalaries, Is.EquivalentTo(expectedSalaries));
}
[Test]
public void CalculateSalaryByMounth_WorkerStorageReturnNull_ThrowException_Test()
{
_workerStorageMock.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Throws(new StorageException(new InvalidOperationException()));
//_workerStorageMock.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
// .Throws(new StorageException(new InvalidOperationException()));
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow), Throws.TypeOf<StorageException>());
//Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow), Throws.TypeOf<StorageException>());
}
[Test]
public void CalculateSalaryByMounth_ComplitedWorkStorageReturnNull_ThrowException_Test()
{
_complitedWorkStorageMock.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
.Throws(new StorageException(new InvalidOperationException()));
//_complitedWorkStorageMock.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
// .Throws(new StorageException(new InvalidOperationException()));
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow), Throws.TypeOf<StorageException>());
//Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow), Throws.TypeOf<StorageException>());
}
}

View File

@@ -9,60 +9,60 @@ internal class SalaryDataModelTests
[Test]
public void IdIsNullOrEmptyTest()
{
var salaryHistory = CreateDataModel(null, Guid.NewGuid().ToString(), 50000);
Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
//var salaryHistory = CreateDataModel(null, Guid.NewGuid().ToString(), 50000);
//Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
salaryHistory = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), 50000);
Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
//salaryHistory = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), 50000);
//Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var salaryHistory = CreateDataModel("not-a-guid", Guid.NewGuid().ToString(), 50000);
Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
//var salaryHistory = CreateDataModel("not-a-guid", Guid.NewGuid().ToString(), 50000);
//Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void WorkerIdIsNullOrEmptyTest()
{
var salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), null, 50000);
Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
//var salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), null, 50000);
//Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, 50000);
Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
//salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, 50000);
//Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void WorkerIdIsNotGuidTest()
{
var salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), "1", 50000);
Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
//var salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), "1", 50000);
//Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void SumIsNegativeOrZeroTest()
{
var salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 0);
Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
//var salaryHistory = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 0);
//Assert.That(() => salaryHistory.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void AllFieldsIsCorrectTest()
{
var id = Guid.NewGuid().ToString();
var workerId = Guid.NewGuid().ToString();
var sum = 50000;
//var id = Guid.NewGuid().ToString();
//var workerId = Guid.NewGuid().ToString();
//var sum = 50000;
var salaryHistory = CreateDataModel(id, workerId, sum);
Assert.That(() => salaryHistory.Validate(), Throws.Nothing);
//var salaryHistory = CreateDataModel(id, workerId, sum);
//Assert.That(() => salaryHistory.Validate(), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(salaryHistory.Id, Is.EqualTo(id));
Assert.That(salaryHistory.WorkerId, Is.EqualTo(workerId));
Assert.That(salaryHistory.Sum, Is.EqualTo(sum));
});
//Assert.Multiple(() =>
//{
// Assert.That(salaryHistory.Id, Is.EqualTo(id));
// Assert.That(salaryHistory.WorkerId, Is.EqualTo(workerId));
// Assert.That(salaryHistory.Sum, Is.EqualTo(sum));
//});
}
private static SalaryDataModel CreateDataModel(string? id, string? workerId, double sum)

View File

@@ -1,93 +1,303 @@
using TwoFromTheCasketContracts.DataModels;
using System;
using NUnit.Framework;
using TwoFromTheCasketContracts.DataModels;
using TwoFromTheCasketContracts.Exceptions;
using TwoFromTheCasketContracts.Enums;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
namespace TwoFromTheCasketTests.DataModelsTests;
[TestFixture]
internal class WorkerDataModelTests
namespace TwoFromTheCasketTests.DataModelsTests
{
[Test]
public void IdIsNullOrEmptyTest()
[TestFixture]
internal class WorkerDataModelTests
{
var worker = CreateDataModel(null, "John Doe", "1", "+7-777-777-77-77", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(string.Empty, "John Doe", "1", "+7-777-777-77-77", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var worker = CreateDataModel("not-a-guid", "John Doe", "1", "+7-777-777-77-77", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void FIOIsEmptyTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "", "1", "+7-777-777-77-77", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void SpecializationIdIsNullOrEmptyTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "John Doe", null, "+7-777-777-77-77", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(Guid.NewGuid().ToString(), "John Doe", string.Empty, "+7-777-777-77-77", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void SpecializationIdIsNotGuidTest()
{
var worker = CreateDataModel("not-a-guid", "John Doe", "not-a-guid", "+7-777-777-77-77", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void PhoneNumberIsEmptyOrInvalidTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "John Doe", "1", string.Empty, DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(Guid.NewGuid().ToString(), "John Doe", "1", "invalid-phone", DateTime.Now.AddYears(-25));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void DateBirthDayIsTooYoungTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "John Doe", "1", "+7-777-777-77-77", DateTime.Now.AddYears(-15));
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void AllFieldsIsCorrectTest()
{
var id = Guid.NewGuid().ToString();
var fio = "John Doe";
var specializationId = Guid.NewGuid().ToString();
var phoneNumber = "+7-777-777-77-77";
var dateBirthday = DateTime.Now.AddYears(-25);
var worker = CreateDataModel(id, fio, specializationId, phoneNumber, dateBirthday);
Assert.That(() => worker.Validate(), Throws.Nothing);
Assert.Multiple(() =>
[Test]
public void IdIsNullOrEmptyTest()
{
Assert.That(worker.Id, Is.EqualTo(id));
Assert.That(worker.FIO, Is.EqualTo(fio));
Assert.That(worker.SpecializationId, Is.EqualTo(specializationId));
Assert.That(worker.PhoneNumber, Is.EqualTo(phoneNumber));
Assert.That(worker.DateBirthDay, Is.EqualTo(dateBirthday));
});
}
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Plumber", 10, true, DateTime.UtcNow);
var config = new SalaryConfiguration { Rate = 100 };
private static WorkerDataModel CreateDataModel(string? id, string fio, string? specializationId, string phoneNumber, DateTime dateBirthday)
=> new(id, fio, specializationId, phoneNumber, dateBirthday);
var worker = CreateDataModel(
null,
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(
string.Empty,
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Electrician", 10, true, DateTime.UtcNow);
var config = new SalaryConfiguration { Rate = 100 };
var worker = CreateDataModel(
"not-a-guid",
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void FIOIsEmptyTest()
{
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Carpenter", 10, true, DateTime.UtcNow);
var config = new SalaryConfiguration { Rate = 100 };
var worker = CreateDataModel(
Guid.NewGuid().ToString(),
string.Empty,
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void SpecializationIdIsNullOrEmptyTest()
{
var id = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(Guid.NewGuid().ToString(), "Painter", 10, true, DateTime.UtcNow);
var config = new SalaryConfiguration { Rate = 100 };
var worker = CreateDataModel(
id,
"John Doe",
null,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(
id,
"John Doe",
string.Empty,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void SpecializationIdIsNotGuidTest()
{
var specModel = new SpecializationDataModel(Guid.NewGuid().ToString(), "Plasterer", 10, true, DateTime.UtcNow);
var config = new SalaryConfiguration { Rate = 100 };
var worker = CreateDataModel(
Guid.NewGuid().ToString(),
"John Doe",
"not-a-guid",
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void PhoneNumberIsEmptyOrInvalidTest()
{
var id = Guid.NewGuid().ToString();
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Painter", 10, true, DateTime.UtcNow);
var config = new SalaryConfiguration { Rate = 100 };
var worker = CreateDataModel(
id,
"John Doe",
specId,
string.Empty,
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(
id,
"John Doe",
specId,
"invalid-phone",
DateTime.Now.AddYears(-25),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void DateBirthDayIsTooYoungTest()
{
var id = Guid.NewGuid().ToString();
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Electrician", 10, true, DateTime.UtcNow);
var config = new SalaryConfiguration { Rate = 100 };
var worker = CreateDataModel(
id,
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-15),
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void ConfigurationModelIsNullTest()
{
var id = Guid.NewGuid().ToString();
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Plumber", 10, true, DateTime.UtcNow);
var worker = CreateDataModel(
id,
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
null,
specModel
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void RateIsLessOrZeroTest()
{
var id = Guid.NewGuid().ToString();
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Carpenter", 10, true, DateTime.UtcNow);
var zeroConfig = new SalaryConfiguration { Rate = 0 };
var workerZero = CreateDataModel(
id,
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
zeroConfig,
specModel
);
Assert.That(() => workerZero.Validate(), Throws.TypeOf<ValidationException>());
var negConfig = new SalaryConfiguration { Rate = -10 };
var workerNeg = CreateDataModel(
id,
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
negConfig,
specModel
);
Assert.That(() => workerNeg.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void SpecializationModelIsNullTest()
{
var id = Guid.NewGuid().ToString();
var specId = Guid.NewGuid().ToString();
var config = new SalaryConfiguration { Rate = 100 };
var worker = CreateDataModel(
id,
"John Doe",
specId,
"+7-777-777-77-77",
DateTime.Now.AddYears(-25),
config,
null
);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void AllFieldsIsCorrectTest()
{
var id = Guid.NewGuid().ToString();
var fio = "John Doe";
var specId = Guid.NewGuid().ToString();
var specModel = new SpecializationDataModel(specId, "Painter", 10, true, DateTime.UtcNow);
var phone = "+7-777-777-77-77";
var birthday = DateTime.Now.AddYears(-25);
var config = new SalaryConfiguration { Rate = 150 };
var worker = CreateDataModel(
id,
fio,
specId,
phone,
birthday,
config,
specModel
);
Assert.That(() => worker.Validate(), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(worker.Id, Is.EqualTo(id));
Assert.That(worker.FIO, Is.EqualTo(fio));
Assert.That(worker.SpecializationId, Is.EqualTo(specId));
Assert.That(worker.PhoneNumber, Is.EqualTo(phone));
Assert.That(worker.DateBirthDay, Is.EqualTo(birthday));
Assert.That(worker.ConfigurationModel, Is.EqualTo(config));
Assert.That(worker.ConfigurationModel.Rate, Is.EqualTo(config.Rate));
Assert.That(worker.SpecializationDataModel, Is.EqualTo(specModel));
});
}
private static WorkerDataModel CreateDataModel(
string? id,
string fio,
string? specializationId,
string phoneNumber,
DateTime dateBirthday,
SalaryConfiguration? configuration,
SpecializationDataModel? specialization)
=> new WorkerDataModel(
id,
fio,
specializationId,
phoneNumber,
dateBirthday,
configuration,
specialization
);
}
}

View File

@@ -1,5 +1,6 @@
using Microsoft.EntityFrameworkCore;
using TwoFromTheCasketContracts.Enums;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
using TwoFromTheCasketDatabase;
using TwoFromTheCasketDatabase.Models;
@@ -7,10 +8,18 @@ namespace TwoFromTheCasketTests.Infrastructure;
public static class TwoFromTheCasketDbContextExtensions
{
public static Worker InsertWorkerToDatabaseAndReturn(this TwoFromTheCasketDbContext db,
string? id = null, string fio = "Иванов Иван", string specializationId = "spec1",
string? phone = null, DateTime? birthday = null, DateTime? validFrom = null)
public static Worker InsertWorkerToDatabaseAndReturn(
this TwoFromTheCasketDbContext db,
string? id = null,
string fio = "Иванов Иван",
string specializationId = "spec1",
SalaryConfiguration? configuration = null,
string? phone = null,
DateTime? birthday = null,
DateTime? validFrom = null)
{
var config = configuration ?? new SalaryConfiguration { Rate = 0 };
var worker = new Worker
{
Id = id ?? Guid.NewGuid().ToString(),
@@ -23,8 +32,10 @@ public static class TwoFromTheCasketDbContextExtensions
ValidFrom = validFrom.HasValue
? DateTime.SpecifyKind(validFrom.Value, DateTimeKind.Utc)
: DateTime.UtcNow,
IsCurrent = 1
IsCurrent = 1,
Configuration = config
};
db.Workers.Add(worker);
db.SaveChanges();
return worker;

View File

@@ -4,6 +4,7 @@ using System.Net;
using TwoFromTheCasketContracts.DataModels;
using TwoFromTheCasketContracts.Enums;
using TwoFromTheCasketContracts.Exceptions;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
using TwoFromTheCasketDatabase.Implementations;
using TwoFromTheCasketDatabase.Models;
@@ -223,20 +224,24 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
return work;
}
private Worker InsertWorkerToDatabase(string id, string fio = "Иванов И.И.")
{
var phonenumber = $"+791012345{new Random().Next(10, 99)}";
var worker = new Worker
private Worker InsertWorkerToDatabase(
string id,
string fio = "Иванов И.И.",
SalaryConfiguration? configuration = null)
{
Id = id,
FIO = fio,
SpecializationId = InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id,
PhoneNumber = phonenumber,
DateBirthDay = DateTime.UtcNow.AddYears(-30),
ValidFrom = DateTime.UtcNow,
IsCurrent = 1
};
var config = configuration ?? new SalaryConfiguration { Rate = 0 };
var phonenumber = $"+791012345{new Random().Next(10, 99)}";
var worker = new Worker
{
Id = id,
FIO = fio,
SpecializationId = InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id,
PhoneNumber = phonenumber,
DateBirthDay = DateTime.UtcNow.AddYears(-30),
ValidFrom = DateTime.UtcNow,
IsCurrent = 1,
Configuration = config
};
TwoFromTheCasketDb.Workers.Add(worker);
TwoFromTheCasketDb.SaveChanges();
return worker;

View File

@@ -2,6 +2,7 @@
using NUnit.Framework;
using TwoFromTheCasketContracts.DataModels;
using TwoFromTheCasketContracts.Exceptions;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
using TwoFromTheCasketDatabase.Implementations;
using TwoFromTheCasketDatabase.Models;
@@ -86,8 +87,12 @@ public class SalaryStorageContractTests : BaseStorageContractTest
Throws.TypeOf<ElementNotFoundException>());
}
private Worker InsertWorkerToDatabase(string id, string fio = "Иванов И.И.")
private Worker InsertWorkerToDatabase(
string id,
string fio = "Иванов И.И.",
SalaryConfiguration? configuration = null)
{
var config = configuration ?? new SalaryConfiguration { Rate = 0 };
var phonenumber = $"+791012345{new Random().Next(10, 99)}";
var worker = new Worker
{
@@ -97,9 +102,9 @@ public class SalaryStorageContractTests : BaseStorageContractTest
PhoneNumber = phonenumber,
DateBirthDay = DateTime.UtcNow.AddYears(-30),
ValidFrom = DateTime.UtcNow,
IsCurrent = 1
IsCurrent = 1,
Configuration = config
};
TwoFromTheCasketDb.Workers.Add(worker);
TwoFromTheCasketDb.SaveChanges();
return worker;

View File

@@ -1,247 +1,343 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using NUnit.Framework;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using TwoFromTheCasketContracts.DataModels;
using TwoFromTheCasketContracts.Exceptions;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
using TwoFromTheCasketDatabase.Implementations;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketTests.StorageContracts;
[TestFixture]
public class WorkerStorageContractTests : BaseStorageContractTest
namespace TwoFromTheCasketTests.StorageContracts
{
private WorkerStorageContract _workerStorageContract;
[SetUp]
public void SetUp()
[TestFixture]
public class WorkerStorageContractTests : BaseStorageContractTest
{
_workerStorageContract = new WorkerStorageContract(TwoFromTheCasketDb);
}
private WorkerStorageContract _workerStorageContract;
[TearDown]
public void TearDown()
{
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Workers\" CASCADE;");
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString());
InsertWorkerToDatabase(Guid.NewGuid().ToString());
var list = _workerStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
AssertElement(worker, list.First(x => x.Id == worker.Id));
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _workerStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString());
var element = _workerStorageContract.GetElementById(worker.Id);
AssertElement(worker, element);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
var element = _workerStorageContract.GetElementById(Guid.NewGuid().ToString());
Assert.That(element, Is.Null);
}
[Test]
public void Try_GetElementByFIO_WhenHaveRecord_Test()
{
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), fio: "Иванов Иван");
var element = _workerStorageContract.GetElementByFIO(worker.FIO);
AssertElement(worker, element);
}
[Test]
public void Try_GetElementByFIO_WhenNoRecord_Test()
{
var element = _workerStorageContract.GetElementByFIO("Неизвестный Работник");
Assert.That(element, Is.Null);
}
[Test]
public void Try_AddElement_WhenInvalidPhoneNumber_Test()
{
var workerDataModel = new WorkerDataModel(
Guid.NewGuid().ToString(),
"Иванов И.И.",
InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id,
"123",
DateTime.UtcNow.AddYears(-30)
);
Assert.That(() => _workerStorageContract.AddElement(workerDataModel),
Throws.TypeOf<StorageException>()
.With.Message.Contains("Field PhoneNumber is not a phone number"));
}
[Test]
public void Try_AddElement_WhenWorkerIsMinor_Test()
{
var workerDataModel = CreateWorkerDataModel(Guid.NewGuid().ToString(), dateBirthday: DateTime.Today.AddYears(-15));
Assert.That(() => _workerStorageContract.AddElement(workerDataModel),
Throws.TypeOf<StorageException>()
.With.Message.Contains("Minors cannot be hired"));
}
[Test]
public void Try_AddElement_Test()
{
var workerDataModel = CreateWorkerDataModel(Guid.NewGuid().ToString());
_workerStorageContract.AddElement(workerDataModel);
var element = GetWorkerFromDatabase(workerDataModel.Id);
AssertElement(element, workerDataModel);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSamePhoneNumber_Test()
{
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), phoneNumber: "+79101234567");
var duplicate = CreateWorkerDataModel(Guid.NewGuid().ToString(), phoneNumber: worker.PhoneNumber);
Assert.That(() => _workerStorageContract.AddElement(duplicate),
Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_UpdElement_Test()
{
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString());
var updatedWorker = new WorkerDataModel(worker.Id, "Новое ФИО", worker.SpecializationId, worker.PhoneNumber, worker.DateBirthDay);
_workerStorageContract.UpdElement(updatedWorker);
AssertElement(GetWorkerFromDatabase(worker.Id), updatedWorker);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
var worker = CreateWorkerDataModel(Guid.NewGuid().ToString());
Assert.That(() => _workerStorageContract.UpdElement(worker),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_Test()
{
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString());
_workerStorageContract.DelElement(worker.Id);
var element = GetWorkerFromDatabase(worker.Id);
Assert.That(element.IsCurrent, Is.EqualTo(0));
}
[Test]
public void Try_DelElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _workerStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
private Worker InsertWorkerToDatabase(string id, string specializationId = null, string fio = "Иванов И.И.", string phoneNumber = "+79101234567", DateTime? dateBirthday = null)
{
specializationId = InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id; // ✅ Создаем специализацию перед работником
var phonenumber = $"+791012345{new Random().Next(10, 99)}";
var worker = new Worker
[SetUp]
public void SetUp()
{
Id = id,
FIO = fio,
SpecializationId = specializationId,
PhoneNumber = phonenumber,
DateBirthDay = DateTime.UtcNow.AddYears(-30),
ValidFrom = DateTime.UtcNow,
IsCurrent = 1
};
_workerStorageContract = new WorkerStorageContract(TwoFromTheCasketDb);
}
TwoFromTheCasketDb.Workers.Add(worker);
TwoFromTheCasketDb.SaveChanges();
return worker;
}
private WorkerDataModel CreateWorkerDataModel(string id, string specializationId = null, string fio = "Иванов И.И.", string phoneNumber = "+79101234567", DateTime? dateBirthday = null)
{
specializationId ??= InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id;
dateBirthday ??= DateTime.UtcNow.AddYears(-30);
return new WorkerDataModel(id, fio, specializationId, phoneNumber, dateBirthday.Value);
}
private Worker? GetWorkerFromDatabase(string id) =>
TwoFromTheCasketDb.Workers.FirstOrDefault(x => x.Id == id);
private static void AssertElement(Worker? actual, WorkerDataModel expected)
{
Assert.That(actual, Is.Not.Null, "Worker не найден в базе после добавления");
var actualDataModel = new WorkerDataModel(
actual!.Id,
actual.FIO,
actual.SpecializationId,
actual.PhoneNumber,
actual.DateBirthDay
);
Assert.Multiple(() =>
[TearDown]
public void TearDown()
{
Assert.That(actualDataModel.Id, Is.EqualTo(expected.Id));
Assert.That(actualDataModel.FIO, Is.EqualTo(expected.FIO));
Assert.That(actualDataModel.PhoneNumber, Is.EqualTo(expected.PhoneNumber));
Assert.That(actualDataModel.DateBirthDay, Is.EqualTo(expected.DateBirthDay));
Assert.That(actualDataModel.IsCurrent, Is.EqualTo(expected.IsCurrent));
});
}
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Workers\" CASCADE;");
}
private Specialization InsertSpecializationToDatabase(string id, string name = null, double salary = 50000)
{
name ??= $"Повар , {new Random().Next(1, 1000)}";
var specialization = new Specialization
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
Id = id,
SpecializationName = name,
Salary = salary,
IsActual = true,
ChangeDate = DateTime.UtcNow
};
var conf = new SalaryConfiguration { Rate = 100 };
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), conf);
InsertWorkerToDatabase(Guid.NewGuid().ToString(), conf);
TwoFromTheCasketDb.Specializations.Add(specialization);
TwoFromTheCasketDb.SaveChanges();
return specialization;
var list = _workerStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
AssertElement(worker, list.First(x => x.Id == worker.Id));
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _workerStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var conf = new SalaryConfiguration { Rate = 100 };
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), conf);
var element = _workerStorageContract.GetElementById(worker.Id);
AssertElement(worker, element);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
var element = _workerStorageContract.GetElementById(Guid.NewGuid().ToString());
Assert.That(element, Is.Null);
}
[Test]
public void Try_GetElementByFIO_WhenHaveRecord_Test()
{
var conf = new SalaryConfiguration { Rate = 100 };
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), conf, fio: "Иванов Иван");
var element = _workerStorageContract.GetElementByFIO(worker.FIO);
AssertElement(worker, element);
}
[Test]
public void Try_GetElementByFIO_WhenNoRecord_Test()
{
var element = _workerStorageContract.GetElementByFIO("Неизвестный Работник");
Assert.That(element, Is.Null);
}
[Test]
public void Try_AddElement_WhenInvalidPhoneNumber_Test()
{
var spec = InsertSpecializationToDatabase(Guid.NewGuid().ToString());
var conf = new SalaryConfiguration { Rate = 100 };
var workerDataModel = new WorkerDataModel(
Guid.NewGuid().ToString(),
"Иванов И.И.",
spec.Id,
"123",
DateTime.UtcNow.AddYears(-30),
conf,
null
);
Assert.That(() => _workerStorageContract.AddElement(workerDataModel),
Throws.TypeOf<StorageException>()
.With.Message.Contains("Field PhoneNumber is not a phone number"));
}
[Test]
public void Try_AddElement_WhenWorkerIsMinor_Test()
{
var spec = InsertSpecializationToDatabase(Guid.NewGuid().ToString());
var conf = new SalaryConfiguration { Rate = 100 };
var workerDataModel = new WorkerDataModel(
Guid.NewGuid().ToString(),
"Иванов И.И.",
spec.Id,
"+79101234567",
DateTime.Today.AddYears(-15),
conf,
null
);
Assert.That(() => _workerStorageContract.AddElement(workerDataModel),
Throws.TypeOf<StorageException>()
.With.Message.Contains("Minors cannot be hired"));
}
[Test]
public void Try_AddElement_Test()
{
var conf = new SalaryConfiguration { Rate = 100 };
var workerDataModel = CreateWorkerDataModel(Guid.NewGuid().ToString(), conf);
_workerStorageContract.AddElement(workerDataModel);
var element = GetWorkerFromDatabase(workerDataModel.Id);
AssertElement(element, workerDataModel);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSamePhoneNumber_Test()
{
var conf = new SalaryConfiguration { Rate = 100 };
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), conf, phoneNumber: "+79101234567");
var duplicate = CreateWorkerDataModel(Guid.NewGuid().ToString(), conf, phoneNumber: worker.PhoneNumber);
Assert.That(() => _workerStorageContract.AddElement(duplicate),
Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_UpdElement_Test()
{
var conf = new SalaryConfiguration { Rate = 100 };
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), conf);
var updatedWorker = new WorkerDataModel(
worker.Id,
"Новое ФИО",
worker.SpecializationId,
"+79050350505",
worker.DateBirthDay,
conf,
null
);
_workerStorageContract.UpdElement(updatedWorker);
AssertElement(GetWorkerFromDatabase(worker.Id), updatedWorker);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
var spec = InsertSpecializationToDatabase(Guid.NewGuid().ToString());
var conf = new SalaryConfiguration { Rate = 100 };
var worker = CreateWorkerDataModel(Guid.NewGuid().ToString(), conf);
Assert.That(() => _workerStorageContract.UpdElement(worker),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_Test()
{
var conf = new SalaryConfiguration { Rate = 100 };
var worker = InsertWorkerToDatabase(Guid.NewGuid().ToString(), conf);
_workerStorageContract.DelElement(worker.Id);
var element = GetWorkerFromDatabase(worker.Id);
Assert.That(element.IsCurrent, Is.EqualTo(0));
}
[Test]
public void Try_DelElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _workerStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
// New tests for SalaryConfiguration types
[Test]
public void Try_AddElement_WithOvertimeSalaryConfiguration_Test()
{
var spec = InsertSpecializationToDatabase(Guid.NewGuid().ToString());
var conf = new OvertimeSalaryConfiguration { Rate = 100, OvertimeMultiplier = 1.5 };
var worker = CreateWorkerDataModel(Guid.NewGuid().ToString(), conf);
_workerStorageContract.AddElement(worker);
var element = GetWorkerFromDatabase(worker.Id);
var model = _workerStorageContract.GetElementById(worker.Id);
Assert.That(model.ConfigurationModel, Is.TypeOf<OvertimeSalaryConfiguration>());
Assert.That(((OvertimeSalaryConfiguration)model.ConfigurationModel).OvertimeMultiplier, Is.EqualTo(1.5));
}
[Test]
public void Try_AddElement_WithPieceworkSalaryConfiguration_Test()
{
var spec = InsertSpecializationToDatabase(Guid.NewGuid().ToString());
var conf = new PieceworkSalaryConfiguration { Rate = 50, UnitRate = 5, BonusThreshold = 100, BonusPerUnit = 2 };
var worker = CreateWorkerDataModel(Guid.NewGuid().ToString(), conf);
_workerStorageContract.AddElement(worker);
var element = GetWorkerFromDatabase(worker.Id);
var model = _workerStorageContract.GetElementById(worker.Id);
Assert.That(model.ConfigurationModel, Is.TypeOf<PieceworkSalaryConfiguration>());
var pw = (PieceworkSalaryConfiguration)model.ConfigurationModel;
Assert.Multiple(() =>
{
Assert.That(pw.UnitRate, Is.EqualTo(5));
Assert.That(pw.BonusThreshold, Is.EqualTo(100));
Assert.That(pw.BonusPerUnit, Is.EqualTo(2));
});
}
private WorkerDataModel CreateWorkerDataModel(
string id,
SalaryConfiguration configuration,
string fio = "Иванов И.И.",
string phoneNumber = null,
DateTime? dateBirthday = null)
{
var specEntity = InsertSpecializationToDatabase(Guid.NewGuid().ToString());
var specDataModel = new SpecializationDataModel(
specEntity.Id,
specEntity.SpecializationName,
specEntity.Salary,
specEntity.IsActual,
specEntity.ChangeDate
);
return new WorkerDataModel(
id,
fio,
specEntity.Id,
phoneNumber ?? $"+7-999{new Random().Next(1000000, 9999999)}",
dateBirthday ?? DateTime.UtcNow.AddYears(-30),
configuration,
specDataModel
);
}
private Worker? GetWorkerFromDatabase(string id)
=> TwoFromTheCasketDb.Workers.FirstOrDefault(x => x.Id == id);
private static void AssertElement(Worker? actual, WorkerDataModel expected)
{
Assert.That(actual, Is.Not.Null, "Worker not found in DB after operation");
var model = new WorkerDataModel(
actual!.Id,
actual.FIO,
actual.SpecializationId,
actual.PhoneNumber,
actual.DateBirthDay,
actual.Configuration,
null
);
Assert.Multiple(() =>
{
Assert.That(model.Id, Is.EqualTo(expected.Id));
Assert.That(model.FIO, Is.EqualTo(expected.FIO));
Assert.That(model.PhoneNumber, Is.EqualTo(expected.PhoneNumber));
Assert.That(model.DateBirthDay, Is.EqualTo(expected.DateBirthDay));
Assert.That(model.ConfigurationModel.Rate, Is.EqualTo(expected.ConfigurationModel.Rate));
});
}
private Specialization InsertSpecializationToDatabase(
string id,
string name = null,
double salary = 50000)
{
name ??= $"Specialization_{new Random().Next(1, 1000)}";
var specialization = new Specialization
{
Id = id,
SpecializationName = name,
Salary = salary,
IsActual = true,
ChangeDate = DateTime.UtcNow
};
TwoFromTheCasketDb.Specializations.Add(specialization);
TwoFromTheCasketDb.SaveChanges();
return specialization;
}
private Worker InsertWorkerToDatabase(
string id,
SalaryConfiguration? configuration = null,
string specializationId = null,
string fio = "Иванов И.И.",
string phoneNumber = "+79101234567",
DateTime? dateBirthday = null)
{
var config = configuration ?? new SalaryConfiguration { Rate = 0 };
phoneNumber = $"+7999{Random.Shared.Next(1000000, 9999999)}";
var worker = new Worker
{
Id = id,
FIO = fio,
SpecializationId = InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id,
PhoneNumber = phoneNumber,
DateBirthDay = DateTime.UtcNow.AddYears(-30),
ValidFrom = DateTime.UtcNow,
IsCurrent = 1,
Configuration = config
};
TwoFromTheCasketDb.Workers.Add(worker);
TwoFromTheCasketDb.SaveChanges();
return worker;
}
}
}

View File

@@ -1,6 +1,10 @@
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Net;
using System.Text.Json;
using TwoFromTheCasketContracts.BindingModels;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
using TwoFromTheCasketContracts.ViewModels;
using TwoFromTheCasketDatabase.Models;
using TwoFromTheCasketTests.Infrastructure;
@@ -235,17 +239,113 @@ public class WorkerControllerTest : BaseWebApiControllerTest
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
private static WorkerBindingModel CreateBindingModel(string? id = null, string? phoneNumber = null, string? fio = "ФИО", string? specializationId = null, DateTime? validFrom = null)
[Test]
public async Task Try_Register_WithOvertimeConfiguration_Test()
{
var overtime = new OvertimeSalaryConfiguration { Rate = 120, OvertimeMultiplier = 1.75 };
var json = JsonConvert.SerializeObject(overtime);
var model = CreateBindingModel(
id: Guid.NewGuid().ToString(),
specializationId: _specialization.Id,
configurationJson: json
);
var postResp = await HttpClient.PostAsync("api/Worker/Register", MakeContent(model));
Assert.That(postResp.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var getResp = await HttpClient.GetAsync($"api/Worker/GetRecord/{model.FIO}");
Assert.That(getResp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var vm = await GetModelFromResponseAsync<WorkerViewModel>(getResp);
var token = JObject.Parse(vm.Configuration);
var typeName = token.Value<string>("Type");
SalaryConfiguration loaded = typeName switch
{
nameof(OvertimeSalaryConfiguration) => JsonConvert.DeserializeObject<OvertimeSalaryConfiguration>(vm.Configuration)!,
nameof(PieceworkSalaryConfiguration) => JsonConvert.DeserializeObject<PieceworkSalaryConfiguration>(vm.Configuration)!,
_ => JsonConvert.DeserializeObject<SalaryConfiguration>(vm.Configuration)!,
};
Assert.That(loaded, Is.TypeOf<OvertimeSalaryConfiguration>());
Assert.That(((OvertimeSalaryConfiguration)loaded).OvertimeMultiplier, Is.EqualTo(1.75));
}
[Test]
public async Task Try_Register_WithPieceworkConfiguration_Test()
{
var piecework = new PieceworkSalaryConfiguration
{
Rate = 80,
UnitRate = 7,
BonusThreshold = 50,
BonusPerUnit = 1.5
};
var json = JsonConvert.SerializeObject(piecework);
var model = CreateBindingModel(
id: Guid.NewGuid().ToString(),
specializationId: _specialization.Id,
configurationJson: json
);
var postResp = await HttpClient.PostAsync("api/Worker/Register", MakeContent(model));
Assert.That(postResp.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var getResp = await HttpClient.GetAsync($"api/Worker/GetRecord/{model.FIO}");
Assert.That(getResp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var vm = await GetModelFromResponseAsync<WorkerViewModel>(getResp);
var token = JObject.Parse(vm.Configuration);
var typeName = token.Value<string>("Type");
SalaryConfiguration loaded = typeName switch
{
nameof(OvertimeSalaryConfiguration) => JsonConvert.DeserializeObject<OvertimeSalaryConfiguration>(vm.Configuration)!,
nameof(PieceworkSalaryConfiguration) => JsonConvert.DeserializeObject<PieceworkSalaryConfiguration>(vm.Configuration)!,
_ => JsonConvert.DeserializeObject<SalaryConfiguration>(vm.Configuration)!,
};
Assert.That(loaded, Is.TypeOf<PieceworkSalaryConfiguration>());
var pw = (PieceworkSalaryConfiguration)loaded;
Assert.Multiple(() =>
{
Assert.That(pw.UnitRate, Is.EqualTo(7));
Assert.That(pw.BonusThreshold, Is.EqualTo(50));
Assert.That(pw.BonusPerUnit, Is.EqualTo(1.5));
});
}
private static WorkerBindingModel CreateBindingModel(
string? id = null,
string? phoneNumber = null,
string? fio = "ФИО",
string? specializationId = null,
DateTime? validFrom = null,
bool isCurrent = true,
string? configurationJson = null)
{
if (string.IsNullOrEmpty(configurationJson))
{
var defaultConf = new SalaryConfiguration { Rate = 1 };
configurationJson = System.Text.Json.JsonSerializer.Serialize<SalaryConfiguration>(
defaultConf,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
);
}
return new WorkerBindingModel
{
Id = id ?? Guid.NewGuid().ToString(),
FIO = fio!,
PhoneNumber = phoneNumber ?? $"+7999{Random.Shared.Next(1000000, 9999999)}",
DateBirthDay = DateTime.UtcNow.AddYears(-30),
SpecializationId = specializationId,
SpecializationId = specializationId,
ValidFrom = validFrom ?? DateTime.UtcNow,
IsCurrent = true
IsCurrent = isCurrent,
ConfigurationJson = configurationJson
};
}

View File

@@ -1,4 +1,6 @@
using AutoMapper;
using Newtonsoft.Json;
using System.Text.Json;
using TwoFromTheCasketContracts.AdapterContracts;
using TwoFromTheCasketContracts.AdapterContracts.OperationResponses;
using TwoFromTheCasketContracts.BindingModels;
@@ -14,7 +16,7 @@ public class WorkerAdapter : IWorkerAdapter
private readonly IWorkerBusinessLogicContract _workerLogic;
private readonly ILogger _logger;
private readonly Mapper _mapper;
private readonly JsonSerializerOptions JsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
public WorkerAdapter(IWorkerBusinessLogicContract workerLogic, ILogger<WorkerAdapter> logger)
{
_workerLogic = workerLogic;
@@ -23,7 +25,10 @@ public class WorkerAdapter : IWorkerAdapter
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<WorkerBindingModel, WorkerDataModel>();
cfg.CreateMap<WorkerDataModel, WorkerViewModel>();
cfg.CreateMap<WorkerDataModel, WorkerViewModel>()
.ForMember(x => x.Configuration, opt => opt.MapFrom(src =>
JsonConvert.SerializeObject(src.ConfigurationModel)
));
});
_mapper = new Mapper(config);