|
1 | 1 | // Copyright (c) Martin Costello, 2012-2018. All rights reserved.
|
2 | 2 | // Licensed under the Apache 2.0 license. See the LICENSE file in the project root for full license information.
|
3 | 3 |
|
4 |
| -using System; |
5 |
| -using System.Collections.Generic; |
6 |
| -using System.Threading.Tasks; |
7 | 4 | using MartinCostello.SqlLocalDb;
|
8 | 5 | using Microsoft.EntityFrameworkCore;
|
9 | 6 | using Microsoft.Extensions.Logging;
|
10 | 7 | using NodaTime;
|
11 | 8 | using NodaTime.Testing;
|
12 | 9 | using TodoApp.Data;
|
13 |
| -using Xunit; |
14 |
| -using Xunit.Abstractions; |
15 | 10 |
|
16 |
| -namespace TodoApp.Tests |
| 11 | +namespace TodoApp.Tests; |
| 12 | + |
| 13 | +public class TodoRepositoryTests |
17 | 14 | {
|
18 |
| - public class TodoRepositoryTests |
| 15 | + public TodoRepositoryTests(ITestOutputHelper outputHelper) |
19 | 16 | {
|
20 |
| - public TodoRepositoryTests(ITestOutputHelper outputHelper) |
21 |
| - { |
22 |
| - LoggerFactory = outputHelper.ToLoggerFactory(); |
23 |
| - } |
| 17 | + LoggerFactory = outputHelper.ToLoggerFactory(); |
| 18 | + } |
24 | 19 |
|
25 |
| - private ILoggerFactory LoggerFactory { get; } |
| 20 | + private ILoggerFactory LoggerFactory { get; } |
26 | 21 |
|
27 |
| - [SkippableFact] |
28 |
| - public async Task Can_Create_Update_And_Delete_Todo_Items() |
29 |
| - { |
30 |
| - // Arrange |
31 |
| - Skip.IfNot( |
32 |
| - OperatingSystem.IsWindows(), |
33 |
| - "This test can only be run on Windows."); |
| 22 | + [SkippableFact] |
| 23 | + public async Task Can_Create_Update_And_Delete_Todo_Items() |
| 24 | + { |
| 25 | + // Arrange |
| 26 | + Skip.IfNot( |
| 27 | + OperatingSystem.IsWindows(), |
| 28 | + "This test can only be run on Windows."); |
34 | 29 |
|
35 |
| - var now = new DateTimeOffset(2018, 08, 12, 10, 41, 0, TimeSpan.Zero); |
36 |
| - var clock = new FakeClock(Instant.FromDateTimeOffset(now)); |
| 30 | + var now = new DateTimeOffset(2018, 08, 12, 10, 41, 0, TimeSpan.Zero); |
| 31 | + var clock = new FakeClock(Instant.FromDateTimeOffset(now)); |
37 | 32 |
|
38 |
| - var options = new SqlLocalDbOptions() |
39 |
| - { |
40 |
| - AutomaticallyDeleteInstanceFiles = true, |
41 |
| - StopOptions = StopInstanceOptions.NoWait, |
42 |
| - StopTimeout = TimeSpan.FromSeconds(1), |
43 |
| - }; |
| 33 | + var options = new SqlLocalDbOptions() |
| 34 | + { |
| 35 | + AutomaticallyDeleteInstanceFiles = true, |
| 36 | + StopOptions = StopInstanceOptions.NoWait, |
| 37 | + StopTimeout = TimeSpan.FromSeconds(1), |
| 38 | + }; |
44 | 39 |
|
45 |
| - using var localDB = new SqlLocalDbApi(options, LoggerFactory); |
46 |
| - using TemporarySqlLocalDbInstance instance = localDB.CreateTemporaryInstance(deleteFiles: true); |
| 40 | + using var localDB = new SqlLocalDbApi(options, LoggerFactory); |
| 41 | + using TemporarySqlLocalDbInstance instance = localDB.CreateTemporaryInstance(deleteFiles: true); |
47 | 42 |
|
48 |
| - var builder = new DbContextOptionsBuilder<TodoContext>() |
49 |
| - .UseSqlServer(instance.ConnectionString); |
| 43 | + var builder = new DbContextOptionsBuilder<TodoContext>() |
| 44 | + .UseSqlServer(instance.ConnectionString); |
50 | 45 |
|
51 |
| - using var context = new TodoContext(builder.Options); |
52 |
| - await context.Database.MigrateAsync(); |
| 46 | + using var context = new TodoContext(builder.Options); |
| 47 | + await context.Database.MigrateAsync(); |
53 | 48 |
|
54 |
| - var target = new TodoRepository(clock, context); |
| 49 | + var target = new TodoRepository(clock, context); |
55 | 50 |
|
56 |
| - // Act - Verify the repository is empty |
57 |
| - IList<TodoItem> items = await target.GetItemsAsync(); |
| 51 | + // Act - Verify the repository is empty |
| 52 | + IList<TodoItem> items = await target.GetItemsAsync(); |
58 | 53 |
|
59 |
| - // Assert |
60 |
| - Assert.NotNull(items); |
61 |
| - Assert.Empty(items); |
| 54 | + // Assert |
| 55 | + Assert.NotNull(items); |
| 56 | + Assert.Empty(items); |
62 | 57 |
|
63 |
| - // Arrange - Add a new item |
64 |
| - string text = "Buy cheese"; |
| 58 | + // Arrange - Add a new item |
| 59 | + string text = "Buy cheese"; |
65 | 60 |
|
66 |
| - // Act |
67 |
| - TodoItem item = await target.AddItemAsync(text); |
| 61 | + // Act |
| 62 | + TodoItem item = await target.AddItemAsync(text); |
68 | 63 |
|
69 |
| - // Assert |
70 |
| - Assert.NotNull(item); |
71 |
| - Assert.NotEqual(Guid.Empty, item.Id); |
72 |
| - Assert.Equal(text, item.Text); |
73 |
| - Assert.Equal(now, item.CreatedAt); |
74 |
| - Assert.Null(item.CompletedAt); |
| 64 | + // Assert |
| 65 | + Assert.NotNull(item); |
| 66 | + Assert.NotEqual(Guid.Empty, item.Id); |
| 67 | + Assert.Equal(text, item.Text); |
| 68 | + Assert.Equal(now, item.CreatedAt); |
| 69 | + Assert.Null(item.CompletedAt); |
75 | 70 |
|
76 |
| - // Arrange - Mark the item as completed |
77 |
| - Guid id = item.Id; |
| 71 | + // Arrange - Mark the item as completed |
| 72 | + Guid id = item.Id; |
78 | 73 |
|
79 |
| - // Act |
80 |
| - bool? completeResult = await target.CompleteItemAsync(id); |
| 74 | + // Act |
| 75 | + bool? completeResult = await target.CompleteItemAsync(id); |
81 | 76 |
|
82 |
| - // Assert |
83 |
| - Assert.True(completeResult); |
| 77 | + // Assert |
| 78 | + Assert.True(completeResult); |
84 | 79 |
|
85 |
| - // Act - Verify the repository has one item that is completed |
86 |
| - items = await target.GetItemsAsync(); |
| 80 | + // Act - Verify the repository has one item that is completed |
| 81 | + items = await target.GetItemsAsync(); |
87 | 82 |
|
88 |
| - // Assert |
89 |
| - Assert.NotNull(items); |
90 |
| - Assert.NotEmpty(items); |
91 |
| - Assert.Equal(1, items.Count); |
| 83 | + // Assert |
| 84 | + Assert.NotNull(items); |
| 85 | + Assert.NotEmpty(items); |
| 86 | + Assert.Equal(1, items.Count); |
92 | 87 |
|
93 |
| - item = items[0]; |
94 |
| - Assert.NotNull(item); |
95 |
| - Assert.NotEqual(Guid.Empty, item.Id); |
96 |
| - Assert.Equal(text, item.Text); |
97 |
| - Assert.Equal(now, item.CreatedAt); |
98 |
| - Assert.Equal(now, item.CompletedAt); |
| 88 | + item = items[0]; |
| 89 | + Assert.NotNull(item); |
| 90 | + Assert.NotEqual(Guid.Empty, item.Id); |
| 91 | + Assert.Equal(text, item.Text); |
| 92 | + Assert.Equal(now, item.CreatedAt); |
| 93 | + Assert.Equal(now, item.CompletedAt); |
99 | 94 |
|
100 |
| - // Act - Delete the item |
101 |
| - bool deleteResult = await target.DeleteItemAsync(id); |
| 95 | + // Act - Delete the item |
| 96 | + bool deleteResult = await target.DeleteItemAsync(id); |
102 | 97 |
|
103 |
| - // Assert |
104 |
| - Assert.True(deleteResult); |
| 98 | + // Assert |
| 99 | + Assert.True(deleteResult); |
105 | 100 |
|
106 |
| - // Act - Verify the repository is empty again |
107 |
| - items = await target.GetItemsAsync(); |
| 101 | + // Act - Verify the repository is empty again |
| 102 | + items = await target.GetItemsAsync(); |
108 | 103 |
|
109 |
| - // Assert |
110 |
| - Assert.NotNull(items); |
111 |
| - Assert.Empty(items); |
112 |
| - } |
| 104 | + // Assert |
| 105 | + Assert.NotNull(items); |
| 106 | + Assert.Empty(items); |
113 | 107 | }
|
114 | 108 | }
|
0 commit comments