-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTransactionTaskManagerTest.cs
More file actions
85 lines (66 loc) · 3.23 KB
/
TransactionTaskManagerTest.cs
File metadata and controls
85 lines (66 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System.Linq;
using Bogus;
using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using MosaicoSolutions.GenericRepository.Repositories.Write.Transactions;
using MosaicoSolutions.GenericRepository.Repositories.Write.Transactions.Manager;
using MosaicoSolutions.GenericRepository.Repositories.Write.Transactions.Manager.Interfaces;
using MosaicoSolutions.GenericRepository.Test.Data.Contexts;
using MosaicoSolutions.GenericRepository.Test.Data.Entities;
using Xunit;
namespace MosaicoSolutions.GenericRepository.Test.WriteRepository.Transactions
{
public class TransactionTaskManagerTest
{
private readonly ITransactionTaskManager<WriteBookStoreContext> transactionTaskManager;
private readonly ITransactionalRepository<Author> authorTransactionalRepository;
private readonly Faker<Author> fakerAuthor;
public TransactionTaskManagerTest()
{
transactionTaskManager = new TransactionTaskManager<WriteBookStoreContext>(WriteBookStoreContext.SqlServerDocker);
authorTransactionalRepository = new TransactionalRepository<Author>();
fakerAuthor = new Faker<Author>()
.RuleFor(a => a.FirstName, f => f.Name.FirstName())
.RuleFor(a => a.LastName, f => f.Name.LastName());
}
[Fact]
public void InsertUsingTransaction()
{
var newAuthor = fakerAuthor.Generate();
var insertTask = authorTransactionalRepository.InsertAsTransactionTask(newAuthor);
var transanctionTaskResult = transactionTaskManager.UseTransaction(insertTask);
transanctionTaskResult.Success.Should().BeTrue();
}
[Fact]
public void InsertAndUpdateBooksUsingTransaction()
{
var newAuthor = fakerAuthor.Generate();
var transactionTask = new TransactionTask(dbContext =>
{
var authorDbSet = dbContext.Set<Author>();
var bookDbSet = dbContext.Set<Book>();
authorDbSet.Add(newAuthor);
var authorsInserted = dbContext.SaveChanges();
var firstAuthor = authorDbSet.FirstOrDefault();
var booksFirstAuthor = bookDbSet.AsTracking().Where(b => b.AuthorId == firstAuthor.AuthorId).ToList();
booksFirstAuthor.ForEach(b => b.AuthorId = newAuthor.AuthorId);
var booksUpdated = dbContext.SaveChanges();
});
var transanctionTaskResult = transactionTaskManager.UseTransaction(transactionTask);
transanctionTaskResult.Success.Should().BeTrue();
}
[Fact]
public void RemoveAuthorWithBooksUsingTransaction()
{
var transactionTask = new TransactionTask(dbContext =>
{
var firstAuthor = dbContext.Set<Author>().FirstOrDefault(a => a.Books.Any());
dbContext.Remove(firstAuthor);
dbContext.SaveChanges();
});
var transanctionTaskResult = transactionTaskManager.UseTransaction(transactionTask);
transanctionTaskResult.Failure.Should().BeTrue();
transanctionTaskResult.Exception.Should().BeAssignableTo<DbUpdateException>();
}
}
}