From d5c0c8a805bc999cf3c82f126f7406b010227230 Mon Sep 17 00:00:00 2001 From: JLdgu Date: Mon, 6 Jul 2026 11:36:45 +0100 Subject: [PATCH 1/2] Add Sim Number and User Name searches to model --- .../Repositories/SimRepositoryTests.cs | 67 ++++++++++++++++++- .../Repositories/SimRepository.cs | 49 ++++++++++---- .../Features/AddItem/AddItemViewModelTests.cs | 4 +- .../Features/Sims/SimsMainViewModelTests.cs | 2 +- .../Features/AddItem/AddItemViewModel.cs | 2 +- .../BaseReport/BaseReportMainViewModel.cs | 2 +- .../Features/Phones/PhonesItemViewModel.cs | 2 +- .../Features/Sims/SimsMainViewModel.cs | 2 +- 8 files changed, 108 insertions(+), 22 deletions(-) diff --git a/PhoneAssistant.Model.Tests/Repositories/SimRepositoryTests.cs b/PhoneAssistant.Model.Tests/Repositories/SimRepositoryTests.cs index 2a4253bd..291067e8 100644 --- a/PhoneAssistant.Model.Tests/Repositories/SimRepositoryTests.cs +++ b/PhoneAssistant.Model.Tests/Repositories/SimRepositoryTests.cs @@ -19,6 +19,7 @@ public async Task GetLatestBillingPeriod_should_return_Latest_when_Sims_exist() _helper.DbContext.Sims.Add(sim1); _helper.DbContext.Sims.Add(sim2); + _helper.DbContext.Sims.Add(sim3); await _helper.DbContext.SaveChangesAsync(); var actual = await _repository.GetLatestBillingPeriod(); @@ -35,7 +36,7 @@ public async Task GetLatestBillingPeriod_should_return_Unknown_when_no_Sims_exis } [Test] - public async Task GetSimNumberAsync_should_return_Sims_for_given_phoneNumber() + public async Task GetSimNumberAsync_should_return_latest_SimNumber_for_given_phoneNumber() { Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 }; Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 }; @@ -43,10 +44,70 @@ public async Task GetSimNumberAsync_should_return_Sims_for_given_phoneNumber() _helper.DbContext.Sims.Add(sim1); _helper.DbContext.Sims.Add(sim2); _helper.DbContext.Sims.Add(sim3); - await _helper.DbContext.SaveChangesAsync(); - string? simNumber = await _repository.GetSimNumberAsync("07814209742"); + string? simNumber = await _repository.GetSimNumber("07814209742"); await Assert.That(simNumber).IsEqualTo("8944122605563572206"); + } + + [Test] + public async Task GetSimsForPhoneNumber_should_return_Sims_for_given_phoneNumber() + { + Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 }; + Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 }; + Sim sim3 = new() { BillingPeriod = "202501", SIMNumber = "8944122605563572207", PhoneNumber = "07814209744", UserName = "Bob Johnson", BroadbandData = 200, TextMessages = 100, VoiceCalls = 40 }; + _helper.DbContext.Sims.Add(sim1); + _helper.DbContext.Sims.Add(sim2); + _helper.DbContext.Sims.Add(sim3); + await _helper.DbContext.SaveChangesAsync(); + + IEnumerable sims = await _repository.GetSimsForPhoneNumber("07814209742"); + + Sim? firstSim = sims.FirstOrDefault(); + await Assert.That(sims).Count().IsEqualTo(2); + await Assert.That(firstSim).IsNotNull(); + await Assert.That(firstSim.BillingPeriod).IsEqualTo("202602"); + } + + [Test] + public async Task GetSimsForSimNumber_should_return_latest_Sims_for_given_SimNumber() + { + Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 }; + Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 }; + Sim sim3 = new() { BillingPeriod = "202603", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 50, TextMessages = 5, VoiceCalls = 3 }; + Sim sim4 = new() { BillingPeriod = "202501", SIMNumber = "8944122605563572207", PhoneNumber = "07814209744", UserName = "Bob Johnson", BroadbandData = 200, TextMessages = 100, VoiceCalls = 40 }; + _helper.DbContext.Sims.Add(sim1); + _helper.DbContext.Sims.Add(sim2); + _helper.DbContext.Sims.Add(sim3); + _helper.DbContext.Sims.Add(sim4); + await _helper.DbContext.SaveChangesAsync(); + + IEnumerable simsFullNumber = await _repository.GetSimsForSimNumber("8944122605563572206"); + + Sim? firstSim = simsFullNumber.FirstOrDefault(); + await Assert.That(simsFullNumber).Count().IsEqualTo(2); + await Assert.That(firstSim).IsNotNull(); + await Assert.That(firstSim.BillingPeriod).IsEqualTo("202603"); + } + + [Test] + public async Task GetSimsForUserName_should_return_latest_Sims_for_given_SimNumber() + { + Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 }; + Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 }; + Sim sim3 = new() { BillingPeriod = "202603", SIMNumber = "8944122605563572206", PhoneNumber = "07814209744", UserName = "Jane Smith", BroadbandData = 50, TextMessages = 5, VoiceCalls = 3 }; + Sim sim4 = new() { BillingPeriod = "202501", SIMNumber = "8944122605563572207", PhoneNumber = "07814209744", UserName = "Bob Johnson", BroadbandData = 200, TextMessages = 100, VoiceCalls = 40 }; + _helper.DbContext.Sims.Add(sim1); + _helper.DbContext.Sims.Add(sim2); + _helper.DbContext.Sims.Add(sim3); + _helper.DbContext.Sims.Add(sim4); + await _helper.DbContext.SaveChangesAsync(); + + IEnumerable simsFullNumber = await _repository.GetSimsForUserName("Jane Smith"); + + Sim? firstSim = simsFullNumber.FirstOrDefault(); + await Assert.That(simsFullNumber).Count().IsEqualTo(2); + await Assert.That(firstSim).IsNotNull(); + await Assert.That(firstSim.BillingPeriod).IsEqualTo("202603"); } } diff --git a/PhoneAssistant.Model/Repositories/SimRepository.cs b/PhoneAssistant.Model/Repositories/SimRepository.cs index 4ce871e8..86fa3004 100644 --- a/PhoneAssistant.Model/Repositories/SimRepository.cs +++ b/PhoneAssistant.Model/Repositories/SimRepository.cs @@ -1,4 +1,6 @@ -using Microsoft.EntityFrameworkCore; +using System.Numerics; + +using Microsoft.EntityFrameworkCore; namespace PhoneAssistant.Model; @@ -6,8 +8,11 @@ public interface ISimRepository { Task CreateAsync(Sim sim); Task GetLatestBillingPeriod(); - Task> GetSim(string phoneNumber); - Task GetSimNumberAsync(string phoneNumber); + Task> GetSimsForPhoneNumber(string phoneNumber); + Task> GetSimsForSimNumber(string simNumber); + Task> GetSimsForUserName(string userName); + + Task GetSimNumber(string phoneNumber); } public sealed class SimRepository(PhoneAssistantDbContext dbContext) : ISimRepository @@ -27,25 +32,45 @@ public async Task GetLatestBillingPeriod() return latestBillingPeriod ?? "Unknown"; } - public async Task> GetSim(string phoneNumber) + public async Task GetSimNumber(string phoneNumber) { - IEnumerable sims = await dbContext.Sims + string? simNumber = await dbContext.Sims .Where(p => p.PhoneNumber == phoneNumber) .OrderByDescending(p => p.BillingPeriod) .AsNoTracking() + .Select(s => s.SIMNumber) + .FirstOrDefaultAsync(); + + return simNumber; + } + + public async Task> GetSimsForPhoneNumber(string phoneNumber) + { + IEnumerable sims = await dbContext.Sims + .Where(p => p.PhoneNumber.Contains(phoneNumber)) + .OrderByDescending(p => p.BillingPeriod) + .AsNoTracking() .ToListAsync(); return sims; } - public async Task GetSimNumberAsync(string phoneNumber) + public async Task> GetSimsForSimNumber(string simNumber) { - string? simNumber = await dbContext.Sims - .Where(p => p.PhoneNumber == phoneNumber) - .OrderByDescending(p => p.BillingPeriod) + IEnumerable sims = await dbContext.Sims + .Where(s => s.SIMNumber.Contains(simNumber)) + .OrderByDescending(s => s.BillingPeriod) .AsNoTracking() - .Select(s => s.SIMNumber) - .FirstOrDefaultAsync(); + .ToListAsync(); + return sims; + } - return simNumber; + public async Task> GetSimsForUserName(string userName) + { + IEnumerable sims = await dbContext.Sims + .Where(s => s.UserName.Contains(userName)) + .OrderByDescending(s => s.BillingPeriod) + .AsNoTracking() + .ToListAsync(); + return sims; } } diff --git a/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs b/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs index d33e5095..c17fc2ac 100644 --- a/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs +++ b/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs @@ -38,7 +38,7 @@ public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneHasSim() { Mock sims = _mocker.GetMock(); #pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type. - sims.Setup(r => r.GetSimNumberAsync("07123456789")).ReturnsAsync((string)null); + sims.Setup(r => r.GetSimNumber("07123456789")).ReturnsAsync((string)null); #pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type. _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); @@ -117,7 +117,7 @@ public async Task OEM_should_change_Model(Manufacturer oem, string model) public async Task OnPhoneNumberChanged_ShouldSetSimNumber_WhenSimExistsAsync() { Mock repository = _mocker.GetMock(); - repository.Setup(r => r.GetSimNumberAsync("07123456789")).ReturnsAsync("sim number"); + repository.Setup(r => r.GetSimNumber("07123456789")).ReturnsAsync("sim number"); _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); diff --git a/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs b/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs index 89c3c666..983da41a 100644 --- a/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs +++ b/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs @@ -63,7 +63,7 @@ public async Task PhoneNumber_changed_should_set_SimNumber_when_SIM_exists() { MockValidator(); Mock baseRepository = _mocker.GetMock(); - baseRepository.Setup(r => r.GetSimNumberAsync("01234567890")).ReturnsAsync("sim number"); + baseRepository.Setup(r => r.GetSimNumber("01234567890")).ReturnsAsync("sim number"); var vm = _mocker.CreateInstance(); vm.NewUser = "Alice"; diff --git a/PhoneAssistant.WPF/Features/AddItem/AddItemViewModel.cs b/PhoneAssistant.WPF/Features/AddItem/AddItemViewModel.cs index 30d513fa..6e8388f2 100644 --- a/PhoneAssistant.WPF/Features/AddItem/AddItemViewModel.cs +++ b/PhoneAssistant.WPF/Features/AddItem/AddItemViewModel.cs @@ -164,7 +164,7 @@ async partial void OnPhoneNumberChanged(string? value) await ValidatePropertyAsync(nameof(PhoneNumber)); - string? simNumber = await _simRepository.GetSimNumberAsync(value); + string? simNumber = await _simRepository.GetSimNumber(value); if (simNumber is null) return; diff --git a/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainViewModel.cs b/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainViewModel.cs index 7f634c73..22353436 100644 --- a/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainViewModel.cs +++ b/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainViewModel.cs @@ -32,7 +32,7 @@ private async Task EnterKey() BaseReportSims.Clear(); - IEnumerable sims = await _repository.GetSim(SearchPhoneNumber); + IEnumerable sims = await _repository.GetSimsForPhoneNumber(SearchPhoneNumber); if (!sims.Any()) return; diff --git a/PhoneAssistant.WPF/Features/Phones/PhonesItemViewModel.cs b/PhoneAssistant.WPF/Features/Phones/PhonesItemViewModel.cs index dde068fa..ea83047e 100644 --- a/PhoneAssistant.WPF/Features/Phones/PhonesItemViewModel.cs +++ b/PhoneAssistant.WPF/Features/Phones/PhonesItemViewModel.cs @@ -211,7 +211,7 @@ async partial void OnPhoneNumberChanged(string value) else { _phone.PhoneNumber = value; - string? simNumber = await _simRepository.GetSimNumberAsync(value); + string? simNumber = await _simRepository.GetSimNumber(value); if (simNumber is not null) { _phone.SimNumber = simNumber; diff --git a/PhoneAssistant.WPF/Features/Sims/SimsMainViewModel.cs b/PhoneAssistant.WPF/Features/Sims/SimsMainViewModel.cs index 2f41c438..277d8458 100644 --- a/PhoneAssistant.WPF/Features/Sims/SimsMainViewModel.cs +++ b/PhoneAssistant.WPF/Features/Sims/SimsMainViewModel.cs @@ -25,7 +25,7 @@ async partial void OnPhoneNumberChanged(string? value) { await ValidatePropertyAsync(nameof(PhoneNumber)); - SimNumber = await _simRepository.GetSimNumberAsync(PhoneNumber!); + SimNumber = await _simRepository.GetSimNumber(PhoneNumber!); } [ObservableProperty] From 281e54a0bf148ff73ecbf21d1ab03c0d6329d09a Mon Sep 17 00:00:00 2001 From: JLdgu Date: Mon, 6 Jul 2026 13:06:22 +0100 Subject: [PATCH 2/2] Add Sim Number and User Name to Base Report view --- .../BaseReport/BaseReportMainView.xaml | 67 ++++++++++++++----- .../BaseReport/BaseReportMainView.xaml.cs | 41 +++++++++--- .../BaseReport/BaseReportMainViewModel.cs | 38 +++++++++-- 3 files changed, 117 insertions(+), 29 deletions(-) diff --git a/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainView.xaml b/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainView.xaml index 8225c18c..77309f9f 100644 --- a/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainView.xaml +++ b/PhoneAssistant.WPF/Features/BaseReport/BaseReportMainView.xaml @@ -38,19 +38,48 @@ Text="{Binding LatestImport}" TextAlignment="Right" /> - - - - - + + + + + + + + + + + + + + + + + - + IsReadOnly="True"> + + + + +