diff --git a/Directory.Packages.props b/Directory.Packages.props index 5faf22f..49b280c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -35,7 +35,7 @@ - + diff --git a/PhoneAssistant.Tests/Features/AddItem/AddItemValidatorTests.cs b/PhoneAssistant.Tests/Features/AddItem/AddItemValidatorTests.cs index a9de5d1..3d63e7d 100644 --- a/PhoneAssistant.Tests/Features/AddItem/AddItemValidatorTests.cs +++ b/PhoneAssistant.Tests/Features/AddItem/AddItemValidatorTests.cs @@ -1,4 +1,5 @@ -using FluentValidation.TestHelper; +using FluentValidation; +using FluentValidation.TestHelper; using Moq; using Moq.AutoMock; @@ -17,6 +18,12 @@ public sealed class AddItemValidatorTests public AddItemValidatorTests() { _mocker = new AutoMocker(); + Mock phones = _mocker.GetMock(); + var validator = new AddItemValidator(phones.Object); + var serviceProviderMock = _mocker.GetMock(); + serviceProviderMock + .Setup(sp => sp.GetService(typeof(IValidator))) + .Returns(validator); _validator = _mocker.CreateInstance(); _sut = _mocker.CreateInstance(); } diff --git a/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs b/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs index e18342b..1dc8afe 100644 --- a/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs +++ b/PhoneAssistant.Tests/Features/AddItem/AddItemViewModelTests.cs @@ -1,52 +1,46 @@ -using System.ComponentModel; -using System.ComponentModel.DataAnnotations; - using CommunityToolkit.Mvvm.Messaging; - using FluentValidation; - using Moq; using Moq.AutoMock; - using PhoneAssistant.Model; using PhoneAssistant.Tests.Shared; using PhoneAssistant.WPF.Features.AddItem; +using System.ComponentModel; namespace PhoneAssistant.Tests.Features.AddItem; public partial class AddItemViewModelTests { private readonly AutoMocker _mocker = new(); - [Test] - public async Task AddItemViewModel_DefaultOEMAndModelAsync() + private Mock MockValidator() { - AddItemViewModel sut = _mocker.CreateInstance(); - - await Assert.That((Manufacturer)sut.OEM).IsEqualTo(Manufacturer.Apple); - await Assert.That(sut.Model).IsEqualTo("iPhone SE 2022"); + Mock phones = _mocker.GetMock(); + var validator = new AddItemValidator(phones.Object); + var serviceProviderMock = _mocker.GetMock(); + serviceProviderMock + .Setup(sp => sp.GetService(typeof(IValidator))) + .Returns(validator); + return phones; } [Test] - [Arguments(Manufacturer.Apple,"iPhone SE 2022")] - [Arguments(Manufacturer.Nokia, "110 4G")] - [Arguments(Manufacturer.Other, "")] - [Arguments(Manufacturer.Samsung, "A32")] - public async Task OnOEMChanged_ShouldChangeModelAsync(Manufacturer oem, string model) + public async Task AddItemViewModel_DefaultOEMAndModel() { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); - sut.OEM = oem; - - await Assert.That(sut.Model).IsEqualTo(model); + await Assert.That((Manufacturer)sut.OEM).IsEqualTo(Manufacturer.Apple); + await Assert.That(sut.Model).IsEqualTo("iPhone SE 2022"); } [Test] - public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneHasSimAsync() + 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); #pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type. + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.Condition = "condition"; @@ -63,13 +57,8 @@ public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneHasSimAsync [Test] public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneInStockAsync() { - Mock phones = _mocker.GetMock(); + var phones = MockValidator(); phones.Setup(r => r.AssetTagUniqueAsync("MP00001")).ReturnsAsync(true); - var validator = new AddItemValidator(phones.Object); - var serviceProviderMock = _mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); AddItemViewModel sut = _mocker.CreateInstance(); sut.AssetTag = "MP00001"; @@ -84,8 +73,9 @@ public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneInStockAsyn } [Test] - public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneOnlyAsync() + public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneOnly() { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.Condition = "condition"; @@ -97,104 +87,82 @@ public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneOnlyAsync() await Assert.That(sut.CanSavePhone()).IsTrue(); } - [Test] - [Arguments("12345")] - [Arguments("12345678")] - [Arguments("1A345")] - public async Task Ticket_should_have_Error_when_invalid_format(string ticket) - { - Mock phones = _mocker.GetMock(); - var validator = new AddItemValidator(phones.Object); - var serviceProviderMock = _mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); - AddItemViewModel sut = _mocker.CreateInstance(); + //[Test] + //public async Task Imei_should_not_have_Error_when_present() + //{ + // AddItemViewModel sut = _mocker.CreateInstance(); - sut.Ticket = ticket; + // sut.Imei = "355808981147090"; - await Assert.That(sut.HasErrors).IsTrue(); - await Assert.That(sut.GetErrors(nameof(sut.Ticket))).IsNotEmpty(); - } + // await Assert.That(sut.GetErrors(nameof(sut.Imei))).IsEmpty(); + //} - [Test] - [Arguments(null)] - [Arguments("")] - public async Task Ticket_should_not_have_Error_when_Null_or_empty(string? actual) - { - Mock phones = _mocker.GetMock(); - var validator = new AddItemValidator(phones.Object); - var serviceProviderMock = _mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); - AddItemViewModel sut = _mocker.CreateInstance(); + //[Test] + //[Arguments(null)] + //[Arguments("")] + //public async Task PhoneNumber_should_not_have_Error_when_Null_or_empty(string? actual) + //{ + // AddItemViewModel sut = _mocker.CreateInstance(); - sut.Ticket = actual; + // sut.PhoneNumber = actual; - await Assert.That(sut.GetErrors(nameof(sut.Ticket))).IsEmpty(); - } - - [Test] - public async Task Imei_should_not_have_Error_when_present() - { - AddItemViewModel sut = _mocker.CreateInstance(); + // await Assert.That(sut.GetErrors(nameof(sut.PhoneNumber))).IsEmpty(); + //} - sut.Imei = "355808981147090"; + //[Test] + //public async Task PhoneNumber_should_not_have_Error_when_present() + //{ + // AddItemViewModel sut = _mocker.CreateInstance(); - await Assert.That(sut.GetErrors(nameof(sut.Imei))).IsEmpty(); - } + // sut.PhoneNumber = "07123456789"; - [Test] - [Arguments(null)] - [Arguments("")] - public async Task PhoneNumber_should_not_have_Error_when_Null_or_empty(string? actual) - { - AddItemViewModel sut = _mocker.CreateInstance(); + // await Assert.That(sut.GetErrors(nameof(sut.PhoneNumber))).IsEmpty(); + //} - sut.PhoneNumber = actual; + //[Test] + //public async Task GetErrors_ShouldBeEmpty_WhenSimNumberNullAsync() + //{ + // AddItemViewModel sut = _mocker.CreateInstance(); - await Assert.That(sut.GetErrors(nameof(sut.PhoneNumber))).IsEmpty(); - } + // sut.SimNumber = null; - [Test] - public async Task PhoneNumber_should_not_have_Error_when_present() - { - AddItemViewModel sut = _mocker.CreateInstance(); - - sut.PhoneNumber = "07123456789"; + // await Assert.That(sut.GetErrors(nameof(sut.SimNumber))).IsEmpty(); + //} - await Assert.That(sut.GetErrors(nameof(sut.PhoneNumber))).IsEmpty(); - } - - [Test] - public async Task GetErrors_ShouldBeEmpty_WhenSimNumberNullAsync() - { - AddItemViewModel sut = _mocker.CreateInstance(); + //[Test] + //public async Task GetErrors_ShouldBeEmpty_WhenSimNumberSetAsync() + //{ + // AddItemViewModel sut = _mocker.CreateInstance(); - sut.SimNumber = null; + // sut.SimNumber = "8944122605566849402"; - await Assert.That(sut.GetErrors(nameof(sut.SimNumber))).IsEmpty(); - } + // await Assert.That(sut.GetErrors(nameof(sut.SimNumber))).IsEmpty(); + //} [Test] - public async Task GetErrors_ShouldBeEmpty_WhenSimNumberSetAsync() + public async Task LoadAsync_ShouldReturn_TaskCompleted() { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); - sut.SimNumber = "8944122605566849402"; + Task result = sut.LoadAsync(); - await Assert.That(sut.GetErrors(nameof(sut.SimNumber))).IsEmpty(); + await Assert.That(result).IsCompleted(); } [Test] - public async Task LoadAsync_ShouldReturn_TaskCompleted() + [Arguments(Manufacturer.Apple, "iPhone SE 2022")] + [Arguments(Manufacturer.Nokia, "110 4G")] + [Arguments(Manufacturer.Other, "")] + [Arguments(Manufacturer.Samsung, "A32")] + public async Task OEM_should_change_Model(Manufacturer oem, string model) { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); - Task result = sut.LoadAsync(); + sut.OEM = oem; - await Assert.That(result).IsCompleted(); + await Assert.That(sut.Model).IsEqualTo(model); } [Test] @@ -202,6 +170,7 @@ public async Task OnPhoneNumberChanged_ShouldSetSimNumber_WhenSimExistsAsync() { Mock repository = _mocker.GetMock(); repository.Setup(r => r.GetSimNumberAsync("07123456789")).ReturnsAsync("sim number"); + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.PhoneNumber = "07123456789"; @@ -213,12 +182,7 @@ public async Task OnPhoneNumberChanged_ShouldSetSimNumber_WhenSimExistsAsync() [Test] public async Task PhoneClearCommand_ShouldDisablePhoneSaveAsync() { - Mock repository = _mocker.GetMock(); - var validator = new AddItemValidator(repository.Object); - var serviceProviderMock = _mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.PhoneClearCommand.Execute(null); @@ -229,6 +193,7 @@ public async Task PhoneClearCommand_ShouldDisablePhoneSaveAsync() [Test] public async Task PhoneClearCommand_ShouldResetAllPropertiesAsync() { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); ArrangeSetAllPhoneProperties(sut); @@ -240,8 +205,9 @@ public async Task PhoneClearCommand_ShouldResetAllPropertiesAsync() [Test] [Description("Issue #65")] - public async Task PhoneSaveCommand_WithConditionN_ShouldLogNewAsync() + public async Task PhoneSaveCommand_should_Log_New_when_Condition_N() { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.Condition = ApplicationConstants.Conditions[0][..1]; @@ -255,11 +221,12 @@ public async Task PhoneSaveCommand_WithConditionN_ShouldLogNewAsync() var actual = sut.LogItems.First(); await Assert.That(actual).Contains("New"); } - + [Test] [Description("Issue #65")] - public async Task PhoneSaveCommand_WithConditionR_ShouldLogRepurposedAsync() + public async Task PhoneSaveCommand_should_Log_Repurposed_when_Condition_R() { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.Condition = ApplicationConstants.Conditions[1].Substring(0, 1); @@ -290,14 +257,9 @@ public async Task PhoneSaveCommand_WithPhoneAndSim_ShouldCallRepositoryAsync() OEM = Manufacturer.Apple, Status = "status" }; - Mock repository = _mocker.GetMock(); + var repository = MockValidator(); repository.Setup(r => r.AssetTagUniqueAsync("MP00001")).ReturnsAsync(true); repository.Setup(r => r.CreateAsync(It.IsAny())).Callback((p) => actual = p); - var validator = new AddItemValidator(repository.Object); - var serviceProviderMock = _mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); AddItemViewModel sut = _mocker.CreateInstance(); sut.AssetTag = expectedAssetTag; @@ -330,14 +292,9 @@ public async Task PhoneSaveCommand_WithPhoneOnly_ShouldCallRepositoryAsync() OEM = Manufacturer.Apple, Status = "status" }; - Mock repository = _mocker.GetMock(); + var repository = MockValidator(); repository.Setup(r => r.AssetTagUniqueAsync("MP00001")).ReturnsAsync(true); repository.Setup(r => r.CreateAsync(It.IsAny())).Callback((p) => actual = p); - var validator = new AddItemValidator(repository.Object); - var serviceProviderMock = _mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); AddItemViewModel sut = _mocker.CreateInstance(); sut.AssetTag = expectedAssetTag; @@ -355,15 +312,9 @@ public async Task PhoneSaveCommand_WithPhoneOnly_ShouldCallRepositoryAsync() } [Test] - public async Task PhoneSaveCommand_ShouldDisablePhoneSaveAsync() + public async Task PhoneSaveCommand_hould_disable_PhoneSaveCommand() { - Mock repository = _mocker.GetMock(); - var validator = new AddItemValidator(repository.Object); - var serviceProviderMock = _mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); - + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.PhoneSaveCommand.Execute(null); @@ -372,8 +323,9 @@ public async Task PhoneSaveCommand_ShouldDisablePhoneSaveAsync() } [Test] - public async Task PhoneSaveCommand_ShouldResetAllPhonePropertiesAsync() + public async Task PhoneSaveCommand_should_reset_all_Phone_properties() { + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); ArrangeSetAllPhoneProperties(sut); @@ -387,6 +339,7 @@ public void PhoneSaveCommand_ShouldSendPhoneMessage() { Mock message = _mocker.GetMock(); message.Setup(m => m.Send(It.IsAny(), It.IsAny())); + _ = MockValidator(); AddItemViewModel sut = _mocker.CreateInstance(); sut.AssetTag = "MP00001"; @@ -398,7 +351,20 @@ public void PhoneSaveCommand_ShouldSendPhoneMessage() message.Verify(x => x.Send(It.IsAny(), It.IsAny()), Times.Once); } - private void ArrangeSetAllPhoneProperties(AddItemViewModel sut) + [Test] + [Arguments(null)] + [Arguments("")] + public async Task Ticket_should_not_have_Error_when_Null_or_empty(string? actual) + { + _ = MockValidator(); + AddItemViewModel sut = _mocker.CreateInstance(); + + sut.Ticket = actual; + + await Assert.That(sut.GetErrors(nameof(sut.Ticket))).IsEmpty(); + } + + private static void ArrangeSetAllPhoneProperties(AddItemViewModel sut) { sut.AssetTag = "MP00000"; sut.Condition = "condition"; @@ -411,7 +377,7 @@ private void ArrangeSetAllPhoneProperties(AddItemViewModel sut) sut.Ticket = 7654321.ToString(); } - private async Task AssertResetAllPhonePropertiesAsync(AddItemViewModel sut) + private static async Task AssertResetAllPhonePropertiesAsync(AddItemViewModel sut) { await Assert.That(sut.AssetTag).IsNull(); await Assert.That(sut.Condition).IsEqualTo(ApplicationConstants.Conditions[1].Substring(0, 1)); diff --git a/PhoneAssistant.Tests/Features/MainWindow/MainWindowViewModelTests.cs b/PhoneAssistant.Tests/Features/MainWindow/MainWindowViewModelTests.cs index 7f7b0c4..4b6ef16 100644 --- a/PhoneAssistant.Tests/Features/MainWindow/MainWindowViewModelTests.cs +++ b/PhoneAssistant.Tests/Features/MainWindow/MainWindowViewModelTests.cs @@ -59,10 +59,11 @@ public async Task UpdateViewAsync_WithValidViewModelType_CallUpdateAsync(ViewMod switch (viewModelType) { case ViewModelType.None: - dashboard.Verify(vm => vm.LoadAsync(), Times.Exactly(2)); + dashboard.Verify(vm => vm.LoadAsync(), Times.Never); + settings.Verify(vm => vm.LoadAsync(), Times.Exactly(2)); break; case ViewModelType.Dashboard: - dashboard.Verify(vm => vm.LoadAsync(), Times.Exactly(2)); + dashboard.Verify(vm => vm.LoadAsync(), Times.Once); break; case ViewModelType.Phones: phones.Verify(vm => vm.LoadAsync(), Times.Once); @@ -71,7 +72,7 @@ public async Task UpdateViewAsync_WithValidViewModelType_CallUpdateAsync(ViewMod sims.Verify(vm => vm.LoadAsync(), Times.Once); break; case ViewModelType.Settings: - settings.Verify(vm => vm.LoadAsync(), Times.Once); + settings.Verify(vm => vm.LoadAsync(), Times.Exactly(2)); break; case ViewModelType.Users: users.Verify(vm => vm.LoadAsync(), Times.Once); diff --git a/PhoneAssistant.Tests/Features/Phones/PhonesMainViewModelTests.cs b/PhoneAssistant.Tests/Features/Phones/PhonesMainViewModelTests.cs index 928ed71..60cb4b9 100644 --- a/PhoneAssistant.Tests/Features/Phones/PhonesMainViewModelTests.cs +++ b/PhoneAssistant.Tests/Features/Phones/PhonesMainViewModelTests.cs @@ -273,7 +273,6 @@ public async Task LoadAsync_should_call_GetActivePhones_when_IncludeDisposals_fa new Phone() { Imei = "2" , AssetTag = "Tag B2", Model = "", Condition = "", OEM = Manufacturer.Samsung, Status = "In Repair"}, new Phone() { Imei = "3" , AssetTag = "Tag C3", Model = "", Condition = "", OEM = Manufacturer.Nokia, Status = "Production"}, ]; - int index = 0; AutoMocker mocker = new(); Mock settings = mocker.GetMock(); settings.Setup(s => s.ApplicationSettings).Returns(new ApplicationSettings()); @@ -284,8 +283,7 @@ public async Task LoadAsync_should_call_GetActivePhones_when_IncludeDisposals_fa Mock messenger = mocker.GetMock(); Mock factory = mocker.GetMock(); factory.Setup(r => r.Create(It.IsAny())) - .Returns(() => new PhonesItemViewModel(settings.Object, baseReport.Object, repository.Object, messenger.Object, phones[index])) - .Callback(() => index++); + .Returns((Phone p) => new PhonesItemViewModel(settings.Object, baseReport.Object, repository.Object, messenger.Object, p)); PhonesMainViewModel vm = mocker.CreateInstance(); vm.IncludeDisposals = false; @@ -305,25 +303,23 @@ public async Task LoadAsync_should_call_GetAllPhones_when_IncludeDisposals_true( new Phone() { Imei = "4" , AssetTag = "Tag D4", Model = "", Condition = "", OEM = Manufacturer.Other, Status = "Decommissioned"}, new Phone() { Imei = "5" , AssetTag = "Tag E5", Model = "", Condition = "", OEM = Manufacturer.Apple, Status = "Disposed"}, ]; - int index = 0; AutoMocker mocker = new(); Mock settings = mocker.GetMock(); settings.Setup(s => s.ApplicationSettings).Returns(new ApplicationSettings()); Mock repository = mocker.GetMock(); repository.Setup(r => r.GetActivePhonesAsync()).ReturnsAsync(() => { return phones; }); repository.Setup(r => r.GetAllPhonesAsync()).ReturnsAsync(() => { return phones; }); - Mock sims = mocker.GetMock(); + Mock baseReport = mocker.GetMock(); Mock messenger = mocker.GetMock(); Mock factory = mocker.GetMock(); factory.Setup(r => r.Create(It.IsAny())) - .Returns(() => new PhonesItemViewModel(settings.Object, sims.Object, repository.Object, messenger.Object, phones[index])) - .Callback(() => index++); + .Returns((Phone p) => new PhonesItemViewModel(settings.Object, baseReport.Object, repository.Object, messenger.Object, p)); PhonesMainViewModel vm = mocker.CreateInstance(); vm.IncludeDisposals = true; await vm.LoadAsync(); - repository.Verify(r => r.GetAllPhonesAsync(), Times.Once()); + repository.Verify(r => r.GetAllPhonesAsync(), Times.Once); repository.Verify(r => r.GetActivePhonesAsync(), Times.Never()); } diff --git a/PhoneAssistant.Tests/Features/Sims/SimValidatorTests.cs b/PhoneAssistant.Tests/Features/Sims/SimValidatorTests.cs index 488ab82..68dc081 100644 --- a/PhoneAssistant.Tests/Features/Sims/SimValidatorTests.cs +++ b/PhoneAssistant.Tests/Features/Sims/SimValidatorTests.cs @@ -1,5 +1,7 @@ -using FluentValidation.TestHelper; +using FluentValidation; +using FluentValidation.TestHelper; using Moq.AutoMock; +using PhoneAssistant.Model; using PhoneAssistant.WPF.Features.Sims; namespace PhoneAssistant.Tests.Features.Sims; @@ -13,9 +15,15 @@ internal sealed class SimValidatorTests public SimValidatorTests() { _mocker = new AutoMocker(); - _validator = _mocker.CreateInstance(); + var phones = _mocker.GetMock(); + _validator = new SimValidator(phones.Object); + _mocker.Use>(_validator); + var serviceProviderMock = _mocker.GetMock(); + serviceProviderMock + .Setup(sp => sp.GetService(typeof(IValidator))); _vm = _mocker.CreateInstance(); } + [Test] [Arguments(null)] [Arguments("")] @@ -41,6 +49,7 @@ public async Task NewUser_should_not_have_Error_when_Present() // Phone number validation is tested in ValidationRules_PhoneNumberTests // Sim number validation is tested in ValidationRules_SimNumberTests // Ticket validation is tested in ValidationRules_TicketTests - except for the case when ticket is required + [Test] [Arguments(null)] [Arguments("")] diff --git a/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs b/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs index 8e38b9e..dd1b7bb 100644 --- a/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs +++ b/PhoneAssistant.Tests/Features/Sims/SimsMainViewModelTests.cs @@ -14,18 +14,24 @@ namespace PhoneAssistant.Tests.Features.Sims; public sealed class SimsMainViewModelTests { - [Test] - public async Task HasErrors_should_be_false_when_required_fields_supplied() - { - AutoMocker mocker = new(); - var phonesRepository = mocker.GetMock(); + private readonly AutoMocker _mocker = new(); + + private void MockValidator() + { + var phonesRepository = _mocker.GetMock(); var validator = new SimValidator(phonesRepository.Object); - mocker.Use>(validator); - var serviceProviderMock = mocker.GetMock(); + _mocker.Use>(validator); + var serviceProviderMock = _mocker.GetMock(); serviceProviderMock .Setup(sp => sp.GetService(typeof(IValidator))) .Returns(validator); - var vm = mocker.CreateInstance(); + } + + [Test] + public async Task HasErrors_should_be_false_when_required_fields_supplied() + { + MockValidator(); + var vm = _mocker.CreateInstance(); vm.NewUser = "Rosie Lane"; vm.PhoneNumber = "07814209742"; @@ -37,16 +43,8 @@ public async Task HasErrors_should_be_false_when_required_fields_supplied() [Test] public async Task HasErrors_should_be_true_when_required_fields_missing() { - AutoMocker mocker = new(); - var phonesRepository = mocker.GetMock(); - var validator = new SimValidator(phonesRepository.Object); - mocker.Use>(validator); - var serviceProviderMock = mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); - - var vm = mocker.CreateInstance(); + MockValidator(); + var vm = _mocker.CreateInstance(); await Assert.That(vm.HasErrors).IsTrue(); @@ -63,38 +61,24 @@ public async Task HasErrors_should_be_true_when_required_fields_missing() [Test] public async Task PhoneNumber_changed_should_set_SimNumber_when_SIM_exists() { - AutoMocker mocker = new(); - Mock baseRepository = mocker.GetMock(); + MockValidator(); + Mock baseRepository = _mocker.GetMock(); baseRepository.Setup(r => r.GetSimNumberAsync("01234567890")).ReturnsAsync("sim number"); - var phonesRepository = mocker.GetMock(); - var validator = new SimValidator(phonesRepository.Object); - var serviceProviderMock = mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); + var vm = _mocker.CreateInstance(); - var vm = mocker.CreateInstance(); vm.NewUser = "Alice"; vm.PhoneNumber = "01234567890"; vm.Ticket = "654321"; - mocker.VerifyAll(); + _mocker.VerifyAll(); await Assert.That(vm.SimNumber).IsEqualTo("sim number"); } [Test] public async Task PrintEnvelopeCommand_should_be_disabled_when_Errors() { - AutoMocker mocker = new(); - var phonesRepository = mocker.GetMock(); - var validator = new SimValidator(phonesRepository.Object); - mocker.Use>(validator); - var serviceProviderMock = mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); - - var vm = mocker.CreateInstance(); + MockValidator(); + var vm = _mocker.CreateInstance(); await Assert.That(vm.HasErrors).IsTrue(); await Assert.That(vm.PrintEnvelopeCommand.CanExecute(null)).IsFalse(); @@ -103,14 +87,8 @@ public async Task PrintEnvelopeCommand_should_be_disabled_when_Errors() [Test] public async Task PrintEnvelopeCommand_should_be_enabled_when_all_properties_supplied() { - AutoMocker mocker = new(); - var phonesRepository = mocker.GetMock(); - var validator = new SimValidator(phonesRepository.Object); - var serviceProviderMock = mocker.GetMock(); - serviceProviderMock - .Setup(sp => sp.GetService(typeof(IValidator))) - .Returns(validator); - var vm = mocker.CreateInstance(); + MockValidator(); + var vm = _mocker.CreateInstance(); vm.NewUser = "Alice"; vm.PhoneNumber = "01234567890"; @@ -124,17 +102,17 @@ public async Task PrintEnvelopeCommand_should_be_enabled_when_all_properties_sup [Test] public async Task PrintEnvelopeCommand_should_call_PrintEnvelope_Execute_with_OrderDetails() { - AutoMocker mocker = new(); + MockValidator(); + var vm = _mocker.CreateInstance(); OrderDetails? actual = null; - var vm = mocker.CreateInstance(); + var printEnvelope = _mocker.GetMock(); + printEnvelope + .Setup(p => p.Execute(It.IsAny())) + .Callback(o => actual = o); vm.NewUser = "Rosie Lane"; vm.PhoneNumber = "07814209742"; vm.SimNumber = "8944122605563572205"; vm.Ticket = "262281"; - var printEnvelope = mocker.GetMock(); - printEnvelope - .Setup(p => p.Execute(It.IsAny())) - .Callback(o => actual = o); await vm.PrintEnvelopeCommand.ExecuteAsync(null); diff --git a/PhoneAssistant.WPF/Features/MainWindow/MainWindowViewModel.cs b/PhoneAssistant.WPF/Features/MainWindow/MainWindowViewModel.cs index af703fe..ca7b1c5 100644 --- a/PhoneAssistant.WPF/Features/MainWindow/MainWindowViewModel.cs +++ b/PhoneAssistant.WPF/Features/MainWindow/MainWindowViewModel.cs @@ -1,8 +1,6 @@ -using System.Windows; - + using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; - using PhoneAssistant.Model; using PhoneAssistant.WPF.Features.AddItem; using PhoneAssistant.WPF.Features.BaseReport; @@ -14,6 +12,7 @@ using PhoneAssistant.WPF.Features.Sims; using PhoneAssistant.WPF.Features.Users; using PhoneAssistant.WPF.Shared; +using System.Windows; namespace PhoneAssistant.WPF.Features.MainWindow; @@ -88,11 +87,9 @@ public MainWindowViewModel(IAddItemViewModel addItemViewModel, [RelayCommand] private async Task UpdateViewAsync(ViewModelType selectedViewModelType) { - ArgumentNullException.ThrowIfNull(selectedViewModelType); - SelectedViewModel = selectedViewModelType switch { - ViewModelType.None => _dashboardMainViewModel, + ViewModelType.None => _settingsMainViewModel, ViewModelType.AddItem => _addItemViewModel, ViewModelType.BaseReport => _baseReportMainViewModel, ViewModelType.Dashboard => _dashboardMainViewModel, diff --git a/PhoneAssistant.WPF/Features/Users/UsersItemViewModel.cs b/PhoneAssistant.WPF/Features/Users/UsersItemViewModel.cs index 6c61b66..55788d6 100644 --- a/PhoneAssistant.WPF/Features/Users/UsersItemViewModel.cs +++ b/PhoneAssistant.WPF/Features/Users/UsersItemViewModel.cs @@ -9,10 +9,7 @@ public sealed partial class UsersItemViewModel public UsersItemViewModel(User user) { - if (user is null) - { - throw new ArgumentNullException(nameof(user)); - } + ArgumentNullException.ThrowIfNull(user); User = user; } @@ -25,7 +22,7 @@ public void CopyNameToClipboard() [RelayCommand(CanExecute =nameof(CanCopyEmailToClipbaord))] public void CopyEmailToClipboard() { - Clipboard.SetText(User.Email); + Clipboard.SetText(User.Email!); } private bool CanCopyEmailToClipbaord() => !string.IsNullOrEmpty(User.Email); diff --git a/PhoneAssistant.WPF/Resources/TrackingNumber.png b/PhoneAssistant.WPF/Resources/TrackingNumber.png new file mode 100644 index 0000000..f5c1940 Binary files /dev/null and b/PhoneAssistant.WPF/Resources/TrackingNumber.png differ