Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Run .NET Tests

on:
push:
pull_request:

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "8.0.x"

- name: Restore dependencies
run: dotnet restore Library.sln

- name: Build
run: dotnet build Library.sln --configuration Release --no-restore

- name: Run tests
run: dotnet test Library.sln --configuration Release --no-build
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -416,3 +416,6 @@ FodyWeavers.xsd
*.msix
*.msm
*.msp

**/bin
**/obj
36 changes: 36 additions & 0 deletions Library.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{50A17DA1-3556-4046-CEDC-33EB466D9C32}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Library.Domain", "Library\Library.Domain\Library.Domain.csproj", "{39E55976-5424-CEC7-0978-4D789AC54AC6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Library.Tests", "Library\Library.Tests\Library.Tests.csproj", "{60F294C7-3D77-63D8-5514-C4AB9BB913BD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{39E55976-5424-CEC7-0978-4D789AC54AC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{39E55976-5424-CEC7-0978-4D789AC54AC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{39E55976-5424-CEC7-0978-4D789AC54AC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{39E55976-5424-CEC7-0978-4D789AC54AC6}.Release|Any CPU.Build.0 = Release|Any CPU
{60F294C7-3D77-63D8-5514-C4AB9BB913BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{60F294C7-3D77-63D8-5514-C4AB9BB913BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{60F294C7-3D77-63D8-5514-C4AB9BB913BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{60F294C7-3D77-63D8-5514-C4AB9BB913BD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{39E55976-5424-CEC7-0978-4D789AC54AC6} = {50A17DA1-3556-4046-CEDC-33EB466D9C32}
{60F294C7-3D77-63D8-5514-C4AB9BB913BD} = {50A17DA1-3556-4046-CEDC-33EB466D9C32}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B2802E6A-D42A-4C1D-8949-77992D768DF6}
EndGlobalSection
EndGlobal
84 changes: 84 additions & 0 deletions Library/Library.Domain/Data/DataSeeder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
using Library.Domain.Models;

namespace Library.Domain.Data;

/// <summary>
/// Класс, содержащий заранее подготовленные тестовые данные
/// </summary>
public class DataSeeder
{

private static readonly DateTime SeedNow = new(2026, 2, 19);

public List<EditionType> EditionTypes { get; } =
[
new EditionType { Id = 1, Name = "Монография" },
new EditionType { Id = 2, Name = "Методическое пособие" },
new EditionType { Id = 3, Name = "Энциклопедия" },
new EditionType { Id = 4, Name = "Биография" },
new EditionType { Id = 5, Name = "Фэнтези" },
new EditionType { Id = 6, Name = "Техническая литература" },
new EditionType { Id = 7, Name = "Публицистика" },
new EditionType { Id = 8, Name = "Поэзия" },
new EditionType { Id = 9, Name = "Психология" },
new EditionType { Id = 10, Name = "Бизнес-литература" },
];

public List<Publisher> Publishers { get; } =
[
new Publisher { Id = 1, Name = "Бином" },
new Publisher { Id = 2, Name = "Инфра-М" },
new Publisher { Id = 3, Name = "Юрайт" },
new Publisher { Id = 4, Name = "ДМК Пресс" },
new Publisher { Id = 5, Name = "Лань" },
new Publisher { Id = 6, Name = "Альпина Паблишер" },
new Publisher { Id = 7, Name = "МИФ" },
new Publisher { Id = 8, Name = "Вильямс" },
new Publisher { Id = 9, Name = "Самокат" },
new Publisher { Id = 10, Name = "Энергия" },
];

public List<Book> Books { get; } =
[
new Book { Id = 1, InventoryNumber = "BK-101", AlphabetCode = "И-101", Authors = "И. Ньютон", Title = "Математические начала", EditionTypeId = 1, PublisherId = 5, Year = 1687 },
new Book { Id = 2, InventoryNumber = "BK-102", AlphabetCode = "Т-210", Authors = "А. Тьюринг", Title = "Вычислительные машины", EditionTypeId = 6, PublisherId = 4, Year = 1936 },
new Book { Id = 3, InventoryNumber = "BK-103", AlphabetCode = "К-310", Authors = "И. Кант", Title = "Критика чистого разума", EditionTypeId = 7, PublisherId = 6, Year = 1781 },
new Book { Id = 4, InventoryNumber = "BK-104", AlphabetCode = "Р-410", Authors = "Д. Роулинг", Title = "Тайная комната", EditionTypeId = 5, PublisherId = 9, Year = 1998 },
new Book { Id = 5, InventoryNumber = "BK-105", AlphabetCode = "М-510", Authors = "М. Портер", Title = "Конкурентная стратегия", EditionTypeId = 10, PublisherId = 7, Year = 1980 },
new Book { Id = 6, InventoryNumber = "BK-106", AlphabetCode = "С-610", Authors = "К. Саган", Title = "Космос", EditionTypeId = 3, PublisherId = 1, Year = 1980 },
new Book { Id = 7, InventoryNumber = "BK-107", AlphabetCode = "Ф-710", Authors = "З. Фрейд", Title = "Толкование сновидений", EditionTypeId = 9, PublisherId = 6, Year = 1899 },
new Book { Id = 8, InventoryNumber = "BK-108", AlphabetCode = "Л-810", Authors = "С. Лем", Title = "Солярис", EditionTypeId = 5, PublisherId = 2, Year = 1961 },
new Book { Id = 9, InventoryNumber = "BK-109", AlphabetCode = "Х-910", Authors = "Ю. Харари", Title = "Sapiens", EditionTypeId = 4, PublisherId = 6, Year = 2011 },
new Book { Id = 10, InventoryNumber = "BK-110", AlphabetCode = "Г-999", Authors = "А. Гауди", Title = "Архитектура форм", EditionTypeId = 1, PublisherId = 10, Year = 1925 },
];

public List<Reader> Readers => new()
{
new Reader { Id = 1, FullName = "Орлов Денис Сергеевич", Address = "ул. Березовая, 12", Phone = "89110000001", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-3)) },
new Reader { Id = 2, FullName = "Мельников Артем Игоревич", Address = "ул. Солнечная, 45", Phone = "89110000002", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddYears(-2)) },
new Reader { Id = 3, FullName = "Белов Кирилл Андреевич", Address = "ул. Полевая, 7", Phone = "89110000003", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-18)) },
new Reader { Id = 4, FullName = "Егорова Марина Олеговна", Address = "ул. Озерная, 21", Phone = "89110000004", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-12)) },
new Reader { Id = 5, FullName = "Тарасов Максим Дмитриевич", Address = "ул. Лесная, 3", Phone = "89110000005", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-10)) },
new Reader { Id = 6, FullName = "Крылова Анастасия Павловна", Address = "ул. Школьная, 9", Phone = "89110000006", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-8)) },
new Reader { Id = 7, FullName = "Никитин Роман Евгеньевич", Address = "ул. Центральная, 15", Phone = "89110000007", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-6)) },
new Reader { Id = 8, FullName = "Волкова Дарья Ильинична", Address = "ул. Мира, 19", Phone = "89110000008", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-5)) },
new Reader { Id = 9, FullName = "Зайцев Павел Николаевич", Address = "ул. Новая, 8", Phone = "89110000009", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-4)) },
new Reader { Id = 10, FullName = "Громова София Артемовна", Address = "ул. Южная, 14", Phone = "89110000010", RegistrationDate = DateOnly.FromDateTime(SeedNow.AddMonths(-2)) },
};

public List<BookIssue> BookIssues => new()
{
new BookIssue { Id = 1, BookId = 1, ReaderId = 1, IssueDate = SeedNow.AddDays(-15), Days = 30 },
new BookIssue { Id = 2, BookId = 2, ReaderId = 1, IssueDate = SeedNow.AddDays(-200), Days = 60 },
new BookIssue { Id = 3, BookId = 3, ReaderId = 2, IssueDate = SeedNow.AddDays(-40), Days = 14 },
new BookIssue { Id = 4, BookId = 4, ReaderId = 2, IssueDate = SeedNow.AddDays(-7), Days = 10 },
new BookIssue { Id = 5, BookId = 5, ReaderId = 3, IssueDate = SeedNow.AddDays(-300), Days = 21 },
new BookIssue { Id = 6, BookId = 6, ReaderId = 4, IssueDate = SeedNow.AddDays(-50), Days = 14 },
new BookIssue { Id = 7, BookId = 7, ReaderId = 5, IssueDate = SeedNow.AddDays(-3), Days = 7 },
new BookIssue { Id = 8, BookId = 8, ReaderId = 6, IssueDate = SeedNow.AddDays(-120), Days = 30 },
new BookIssue { Id = 9, BookId = 9, ReaderId = 7, IssueDate = SeedNow.AddDays(-60), Days = 20 },
new BookIssue { Id = 10, BookId = 10, ReaderId = 8, IssueDate = SeedNow.AddDays(-25), Days = 14 },
new BookIssue { Id = 11, BookId = 1, ReaderId = 9, IssueDate = SeedNow.AddDays(-5), Days = 10 },
new BookIssue { Id = 12, BookId = 2, ReaderId = 10, IssueDate = SeedNow.AddDays(-90), Days = 30 }
};
}
9 changes: 9 additions & 0 deletions Library/Library.Domain/Library.Domain.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>
62 changes: 62 additions & 0 deletions Library/Library.Domain/Models/Book.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
namespace Library.Domain.Models;

/// <summary>
/// Сущность книги из каталога библиотеки
/// </summary>
public class Book
{
/// <summary>
/// Уникальный идентификатор
/// </summary>
public required int Id { get; set; }

/// <summary>
/// Инвентарный номер
/// </summary>
public required string InventoryNumber { get; set; }

/// <summary>
/// Шифр в алфавитном каталоге
/// </summary>
public required string AlphabetCode { get; set; }

/// <summary>
/// Инициалы и фамилии авторов
/// </summary>
public string? Authors { get; set; }

/// <summary>
/// Название
/// </summary>
public required string Title { get; set; }

/// <summary>
/// Идентификатор вида издания
/// </summary>
public required int EditionTypeId { get; set; }

/// <summary>
/// Вид издания
/// </summary>
public EditionType? EditionType { get; set; }

/// <summary>
/// Идентификатор издательства
/// </summary>
public required int PublisherId { get; set; }

/// <summary>
/// Издательство
/// </summary>
public Publisher? Publisher { get; set; }

/// <summary>
/// Год издания
/// </summary>
public required int Year { get; set; }

/// <summary>
/// Записи о выдаче книги
/// </summary>
public ICollection<BookIssue> Issues { get; set; } = [];
}
53 changes: 53 additions & 0 deletions Library/Library.Domain/Models/BookIssue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
namespace Library.Domain.Models;

/// <summary>
/// Сущность выдачи книги читателю с указанием сроков и состояния возврата
/// </summary>
public class BookIssue
{
/// <summary>
/// Уникальный идентификатор
/// </summary>
public required int Id { get; set; }

/// <summary>
/// Идентификатор книги
/// </summary>
public required int BookId { get; set; }

/// <summary>
/// Выданная книга
/// </summary>
public Book? Book { get; set; }

/// <summary>
/// Идентификатор читателя
/// </summary>
public required int ReaderId { get; set; }

/// <summary>
/// Читатель, которому была выдана книга
/// </summary>
public Reader? Reader { get; set; }

/// <summary>
/// Дата выдачи книги
/// </summary>
public required DateTime IssueDate { get; set; }

/// <summary>
/// Количество дней, на которое выдана книга
/// </summary>
public required int Days { get; set; }

/// <summary>
/// Дата возврата книги (IssueDate + Days)
/// </summary>
public DateTime? ReturnDate => IssueDate.AddDays(Days);

/// <summary>
/// Флаг просрочки срока возврата книги
/// </summary>
public bool IsOverdue(DateTime currentDate) =>
ReturnDate == null && currentDate.Date > IssueDate.AddDays(Days).Date;
}
17 changes: 17 additions & 0 deletions Library/Library.Domain/Models/EditionType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace Library.Domain.Models;

/// <summary>
/// Справочник видов издания, используемый для классификации книг
/// </summary>
public class EditionType
{
/// <summary>
/// Уникальный идентификатор
/// </summary>
public required int Id { get; set; }

/// <summary>
/// Наименование вида издания
/// </summary>
public required string Name { get; set; }
}
17 changes: 17 additions & 0 deletions Library/Library.Domain/Models/Publisher.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace Library.Domain.Models;

/// <summary>
/// Справочник издательств, к которым относятся книги
/// </summary>
public class Publisher
{
/// <summary>
/// Уникальный идентификатор
/// </summary>
public required int Id { get; set; }

/// <summary>
/// Наименование издательства
/// </summary>
public required string Name { get; set; }
}
37 changes: 37 additions & 0 deletions Library/Library.Domain/Models/Reader.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace Library.Domain.Models;

/// <summary>
/// Сущность читателя библиотеки с персональными данными и историей выдач
/// </summary>
public class Reader
{
/// <summary>
/// Уникальный идентификатор
/// </summary>
public required int Id { get; set; }

/// <summary>
/// ФИО
/// </summary>
public required string FullName { get; set; }

/// <summary>
/// Адрес
/// </summary>
public string? Address { get; set; }

/// <summary>
/// Телефон
/// </summary>
public required string Phone { get; set; }

/// <summary>
/// Дата регистрации
/// </summary>
public DateOnly? RegistrationDate { get; set; }

/// <summary>
/// Выданные книги
/// </summary>
public ICollection<BookIssue> BookIssues { get; set; } = [];
}
27 changes: 27 additions & 0 deletions Library/Library.Tests/Library.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>

<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Library.Domain\Library.Domain.csproj" />
</ItemGroup>

</Project>
Loading