Repository navigation
Expand file tree
/
Copy pathSyncTests.cs
More file actions
117 lines (97 loc) · 4.88 KB
/
Copy pathSyncTests.cs
File metadata and controls
117 lines (97 loc) · 4.88 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
using AutoFixture;
using AutoFixture.AutoMoq;
using Microsoft.Extensions.Logging;
using Moq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PluginModuleBase;
using ProblemSource.Models;
using ProblemSource.Models.Aggregates;
using ProblemSource.Models.LogItems;
using ProblemSource.Services;
using ProblemSource.Services.Storage;
using ProblemSourceModule.Models;
using ProblemSourceModule.Services;
using ProblemSourceModule.Services.Storage;
using Shouldly;
namespace ProblemSource.Tests
{
public class SyncTests
{
private readonly IFixture fixture;
private readonly IDataSink dataSink;
//private readonly IUserStateRepository userStateRepository;
private readonly IBatchRepository<UserGeneratedState> userStateRepository;
private readonly ProblemSourceProcessingMiddleware pipeline;
public SyncTests()
{
fixture = new Fixture().Customize(new AutoMoqCustomization() { ConfigureMembers = true });
dataSink = fixture.Create<IDataSink>();
var mockUserStateRepo = new Mock<IBatchRepository<UserGeneratedState>>();
userStateRepository = mockUserStateRepo.Object;
var mockRepoProvider = new Mock<IUserGeneratedDataRepositoryProvider>();
mockRepoProvider.Setup(o => o.TrainingDays).Returns(new Mock<IBatchRepository<TrainingDayAccount>>().Object);
//var mockRepoProviderFactory = new Mock<IUserGeneratedDataRepositoryProviderFactory>();
//mockRepoProviderFactory.Setup(o => o.Create(It.IsAny<int>())).Returns(mockRepoProvider.Object);
var mockTrainingRepo = new Mock<ITrainingRepository>();
mockTrainingRepo.Setup(o => o.Get(It.IsAny<int>())).ReturnsAsync(() => new Training { TrainingPlanName = "2017 HT template Default" });
var mockClientSessionManager = new Mock<IClientSessionManager>();
mockClientSessionManager.Setup(o => o.GetOrOpenSession(It.IsAny<string>(), It.IsAny<string?>())).Returns(new GetOrCreateSessionResult(new Session("")));
pipeline = new ProblemSourceProcessingMiddleware(new EmbeddedTrainingPlanRepository(),
mockClientSessionManager.Object, dataSink, fixture.Create<IEventDispatcher>(), fixture.Create<IAggregationService>(),
TestHelpers.MockDataRepositoryProviderFactory(userStateRepo: userStateRepository, dataProvider: mockRepoProvider.Object),
new UsernameHashing(new MnemoJapanese(2), 2), new MnemoJapanese(2),
mockTrainingRepo.Object, fixture.Create<TrainingAnalyzerCollection>(),
fixture.Create<ILogger<ProblemSourceProcessingMiddleware>>());
}
[Fact]
public async Task Sync_LogsToDataSinkAndUserStateRepo()
{
// Arrange
var userStatePushLogItem = new UserStatePushLogItem
{
className = nameof(UserStatePushLogItem),
exercise_stats = new ExerciseStats { device = fixture.Create<DeviceInfo>() },
user_data = new { }
};
var originalEvents = new List<object> {
userStatePushLogItem,
new LogItem { className = "unknown" }
};
var input = new SyncInput
{
Uuid = "musa tadube",
Events = originalEvents.ToArray()
};
// Act
var _ = await pipeline.Sync(input, new System.Security.Claims.ClaimsPrincipal());
// Assert
Mock.Get(userStateRepository).Verify(x =>
x.Upsert(It.Is<IEnumerable<UserGeneratedState>>(o => o.Single().exercise_stats.device.uuid == userStatePushLogItem.exercise_stats.device.uuid)), Times.Once);
//DataSink: the UserStatePushLogItem entry is removed
Mock.Get(dataSink).Verify(x =>
x.Log(It.IsAny<string>(), It.Is<object>(o => ((SyncInput)o).Events.Count() == originalEvents.Count() - 1)), Times.Once);
}
[Fact]
public async Task Sync_RequestState_ReturnsTrainingPlan()
{
// Arrange
var input = new SyncInput
{
Uuid = "musa tadube",
Events = new object[0],
RequestState = true,
};
// Act
var result = await pipeline.Sync(input, new System.Security.Claims.ClaimsPrincipal());
// Assert
var state = JsonConvert.DeserializeObject<UserFullState>(result.state);
if (state == null) throw new NullReferenceException(nameof(state));
var trainingPlan = (JObject)state.training_plan;
var metaphor = trainingPlan["metaphor"];
if (metaphor == null) throw new NullReferenceException();
metaphor.Value<string>().ShouldBe("Magical");
state.training_settings.customData?.unlockAllPlanets.ShouldBe(false);
}
}
}