-
Notifications
You must be signed in to change notification settings - Fork 492
Expand file tree
/
Copy pathSignContractTests.cs
More file actions
118 lines (97 loc) · 4.94 KB
/
SignContractTests.cs
File metadata and controls
118 lines (97 loc) · 4.94 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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
namespace EvolutionaryArchitecture.Fitnet.IntegrationTests.Contracts.SignContract;
using EvolutionaryArchitecture.Fitnet.Contracts;
using EvolutionaryArchitecture.Fitnet.Contracts.PrepareContract;
using EvolutionaryArchitecture.Fitnet.Contracts.SignContract;
using PrepareContract;
using Common.TestEngine.Configuration;
using Fitnet.Contracts.SignContract.Events;
using EvolutionaryArchitecture.Fitnet.Common.Events.EventBus;
using Microsoft.AspNetCore.Mvc;
public sealed class SignContractTests : IClassFixture<WebApplicationFactory<Program>>, IClassFixture<DatabaseContainer>, IAsyncLifetime
{
private readonly HttpClient _applicationHttpClient;
private readonly IEventBus _fakeEventBus = Substitute.For<IEventBus>();
private readonly WebApplicationFactory<Program> _applicationInMemoryFactory;
public SignContractTests(WebApplicationFactory<Program> applicationInMemoryFactory,
DatabaseContainer database)
{
_applicationInMemoryFactory = applicationInMemoryFactory;
_applicationHttpClient = applicationInMemoryFactory
.WithFakeEventBus(_fakeEventBus)
.WithContainerDatabaseConfigured(database.ConnectionString!)
.CreateClient();
}
public Task InitializeAsync() => Task.CompletedTask;
public async Task DisposeAsync()
{
_applicationHttpClient.Dispose();
await _applicationInMemoryFactory.DisposeAsync();
}
[Fact]
internal async Task Given_valid_contract_signature_request_Then_should_return_no_content_status_code()
{
// Arrange
var preparedContractId = await PrepareContract();
var requestParameters = SignContractRequestParameters.GetValid(preparedContractId);
var signContractRequest = new SignContractRequest(requestParameters.SignedAt);
// Act
using var signContractResponse =
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);
// Assert
signContractResponse.StatusCode.ShouldBe(HttpStatusCode.NoContent);
}
[Fact]
internal async Task Given_valid_contract_signature_request_Then_contract_signed_event_was_published()
{
// Arrange
var preparedContractId = await PrepareContract();
var requestParameters = SignContractRequestParameters.GetValid(preparedContractId);
var signContractRequest = new SignContractRequest(requestParameters.SignedAt);
// Act
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);
// Assert
EnsureThatContractSignedEventWasPublished();
}
private void EnsureThatContractSignedEventWasPublished() => _fakeEventBus.Received(1)
.PublishAsync(Arg.Any<ContractSignedEvent>(), Arg.Any<CancellationToken>());
[Fact]
internal async Task Given_contract_signature_request_with_not_existing_id_Then_should_return_not_found()
{
// Arrange
var requestParameters = SignContractRequestParameters.GetWithNotExistingContractId();
var signContractRequest = new SignContractRequest(requestParameters.SignedAt);
// Act
using var signContractResponse =
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);
// Assert
signContractResponse.StatusCode.ShouldBe(HttpStatusCode.NotFound);
}
[Fact]
internal async Task
Given_contract_signature_request_with_invalid_signed_date_Then_should_return_conflict_status_code()
{
// Arrange
var preparedContractId = await PrepareContract();
var requestParameters =
SignContractRequestParameters.GetWithInvalidSignedAtDate(preparedContractId);
var signContractRequest = new SignContractRequest(requestParameters.SignedAt);
// Act
using var signContractResponse =
await _applicationHttpClient.PatchAsJsonAsync(requestParameters.Url, signContractRequest);
// Assert
signContractResponse.StatusCode.ShouldBe(HttpStatusCode.Conflict);
var responseMessage = await signContractResponse.Content.ReadFromJsonAsync<ProblemDetails>();
responseMessage?.Status.ShouldBe((int)HttpStatusCode.Conflict);
responseMessage?.Title.ShouldBe("Contract can not be signed because more than 30 days have passed from the contract preparation");
}
private async Task<Guid> PrepareContract()
{
var requestParameters = PrepareContractRequestParameters.GetValid();
PrepareContractRequest prepareContractRequest = new PrepareContractRequestFaker(requestParameters.MinAge,
requestParameters.MaxAge, requestParameters.MinHeight, requestParameters.MaxHeight);
using var prepareContractResponse =
await _applicationHttpClient.PostAsJsonAsync(ContractsApiPaths.Prepare, prepareContractRequest);
var preparedContractId = await prepareContractResponse.Content.ReadFromJsonAsync<Guid>();
return preparedContractId;
}
}