Skip to content

Commit d83bc9a

Browse files
committed
Added tests for Registering the Product
1 parent d27d100 commit d83bc9a

File tree

12 files changed

+85
-57
lines changed

12 files changed

+85
-57
lines changed

Sample/Warehouse/Warehouse.Api.Tests/Products/RegisteringProduct/RegisterProductTests.cs

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Net;
3-
using System.Net.Http;
43
using System.Threading.Tasks;
54
using Core.Testing;
65
using FluentAssertions;
@@ -29,22 +28,68 @@ public RegisterProductTests(RegisterProductFixture fixture)
2928
this.fixture = fixture;
3029
}
3130

32-
[Fact]
33-
public async Task ValidRequest_ShouldReturn_OK()
31+
[Theory]
32+
[MemberData(nameof(ValidRequests))]
33+
public async Task ValidRequest_ShouldReturn_201(RegisterProductRequest validRequest)
3434
{
3535
// Given
36-
const string sku = "test";
37-
const string name = "test";
38-
const string description = "test";
39-
var request = new RegisterProductRequest(sku, name, description);
4036

4137
// When
42-
var response = await fixture.Post(request);
38+
var response = await fixture.Post(validRequest);
39+
40+
// Then
41+
response.EnsureSuccessStatusCode()
42+
.StatusCode.Should().Be(HttpStatusCode.Created);
43+
44+
var createdId = await response.GetResultFromJson<Guid>();
45+
createdId.Should().NotBeEmpty();
46+
}
47+
48+
[Theory]
49+
[MemberData(nameof(InvalidRequests))]
50+
public async Task InvalidRequest_ShouldReturn_400(RegisterProductRequest invalidRequest)
51+
{
52+
// Given
53+
54+
// When
55+
var response = await fixture.Post(invalidRequest);
4356

4457
// Then
45-
response.EnsureSuccessStatusCode();
58+
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
59+
}
60+
61+
[Fact]
62+
public async Task RequestForExistingSKUShouldFail_ShouldReturn_409()
63+
{
64+
// Given
65+
var request = new RegisterProductRequest("AA2039485", ValidName, ValidDescription);
66+
67+
var response = await fixture.Post(request);
4668
response.StatusCode.Should().Be(HttpStatusCode.Created);
69+
70+
// When
71+
response = await fixture.Post(request);
72+
73+
// Then
74+
response.StatusCode.Should().Be(HttpStatusCode.Conflict);
4775
}
76+
77+
private const string ValidName = "VALID_NAME";
78+
private static string ValidSKU => $"CC{DateTime.Now.Ticks}";
79+
private const string ValidDescription = "VALID_DESCRIPTION";
80+
81+
public static TheoryData<RegisterProductRequest> ValidRequests = new ()
82+
{
83+
new RegisterProductRequest(ValidSKU, ValidName, ValidDescription),
84+
new RegisterProductRequest(ValidSKU, ValidName, null)
85+
};
86+
87+
public static TheoryData<RegisterProductRequest> InvalidRequests = new()
88+
{
89+
new RegisterProductRequest(null, ValidName, ValidDescription),
90+
new RegisterProductRequest("INVALID_SKU", ValidName, ValidDescription),
91+
new RegisterProductRequest(ValidSKU, null, ValidDescription),
92+
};
4893
}
4994
}
5095
}

Sample/Warehouse/Warehouse.Api.Tests/Warehouse.Api.Tests.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
</ItemGroup>
3434

3535
<ItemGroup>
36-
<Folder Include="Products" />
36+
<Folder Include="Products\GettingProductDetails" />
37+
<Folder Include="Products\GettingProducts" />
3738
</ItemGroup>
3839

3940
<ItemGroup>

Sample/Warehouse/Warehouse.Api.Tests/WarehouseTestWebHostBuilder.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.AspNetCore.Builder;
1+
using Core.WebApi.Middlewares.ExceptionHandling;
2+
using Microsoft.AspNetCore.Builder;
23
using Microsoft.AspNetCore.Hosting;
34
using Microsoft.EntityFrameworkCore;
45
using Microsoft.Extensions.DependencyInjection;
@@ -13,23 +14,23 @@ public static IWebHostBuilder Configure(IWebHostBuilder webHostBuilder)
1314
webHostBuilder
1415
.ConfigureServices(services =>
1516
{
16-
services.AddMvcCore()
17+
services.AddRouting()
1718
.AddAuthorization()
1819
.AddCors()
19-
.AddDataAnnotations()
20-
.AddFormatterMappings();
21-
22-
services.AddWarehouseServices();
20+
.AddWarehouseServices();
2321
})
2422
.Configure(app =>
2523
{
2624
app.UseHttpsRedirection()
25+
.UseMiddleware(typeof(ExceptionHandlingMiddleware))
2726
.UseRouting()
2827
.UseAuthorization()
2928
.UseEndpoints(endpoints => { endpoints.UseWarehouseEndpoints(); });
3029

3130
// Kids, do not try this at home!
32-
app.ApplicationServices.GetRequiredService<WarehouseDBContext>().Database.Migrate();
31+
var database = app.ApplicationServices.GetRequiredService<WarehouseDBContext>().Database;
32+
database.Migrate();
33+
database.ExecuteSqlRaw("TRUNCATE TABLE \"Product\"");
3334
});
3435

3536
return webHostBuilder;

Sample/Warehouse/Warehouse.Api/Program.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
using Core.WebApi.Middlewares.ExceptionHandling;
12
using Microsoft.AspNetCore.Builder;
23
using Microsoft.AspNetCore.Hosting;
34
using Microsoft.Extensions.DependencyInjection;
45
using Microsoft.Extensions.Hosting;
5-
using Microsoft.OpenApi.Models;
66
using Warehouse;
77

88
var builder = Host.CreateDefaultBuilder(args)
@@ -11,25 +11,15 @@
1111
webBuilder
1212
.ConfigureServices(services =>
1313
{
14-
services.AddMvcCore()
15-
.AddApiExplorer()
16-
.AddAuthorization()
14+
services.AddRouting()
1715
.AddCors()
18-
.AddDataAnnotations()
19-
.AddFormatterMappings();
20-
21-
services
22-
.AddWarehouseServices()
23-
.AddSwaggerGen(c =>
24-
{
25-
c.SwaggerDoc("v1", new OpenApiInfo {Title = "Warehouse.Api", Version = "v1"});
26-
});
16+
.AddAuthorization()
17+
.AddWarehouseServices();
2718
})
2819
.Configure(app =>
2920
{
30-
app.UseSwagger()
31-
.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "CashRegisters.Api v1"))
32-
.UseHttpsRedirection()
21+
app.UseHttpsRedirection()
22+
.UseMiddleware(typeof(ExceptionHandlingMiddleware))
3323
.UseRouting()
3424
.UseAuthorization()
3525
.UseEndpoints(endpoints =>

Sample/Warehouse/Warehouse.Api/Warehouse.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
</ItemGroup>
1818

1919
<ItemGroup>
20+
<ProjectReference Include="..\..\..\Core.WebApi\Core.WebApi.csproj" />
2021
<ProjectReference Include="..\Warehouse\Warehouse.csproj" />
2122
</ItemGroup>
2223

Sample/Warehouse/Warehouse.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Warehouse.Api", "Warehouse.
1212
EndProject
1313
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Warehouse.Api.Tests", "Warehouse.Api.Tests\Warehouse.Api.Tests.csproj", "{6E5C1CF1-29FF-408E-9E01-E7109FB2ECA0}"
1414
EndProject
15+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.WebApi", "..\..\Core.WebApi\Core.WebApi.csproj", "{A7A09EBA-0B66-4402-A063-69B47D43A66D}"
16+
EndProject
1517
Global
1618
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1719
Debug|Any CPU = Debug|Any CPU
@@ -20,6 +22,7 @@ Global
2022
GlobalSection(NestedProjects) = preSolution
2123
{DD7FF547-0FF1-4B10-9248-1E2700BA3770} = {F6A27B3D-4018-4E66-A008-3E1280C8C685}
2224
{35632837-CB02-455C-9570-E79E476C1D90} = {F6A27B3D-4018-4E66-A008-3E1280C8C685}
25+
{A7A09EBA-0B66-4402-A063-69B47D43A66D} = {F6A27B3D-4018-4E66-A008-3E1280C8C685}
2326
EndGlobalSection
2427
GlobalSection(ProjectConfigurationPlatforms) = postSolution
2528
{DD7FF547-0FF1-4B10-9248-1E2700BA3770}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -42,5 +45,9 @@ Global
4245
{6E5C1CF1-29FF-408E-9E01-E7109FB2ECA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
4346
{6E5C1CF1-29FF-408E-9E01-E7109FB2ECA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
4447
{6E5C1CF1-29FF-408E-9E01-E7109FB2ECA0}.Release|Any CPU.Build.0 = Release|Any CPU
48+
{A7A09EBA-0B66-4402-A063-69B47D43A66D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
49+
{A7A09EBA-0B66-4402-A063-69B47D43A66D}.Debug|Any CPU.Build.0 = Debug|Any CPU
50+
{A7A09EBA-0B66-4402-A063-69B47D43A66D}.Release|Any CPU.ActiveCfg = Release|Any CPU
51+
{A7A09EBA-0B66-4402-A063-69B47D43A66D}.Release|Any CPU.Build.0 = Release|Any CPU
4552
EndGlobalSection
4653
EndGlobal

Sample/Warehouse/Warehouse/Core/Extensions/HttpExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static async Task ReturnJSON<T>(this HttpContext context, T result, HttpS
4343
{
4444
context.Response.StatusCode = (int)statusCode;
4545

46-
if (result != null)
46+
if (result == null)
4747
return;
4848

4949
await context.Response.WriteAsJsonAsync(result);

Sample/Warehouse/Warehouse/Products/GettingProducts/GetProducts.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static GetProducts Create(string? filter, int? page)
5858
if (page <= 0)
5959
throw new ArgumentOutOfRangeException(nameof(page));
6060

61-
return new GetProducts(filter, page.Value);
61+
return new (filter, page.Value);
6262
}
6363

6464
public void Deconstruct(out string? filter, out int page)

Sample/Warehouse/Warehouse/Products/Primitives/SKU.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static SKU Create(string? value)
1616
{
1717
if (value == null)
1818
throw new ArgumentNullException(nameof(SKU));
19-
if (string.IsNullOrWhiteSpace(value) || Regex.IsMatch(value, "[A-Z]{2,4}[0-9]{4,12}"))
19+
if (string.IsNullOrWhiteSpace(value) || !Regex.IsMatch(value, "[A-Z]{2,4}[0-9]{4,18}"))
2020
throw new ArgumentOutOfRangeException(nameof(SKU));
2121

2222
return new SKU(value);

Sample/Warehouse/Warehouse/Products/Product.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ internal class Product
2323
/// </summary>
2424
public string? Description { get; set; }
2525

26+
// Note: this is needed because we're using SKU DTO.
27+
// It would work if we had just primitives
28+
// Should be fixed in .NET 6
2629
private Product(){}
2730

2831
public Product(Guid id, SKU sku, string name, string? description)

0 commit comments

Comments
 (0)