Skip to content

Commit 7b018ee

Browse files
authored
Merge pull request #1474 from microting/fix/multi-shift-save-and-render
Fix multi-shift (3-5) save + add regression tests
2 parents 6ffbb8b + 3786235 commit 7b018ee

File tree

6 files changed

+781
-27
lines changed

6 files changed

+781
-27
lines changed
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
using System;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.Extensions.Logging;
6+
using Microting.eForm.Infrastructure.Constants;
7+
using Microting.eFormApi.BasePn.Abstractions;
8+
using Microting.eFormApi.BasePn.Infrastructure.Helpers.PluginDbOptions;
9+
using Microting.eFormApi.BasePn.Infrastructure.Database.Entities;
10+
using Microting.TimePlanningBase.Infrastructure.Data.Entities;
11+
using AssignedSiteEntity = Microting.TimePlanningBase.Infrastructure.Data.Entities.AssignedSite;
12+
using NSubstitute;
13+
using NUnit.Framework;
14+
using TimePlanning.Pn.Infrastructure.Helpers;
15+
using TimePlanning.Pn.Infrastructure.Models.Planning;
16+
using TimePlanning.Pn.Infrastructure.Models.Settings;
17+
using TimePlanning.Pn.Services.TimePlanningLocalizationService;
18+
using TimePlanning.Pn.Services.TimePlanningPlanningService;
19+
20+
namespace TimePlanning.Pn.Test;
21+
22+
[TestFixture]
23+
public class PlanningServiceMultiShiftTests : TestBaseSetup
24+
{
25+
private ITimePlanningPlanningService _service;
26+
private IUserService _userService;
27+
private ITimePlanningLocalizationService _localizationService;
28+
private IEFormCoreService _coreService;
29+
private ITimePlanningDbContextHelper _dbContextHelper;
30+
private IPluginDbOptions<TimePlanningBaseSettings> _options;
31+
32+
[SetUp]
33+
public async Task SetUpTest()
34+
{
35+
await base.Setup();
36+
37+
_userService = Substitute.For<IUserService>();
38+
_userService.UserId.Returns(1);
39+
_userService.GetCurrentUserAsync().Returns(new EformUser { Id = 1 });
40+
41+
_localizationService = Substitute.For<ITimePlanningLocalizationService>();
42+
_localizationService.GetString(Arg.Any<string>()).Returns(x => x[0]?.ToString());
43+
44+
_coreService = Substitute.For<IEFormCoreService>();
45+
var core = await GetCore();
46+
_coreService.GetCore().Returns(core);
47+
48+
_dbContextHelper = Substitute.For<ITimePlanningDbContextHelper>();
49+
_dbContextHelper.GetDbContext().Returns(TimePlanningPnDbContext);
50+
51+
_options = Substitute.For<IPluginDbOptions<TimePlanningBaseSettings>>();
52+
_options.Value.Returns(new TimePlanningBaseSettings
53+
{
54+
AutoBreakCalculationActive = "0",
55+
DayOfPayment = 20,
56+
GpsEnabled = "0",
57+
SnapshotEnabled = "0"
58+
});
59+
60+
_service = new TimePlanningPlanningService(
61+
Substitute.For<ILogger<TimePlanningPlanningService>>(),
62+
_options,
63+
TimePlanningPnDbContext,
64+
_dbContextHelper,
65+
_userService,
66+
_localizationService,
67+
null,
68+
_coreService);
69+
}
70+
71+
[Test]
72+
public async Task Update_PersistsAllFiveShifts_RoundTrip()
73+
{
74+
// Arrange — seed AssignedSite + PlanRegistration
75+
var assignedSite = new AssignedSiteEntity
76+
{
77+
SiteId = 900,
78+
CreatedByUserId = 1,
79+
UpdatedByUserId = 1
80+
};
81+
await assignedSite.Create(TimePlanningPnDbContext);
82+
83+
var planning = new PlanRegistration
84+
{
85+
SdkSitId = 900,
86+
Date = DateTime.UtcNow.Date,
87+
CreatedByUserId = 1,
88+
UpdatedByUserId = 1
89+
};
90+
await planning.Create(TimePlanningPnDbContext);
91+
92+
// Build model with 5 shifts:
93+
// Shift 1: 00:00-01:00 (0-60) break 5
94+
// Shift 2: 02:00-03:00 (120-180) break 10
95+
// Shift 3: 04:00-05:00 (240-300) break 15
96+
// Shift 4: 06:00-07:00 (360-420) break 20
97+
// Shift 5: 07:00-08:00 (420-480) break 25
98+
var model = new TimePlanningPlanningPrDayModel
99+
{
100+
Id = planning.Id,
101+
Date = planning.Date,
102+
CommentOffice = "",
103+
PlannedStartOfShift1 = 0, PlannedEndOfShift1 = 60, PlannedBreakOfShift1 = 5,
104+
PlannedStartOfShift2 = 120, PlannedEndOfShift2 = 180, PlannedBreakOfShift2 = 10,
105+
PlannedStartOfShift3 = 240, PlannedEndOfShift3 = 300, PlannedBreakOfShift3 = 15,
106+
PlannedStartOfShift4 = 360, PlannedEndOfShift4 = 420, PlannedBreakOfShift4 = 20,
107+
PlannedStartOfShift5 = 420, PlannedEndOfShift5 = 480, PlannedBreakOfShift5 = 25,
108+
};
109+
110+
// Act
111+
var result = await _service.Update(planning.Id, model);
112+
113+
// Assert
114+
Assert.That(result.Success, Is.True, result.Message);
115+
116+
var reloaded = await TimePlanningPnDbContext.PlanRegistrations
117+
.AsNoTracking()
118+
.FirstAsync(x => x.Id == planning.Id);
119+
120+
Assert.Multiple(() =>
121+
{
122+
Assert.That(reloaded.PlannedStartOfShift1, Is.EqualTo(0));
123+
Assert.That(reloaded.PlannedEndOfShift1, Is.EqualTo(60));
124+
Assert.That(reloaded.PlannedBreakOfShift1, Is.EqualTo(5));
125+
126+
Assert.That(reloaded.PlannedStartOfShift2, Is.EqualTo(120));
127+
Assert.That(reloaded.PlannedEndOfShift2, Is.EqualTo(180));
128+
Assert.That(reloaded.PlannedBreakOfShift2, Is.EqualTo(10));
129+
130+
Assert.That(reloaded.PlannedStartOfShift3, Is.EqualTo(240));
131+
Assert.That(reloaded.PlannedEndOfShift3, Is.EqualTo(300));
132+
Assert.That(reloaded.PlannedBreakOfShift3, Is.EqualTo(15));
133+
134+
Assert.That(reloaded.PlannedStartOfShift4, Is.EqualTo(360));
135+
Assert.That(reloaded.PlannedEndOfShift4, Is.EqualTo(420));
136+
Assert.That(reloaded.PlannedBreakOfShift4, Is.EqualTo(20));
137+
138+
Assert.That(reloaded.PlannedStartOfShift5, Is.EqualTo(420));
139+
Assert.That(reloaded.PlannedEndOfShift5, Is.EqualTo(480));
140+
Assert.That(reloaded.PlannedBreakOfShift5, Is.EqualTo(25));
141+
});
142+
}
143+
}

0 commit comments

Comments
 (0)