Skip to content

Commit 4bafc3d

Browse files
implemented tests for history
1 parent ded84ad commit 4bafc3d

5 files changed

Lines changed: 103 additions & 26 deletions

File tree

src/Config.SqlStreamStore.Tests/ConfigRepositoryTests.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public async Task Can_delete_existing_settings()
6868
Assert.False(saved.ContainsKey("setting1"));
6969
}
7070

71-
private async Task<ConfigurationSettings> SaveSettings(ModifiedConfigurationSettings settings)
71+
private async Task<IConfigurationSettings> SaveSettings(ModifiedConfigurationSettings settings)
7272
{
7373
await _streamStoreConfigRepository.WriteChanges(settings, CancellationToken.None);
7474

@@ -80,9 +80,9 @@ public async Task Can_subscribe_to_changes()
8080
{
8181
var settings = await SaveSettings(BuildNewSettings());
8282

83-
var tcs = new TaskCompletionSource<ConfigurationSettings>();
83+
var tcs = new TaskCompletionSource<IConfigurationSettings>();
8484

85-
Task OnSettingsChanged(ConfigurationSettings configurationSettings, CancellationToken ct)
85+
Task OnSettingsChanged(IConfigurationSettings configurationSettings, CancellationToken ct)
8686
{
8787
tcs.SetResult(configurationSettings);
8888
return Task.CompletedTask;
@@ -170,6 +170,27 @@ await _streamStoreConfigRepository.Modify(CancellationToken.None,
170170
Assert.Equal("constant", history.Last()["othersetting"]);
171171
}
172172

173+
174+
[Fact]
175+
public async Task Can_get_history_when_maxcount_is_set()
176+
{
177+
const int expectedMaxCount = 5;
178+
await _streamStoreConfigRepository.SetMaxCount(expectedMaxCount, CancellationToken.None);
179+
180+
// write 10 modifications, 0 .. 10
181+
for (int i = 0; i < 10; i++)
182+
{
183+
await _streamStoreConfigRepository.Modify(CancellationToken.None,
184+
("setting", i.ToString()),
185+
("othersetting", "constant")
186+
);
187+
}
188+
189+
var history = await _streamStoreConfigRepository.GetSettingsHistory(CancellationToken.None);
190+
191+
Assert.Equal(expectedMaxCount, history.Count);
192+
}
193+
173194
private static ModifiedConfigurationSettings BuildNewSettings()
174195
{
175196
var settings = new ModifiedConfigurationSettings(

src/Config.SqlStreamStore/ConfigRepository.cs

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,9 @@
1010

1111
namespace Config.SqlStreamStore
1212
{
13-
public interface IStreamStoreConfigRepository
14-
{
15-
Task<ConfigurationSettings> GetLatest(CancellationToken ct);
16-
Task<IConfigurationSettings> WriteChanges(ModifiedConfigurationSettings settings, CancellationToken ct);
17-
18-
IDisposable SubscribeToChanges(int version,
19-
StreamStoreConfigRepository.OnSettingsChanged onSettingsChanged,
20-
CancellationToken ct);
21-
22-
Task<int?> GetMaxCount(CancellationToken ct);
23-
Task SetMaxCount(int maxCount, CancellationToken ct);
24-
}
25-
2613
public class StreamStoreConfigRepository : IStreamStoreConfigRepository
2714
{
28-
public delegate Task OnSettingsChanged(ConfigurationSettings settings, CancellationToken ct);
15+
public delegate Task OnSettingsChanged(IConfigurationSettings settings, CancellationToken ct);
2916

3017
private readonly IStreamStore _streamStore;
3118
private readonly StreamId _streamId;
@@ -36,7 +23,7 @@ public StreamStoreConfigRepository(IStreamStore streamStore, string streamId = C
3623
_streamId = streamId;
3724
}
3825

39-
public async Task<ConfigurationSettings> GetLatest(CancellationToken ct)
26+
public async Task<IConfigurationSettings> GetLatest(CancellationToken ct)
4027
{
4128
var lastPage = await _streamStore.ReadStreamBackwards(
4229
streamId: new StreamId(_streamId),
@@ -53,7 +40,7 @@ public async Task<ConfigurationSettings> GetLatest(CancellationToken ct)
5340
return await BuildConfigurationSettingsFromMessage(lastMessage, ct);
5441
}
5542

56-
private static async Task<ConfigurationSettings> BuildConfigurationSettingsFromMessage(
43+
private static async Task<IConfigurationSettings> BuildConfigurationSettingsFromMessage(
5744
StreamMessage message, CancellationToken ct)
5845
{
5946
var data = await message.GetJsonData(ct);
@@ -182,6 +169,29 @@ void SetupSubscription()
182169
return subscription;
183170
}
184171

172+
173+
public async Task<IConfigurationSettings> GetSpecificVersion(int version, CancellationToken ct)
174+
{
175+
var streamPage = await _streamStore.ReadStreamBackwards(_streamId, version, 1, ct);
176+
177+
if (!streamPage.Messages.Any())
178+
return null;
179+
180+
var msg = streamPage.Messages.First();
181+
182+
return await BuildConfigurationSettingsFromMessage(msg, ct);
183+
}
184+
185+
public async Task RevertToVersion(IConfigurationSettings settings, CancellationToken ct)
186+
{
187+
var latest = await GetLatest(ct);
188+
189+
var modified = latest.WithAllSettingsReplaced(settings);
190+
191+
await WriteChanges(modified, ct);
192+
}
193+
194+
185195
private class DelegateDisposable : IDisposable
186196
{
187197
public readonly Action Action;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
5+
namespace Config.SqlStreamStore
6+
{
7+
public interface IStreamStoreConfigRepository
8+
{
9+
Task<IConfigurationSettings> GetLatest(CancellationToken ct);
10+
Task<IConfigurationSettings> WriteChanges(ModifiedConfigurationSettings settings, CancellationToken ct);
11+
12+
IDisposable SubscribeToChanges(int version,
13+
StreamStoreConfigRepository.OnSettingsChanged onSettingsChanged,
14+
CancellationToken ct);
15+
16+
Task<int?> GetMaxCount(CancellationToken ct);
17+
Task SetMaxCount(int maxCount, CancellationToken ct);
18+
Task<IConfigurationSettings> GetSpecificVersion(int version, CancellationToken ct);
19+
Task RevertToVersion(IConfigurationSettings settings, CancellationToken ct);
20+
}
21+
}

src/Config.SqlStreamStore/StreamStoreConfigurationProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class StreamStoreConfigurationProvider : ConfigurationProvider
1313
{
1414
private readonly StreamStoreConfigurationSource _source;
1515
private readonly IStreamStoreConfigRepository _streamStoreConfigRepository;
16-
private ConfigurationSettings _configurationSettings;
16+
private IConfigurationSettings _configurationSettings;
1717

1818
public StreamStoreConfigurationProvider(StreamStoreConfigurationSource source,
1919
IStreamStoreConfigRepository streamStoreConfigRepository)
@@ -65,7 +65,7 @@ public IDisposable SubscribeToChanges(CancellationToken ct)
6565
ct: CancellationToken.None);
6666
}
6767

68-
private Task OnChanged(ConfigurationSettings settings, CancellationToken ct)
68+
private Task OnChanged(IConfigurationSettings settings, CancellationToken ct)
6969
{
7070
Data = settings.ToDictionary(x => x.Key, x => x.Value, StringComparer.OrdinalIgnoreCase);
7171

src/Config.SqlstreamStore.Example/Program.cs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Data;
33
using System.Data.SqlClient;
4+
using System.Linq;
45
using System.Threading;
56
using System.Threading.Tasks;
67
using Config.SqlStreamStore;
@@ -88,7 +89,10 @@ private static void PrintSettings(IConfigurationRoot sssConfig)
8889

8990
private static async Task CreateDatabase(string connectionString, CancellationToken ct)
9091
{
92+
// There is a while true loop here, because sometimes after creating the db, the db is not available always.
93+
// There are much better ways of handling this, but I couldn't be bothered right now;)
9194
while(true)
95+
{
9296
try
9397
{
9498
await Task.Delay(1000);
@@ -97,8 +101,8 @@ private static async Task CreateDatabase(string connectionString, CancellationTo
97101

98102
var mgr = new DatabaseManager(connectionString);
99103
mgr.EnsureDatabaseExists(10, 10);
100-
101-
await Task.Delay(1000, ct);
104+
105+
await Task.Delay(2000, ct);
102106

103107
var msSqlStreamStoreSettings = new MsSqlStreamStoreSettings(connectionString);
104108

@@ -110,16 +114,37 @@ private static async Task CreateDatabase(string connectionString, CancellationTo
110114

111115
var repo = new StreamStoreConfigRepository(store);
112116

113-
while (!ct.IsCancellationRequested)
117+
Console.WriteLine("Now generating 20 changes:");
118+
119+
for(int i = 0; i < 20; i++)
114120
{
115121
await Task.Delay(1000, ct);
116-
await repo.Modify(ct, ("setting1", DateTime.Now.ToLongTimeString()));
122+
await repo.Modify(ct, ("setting1", "new value, written at: " + DateTime.Now.ToLongTimeString()));
117123
}
124+
125+
// Delay for a while, so the latest version can be printed.
126+
await Task.Delay(1000, ct);
127+
var history = await repo.GetSettingsHistory(ct);
128+
Console.WriteLine($"There have historically been:{history.Count} versions: ");
129+
foreach (var setting in history)
130+
{
131+
Console.WriteLine($"\t- Version: {setting.Version} setting1 = '{setting["setting1"]}'");
132+
}
133+
134+
Console.WriteLine($"Now reverting back to the first version's data: {history.First().Version}");
135+
136+
// Now revert back to the first version (this actually creates a new version, with the old data in it)
137+
await repo.RevertToVersion(history.First(), ct);
138+
139+
140+
// Completed succesfully. End the function
141+
return;
118142
}
119143
catch (Exception ex)
120144
{
121-
Console.WriteLine("error while creating database: " + ex.Message);
145+
Console.WriteLine("error while creating database: " + ex.Message + " (will retry)");
122146
}
147+
}
123148
}
124149
}
125150

0 commit comments

Comments
 (0)