private static IReadOnlyCollection <DiscModel> GetAdviseSetDiscs(AdviseSetModel adviseSet) { return(DiscLibrary.Discs .Where(x => x.AdviseSetInfo?.AdviseSet.Id == adviseSet.Id) .OrderBy(x => x.AdviseSetInfo.Order) .ToList()); }
public void CalculateAdviseSetRank_ForAdviseSetWithMultipleDiscs_ReturnsCorrectRank() { // Arrange var disc1 = CreateTestDisc("1.1", new[] { CreateTestSong(1, RatingModel.R5, new DateTime(2021, 08, 28)) }); var disc2 = CreateTestDisc("1.2", new[] { CreateTestSong(2, RatingModel.R7, new DateTime(2021, 08, 28)) }); var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; disc1.AdviseSetInfo = new AdviseSetInfo(adviseSet, 1); disc2.AdviseSetInfo = new AdviseSetInfo(adviseSet, 2); var adviseGroupContent1 = new AdviseGroupContent("1", isFavorite: false); adviseGroupContent1.AddDisc(disc1); adviseGroupContent1.AddDisc(disc2); var adviseGroupContent2 = CreateTestAdviseGroupContent("2", Enumerable.Range(11, 10).Select(id => CreateTestSong(id, RatingModel.R5, new DateTime(2021, 08, 27)))); var adviseGroupContent3 = CreateTestAdviseGroupContent("3", Enumerable.Range(21, 10).Select(id => CreateTestSong(id, RatingModel.R5, new DateTime(2021, 08, 29)))); var playbacksInfo = new PlaybacksInfo(new[] { adviseGroupContent1, adviseGroupContent2, adviseGroupContent3 }); var mocker = new AutoMocker(); var target = mocker.CreateInstance <AdviseRankCalculator>(); // Act var rank = target.CalculateAdviseSetRank(adviseGroupContent1.AdviseSets.Single(), playbacksInfo); // Assert // (rating: 1.5 ^ 6) * (playbacks age: 1) rank.Should().Be(11.390625); }
public async Task RemoveDiscs(AdviseSetModel adviseSet, IEnumerable <DiscModel> removedDiscs, CancellationToken cancellationToken) { var removedDiscsMap = removedDiscs.ToDictionary(x => x.Id, x => x); var nextOrder = 1; foreach (var disc in GetAdviseSetDiscs(adviseSet)) { if (removedDiscsMap.TryGetValue(disc.Id, out var removedDisc)) { disc.AdviseSetInfo = null; await discsRepository.UpdateDisc(disc, cancellationToken); removedDisc.AdviseSetInfo = null; } else { if (disc.AdviseSetInfo.Order != nextOrder) { disc.AdviseSetInfo = disc.AdviseSetInfo.WithOrder(nextOrder); await discsRepository.UpdateDisc(disc, cancellationToken); } ++nextOrder; } } }
public async Task Load_IfSomeDiscsAreDeleted_LoadsOnlyActiveDiscs() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive(), new DiscModel { Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2) }.MakeDeleted(), new DiscModel { Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 3) }.MakeActive(), }; var mocker = StubServices(new[] { adviseSet }, discs); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); // Act await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; // Assert var availableDiscsViewModelMock = mocker.GetMock <IAvailableDiscsViewModel>(); availableDiscsViewModelMock.Verify(x => x.LoadDiscs(new[] { discs[0], discs[2] }, It.IsAny <CancellationToken>()), Times.Once); }
public async Task CreateAdviseSet_ForExistingAdviseSetName_Throws() { // Arrange var referenceData = GetReferenceData(); var newAdviseSet = new AdviseSetModel { Name = referenceData.AdviseSet1.Name, }; var target = CreateTestTarget(); // Act Func <Task> call = () => target.CreateAdviseSet(newAdviseSet, CancellationToken.None); // Assert await call.Should().ThrowAsync <DbUpdateException>(); var expectedAdviseSets = new[] { referenceData.AdviseSet2, referenceData.AdviseSet1, }; var allAdviseSets = await target.GetAllAdviseSets(CancellationToken.None); allAdviseSets.Should().BeEquivalentTo(expectedAdviseSets, x => x.WithStrictOrdering()); await CheckLibraryConsistency(); }
public async Task DeleteAdviseSetCommandHandler_IfDeletionIsConfirmed_DeleteAdviseSet() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var windowServiceStub = new Mock <IWindowService>(); windowServiceStub.Setup(x => x.ShowMessageBox(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <ShowMessageBoxButton>(), It.IsAny <ShowMessageBoxIcon>())).Returns(ShowMessageBoxResult.Yes); var mocker = StubServices(new[] { adviseSet }, Array.Empty <DiscModel>()); mocker.Use(windowServiceStub); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; // Act target.DeleteAdviseSetCommand.Execute(null); // Assert var adviseSetServiceMock = mocker.GetMock <IAdviseSetService>(); adviseSetServiceMock.Verify(x => x.DeleteAdviseSet(adviseSet, It.IsAny <CancellationToken>()), Times.Once); }
public async Task CanDeleteAdviseSetGetter_IfNoAdviseSetSelected_ReturnsFalse() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive() }; var mocker = StubServices(new[] { adviseSet }, discs); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = null; // Act var result = target.CanDeleteAdviseSet; // Assert result.Should().BeFalse(); }
public async Task CanAddDiscsGetter_IfSomeAdviseSetIsSelectedAndSelectedDiscsCanBeAddedToAdviseSet_ReturnsTrue() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive() }; var availableDiscsViewModelStub = new Mock <IAvailableDiscsViewModel>(); availableDiscsViewModelStub.Setup(x => x.SelectedDiscsCanBeAddedToAdviseSet(discs)).Returns(true); var mocker = StubServices(new[] { adviseSet }, discs); mocker.Use(availableDiscsViewModelStub); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; // Act var result = target.CanAddDiscs; // Assert result.Should().BeTrue(); }
public void ForAdviseSet_ForExplicitAdviseSet_FillsTitleCorrectly() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("Advise Set Id"), Name = "Some Advise Set" }; var disc1 = new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1), Title = "Disc 1" }; var disc2 = new DiscModel { Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2), Title = "Disc 2" }; var folder = new FolderModel { Name = "Some Artist" }; folder.AddDiscs(disc1, disc2); var adviseSetContent = new AdviseSetContent("AdviseSetContent Id"); adviseSetContent.AddDisc(disc1); adviseSetContent.AddDisc(disc2); // Act var target = AdvisedPlaylist.ForAdviseSet(adviseSetContent); // Assert target.Title.Should().Be("Some Advise Set"); }
public async Task CanRemoveDiscGetter_IfSomeAdviseSetIsSelectedButNoDiscSelected_ReturnsTrue() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive() }; var mocker = StubServices(new[] { adviseSet }, discs); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; target.SelectedAdviseSetDisc = discs.First(); // Act var result = target.CanRemoveDisc; // Assert result.Should().BeTrue(); }
public async Task SelectedAdviseSetSetter_IfNoAdviseSetSelected_ClearsCurrentAdviseSetDiscs() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive(), new DiscModel { Id = new ItemId("2") }.MakeActive(), }; var availableDiscsViewModelMock = new Mock <IAvailableDiscsViewModel>(); var mocker = StubServices(new[] { adviseSet }, discs); mocker.Use(availableDiscsViewModelMock); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; target.CurrentAdviseSetDiscs.Should().NotBeEmpty(); availableDiscsViewModelMock.Invocations.Clear(); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act target.SelectedAdviseSet = null; // Assert target.CurrentAdviseSetDiscs.Should().BeEmpty(); availableDiscsViewModelMock.Verify(x => x.LoadAvailableDiscsForAdviseSet(new ObservableCollection <DiscModel>()), Times.Once); var expectedProperties = new[] { nameof(AdviseSetsEditorViewModel.SelectedAdviseSet), nameof(AdviseSetsEditorViewModel.CanDeleteAdviseSet), nameof(AdviseSetsEditorViewModel.CanAddDiscs), nameof(AdviseSetsEditorViewModel.CanRemoveDisc), nameof(AdviseSetsEditorViewModel.CanMoveDiscUp), nameof(AdviseSetsEditorViewModel.CanMoveDiscDown), }; propertyChangedEvents.Select(e => e.PropertyName).Should().BeEquivalentTo(expectedProperties); }
public async Task LoadAvailableDiscsForAdviseSet_IfDiscBelongsToAnotherFolder_DoesNotAddSuchDiscsToList() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), TreeTitle = "Disc 1", AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }, new DiscModel { Id = new ItemId("2"), TreeTitle = "Disc 2" }, new DiscModel { Id = new ItemId("3"), TreeTitle = "Disc 3" }, }; var folder1 = new FolderModel { Id = new ItemId("0"), Name = "<ROOT" }; var folder2 = new FolderModel { Id = new ItemId("1"), Name = "Folder 1" }; var folder3 = new FolderModel { Id = new ItemId("2"), Name = "Folder 2" }; folder1.AddSubfolders(folder2); folder2.AddSubfolders(folder3); folder2.AddDiscs(discs[0], discs[2]); folder3.AddDiscs(discs[1]); var adviseSetDiscs = new[] { discs[0], }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <AvailableDiscsViewModel>(); await target.LoadDiscs(discs, CancellationToken.None); // Act target.LoadAvailableDiscsForAdviseSet(adviseSetDiscs); // Assert var expectedAvailableDiscs = new[] { new AvailableDiscViewModel(discs[2], "/Folder 1/Disc 3"), }; target.AvailableDiscs.Should().BeEquivalentTo(expectedAvailableDiscs, x => x.WithStrictOrdering()); }
public static AdviseSetEntity ToEntity(this AdviseSetModel adviseSet) { return(new() { Id = adviseSet.Id?.ToInt32() ?? default, Name = adviseSet.Name, }); }
public async Task DeleteAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken) { await using var context = contextFactory.CreateDbContext(); var entity = await FindAdviseSet(context, adviseSet.Id, cancellationToken); context.AdviseSets.Remove(entity); await context.SaveChangesAsync(cancellationToken); }
public async Task AddDiscs(AdviseSetModel adviseSet, IEnumerable <DiscModel> addedDiscs, CancellationToken cancellationToken) { var lastAdviseSetInfo = GetAdviseSetDiscs(adviseSet).LastOrDefault()?.AdviseSetInfo; var nextOrder = (lastAdviseSetInfo?.Order ?? 0) + 1; foreach (var addedDisc in addedDiscs) { addedDisc.AdviseSetInfo = new AdviseSetInfo(adviseSet, nextOrder++); await discsRepository.UpdateDisc(addedDisc, cancellationToken); } }
public async Task CreateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken) { var adviseSetEntity = adviseSet.ToEntity(); await using var context = contextFactory.CreateDbContext(); await context.AdviseSets.AddAsync(adviseSetEntity, cancellationToken); await context.SaveChangesAsync(cancellationToken); adviseSet.Id = adviseSetEntity.Id.ToItemId(); }
public async Task UpdateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken) { await using var context = contextFactory.CreateDbContext(); var currentEntity = await FindAdviseSet(context, adviseSet.Id, cancellationToken); var updatedEntity = adviseSet.ToEntity(); context.Entry(currentEntity).CurrentValues.SetValues(updatedEntity); await context.SaveChangesAsync(cancellationToken); }
public async Task MoveDiscDownCommandHandler_IfNotLastDiscIsSelected_ReordersDiscsCorrectly() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive(), new DiscModel { Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2) }.MakeActive(), new DiscModel { Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 3) }.MakeActive(), }; var mocker = StubServices(new[] { adviseSet }, discs); var adviseSetServiceMock = mocker.GetMock <IAdviseSetService>(); adviseSetServiceMock.Setup(x => x.ReorderDiscs(adviseSet, new[] { discs[0], discs[2], discs[1] }, It.IsAny <CancellationToken>())) .Callback <AdviseSetModel, IEnumerable <DiscModel>, CancellationToken>((_, newDiscsOrder, _) => { // Emulate logic of ReorderDiscs call for correct check of order for CurrentAdviseSetDiscs. var newDiscsOrderList = newDiscsOrder.ToList(); newDiscsOrderList[0].AdviseSetInfo = new AdviseSetInfo(adviseSet, 1); newDiscsOrderList[1].AdviseSetInfo = new AdviseSetInfo(adviseSet, 2); newDiscsOrderList[2].AdviseSetInfo = new AdviseSetInfo(adviseSet, 3); }); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; target.SelectedAdviseSetDisc = discs[1]; // Act target.MoveDiscDownCommand.Execute(null); // Assert adviseSetServiceMock.Verify(x => x.ReorderDiscs(adviseSet, new[] { discs[0], discs[2], discs[1] }, It.IsAny <CancellationToken>()), Times.Once); target.CurrentAdviseSetDiscs.Should().BeEquivalentTo(new[] { discs[0], discs[2], discs[1] }, x => x.WithStrictOrdering()); target.SelectedAdviseSetDisc.Should().Be(discs[1]); }
public async Task DeleteAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken) { var currentDiscs = GetAdviseSetDiscs(adviseSet); foreach (var disc in currentDiscs) { disc.AdviseSetInfo = null; await discsRepository.UpdateDisc(disc, cancellationToken); } await adviseSetRepository.DeleteAdviseSet(adviseSet, cancellationToken); DiscLibrary.DeleteAdviseSet(adviseSet); }
public async Task DeleteAdviseSetCommandHandler_IfAdviseSetIsDeleted_ClearsAdviseSetForDiscs() { // Arrange var adviseSet1 = new AdviseSetModel { Id = new ItemId("1") }; var adviseSet2 = new AdviseSetModel { Id = new ItemId("2") }; var disc11 = new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet1, 1) }.MakeActive(); var disc12 = new DiscModel { Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet1, 2) }.MakeActive(); var disc21 = new DiscModel { Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet2, 1) }.MakeActive(); var discs = new[] { disc11, disc12, disc21 }; var windowServiceStub = new Mock <IWindowService>(); windowServiceStub.Setup(x => x.ShowMessageBox(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <ShowMessageBoxButton>(), It.IsAny <ShowMessageBoxIcon>())).Returns(ShowMessageBoxResult.Yes); var mocker = StubServices(new[] { adviseSet1, adviseSet2 }, discs); mocker.Use(windowServiceStub); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet1; // Act target.DeleteAdviseSetCommand.Execute(null); // Assert disc11.AdviseSetInfo.Should().BeNull(); disc12.AdviseSetInfo.Should().BeNull(); disc21.AdviseSetInfo.Should().BeEquivalentTo(new AdviseSetInfo(adviseSet2, 1)); }
public async Task GroupLibraryDiscs_IfDiscsBelongToSameAdviseSet_AssignsDiscsToSameAdviseSetContent() { // Arrange var adviseSet1 = new AdviseSetModel { Id = new ItemId("Advise Set 1") }; var adviseSet2 = new AdviseSetModel { Id = new ItemId("Advise Set 2") }; var disc11 = new DiscModel { AdviseSetInfo = new AdviseSetInfo(adviseSet1, 1) }; var disc12 = new DiscModel { AdviseSetInfo = new AdviseSetInfo(adviseSet1, 2) }; var disc21 = new DiscModel { AdviseSetInfo = new AdviseSetInfo(adviseSet2, 1) }; var rootFolder = new FolderModel { Id = new ItemId("Root Folder") }; rootFolder.AddDiscs(disc11, disc12, disc21); var mocker = new AutoMocker(); var target = mocker.CreateInstance <DiscGrouper>(); // Act var adviseGroups = await target.GroupLibraryDiscs(new[] { disc11, disc21, disc12 }, CancellationToken.None); // Assert adviseGroups.Count.Should().Be(1); var adviseSets = adviseGroups.Single().AdviseSets.ToList(); adviseSets.Count.Should().Be(2); adviseSets[0].Discs.Should().BeEquivalentTo(new[] { disc11, disc12 }, x => x.WithStrictOrdering()); adviseSets[1].Discs.Should().BeEquivalentTo(new[] { disc21 }, x => x.WithStrictOrdering()); }
public async Task SelectedAdviseSetDiscSetter_RaisesPropertyChangedEventsCorrectly() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive() }; var mocker = StubServices(new[] { adviseSet }, discs); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act target.SelectedAdviseSetDisc = discs.First(); // Assert var expectedProperties = new[] { nameof(AdviseSetsEditorViewModel.SelectedAdviseSetDisc), nameof(AdviseSetsEditorViewModel.CanDeleteAdviseSet), nameof(AdviseSetsEditorViewModel.CanAddDiscs), nameof(AdviseSetsEditorViewModel.CanRemoveDisc), nameof(AdviseSetsEditorViewModel.CanMoveDiscUp), nameof(AdviseSetsEditorViewModel.CanMoveDiscDown), }; propertyChangedEvents.Select(e => e.PropertyName).Should().BeEquivalentTo(expectedProperties); }
public async Task CreateAdviseSet_ForNonExistingAdviseSetName_CreatesAdviseSetSuccessfully() { // Arrange var newAdviseSet = new AdviseSetModel { Name = "Вершки и корешки", }; var target = CreateTestTarget(); // Act await target.CreateAdviseSet(newAdviseSet, CancellationToken.None); // Assert var expectedAdviseSet = new AdviseSetModel { Id = ReferenceData.NextAdviseSetId, Name = "Вершки и корешки", }; newAdviseSet.Should().BeEquivalentTo(expectedAdviseSet, x => x.WithStrictOrdering()); var referenceData = GetReferenceData(); var expectedAdviseSets = new[] { referenceData.AdviseSet2, referenceData.AdviseSet1, expectedAdviseSet, }; var allAdviseSets = await target.GetAllAdviseSets(CancellationToken.None); allAdviseSets.Should().BeEquivalentTo(expectedAdviseSets, x => x.WithStrictOrdering()); await CheckLibraryConsistency(); }
public void PlaylistLoadedEventHandler_AllSongsBelongToSameAdviseSet_OpensDiscForCurrentPlaylistSong() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("Some Advise Set") }; var discFolder = new FolderModel { Id = new ItemId("Some Folder") }; var disc1 = new DiscModel { Id = new ItemId("Some Disc 1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.AddToFolder(discFolder); var disc2 = new DiscModel { Id = new ItemId("Some Disc 2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2) }.AddToFolder(discFolder); var song1 = new SongModel { Id = new ItemId("1") }.AddToDisc(disc1); var song2 = new SongModel { Id = new ItemId("2") }.AddToDisc(disc2); var mocker = new AutoMocker(); var target = mocker.CreateInstance <LibraryExplorerViewModel>(); // Act Messenger.Default.Send(new PlaylistLoadedEventArgs(new[] { song1, song2 }, song2, 1)); // Assert var itemListViewModelMock = mocker.GetMock <ILibraryExplorerItemListViewModel>(); itemListViewModelMock.Verify(x => x.LoadFolderItems(discFolder), Times.Once); itemListViewModelMock.Verify(x => x.SelectDisc(new ItemId("Some Disc 2")), Times.Once); }
public async Task ReorderDiscs(AdviseSetModel adviseSet, IEnumerable <DiscModel> newDiscsOrder, CancellationToken cancellationToken) { var currentDiscs = GetAdviseSetDiscs(adviseSet).ToList(); var newDiscsOrderList = newDiscsOrder.ToList(); var oldOrders = currentDiscs.ToDictionary(x => x.Id, x => x.AdviseSetInfo.Order); var newOrders = newDiscsOrderList .Select((x, i) => (Disc: x, Order: i + 1)) .ToDictionary(x => x.Disc.Id, x => x.Order); var discsChanged = currentDiscs.Except(newDiscsOrderList, new DiscEqualityComparer()).Any() || newDiscsOrderList.Except(currentDiscs, new DiscEqualityComparer()).Any(); if (discsChanged) { throw new InvalidOperationException("Can not reorder advise set discs because advise set was modified"); } // For satisfying unique order constraint, for discs with changed order we have to clear existing order at first. foreach (var disc in newDiscsOrderList) { if (newOrders[disc.Id] != oldOrders[disc.Id]) { disc.AdviseSetInfo = null; await discsRepository.UpdateDisc(disc, cancellationToken); } } // Finally saving new order. foreach (var disc in newDiscsOrderList) { if (disc.AdviseSetInfo == null) { disc.AdviseSetInfo = new AdviseSetInfo(adviseSet, newOrders[disc.Id]); await discsRepository.UpdateDisc(disc, cancellationToken); } } }
public async Task CanMoveDiscDownGetter_IfNotLastDiscIsSelected_ReturnsTrue() { // Arrange var adviseSet = new AdviseSetModel { Id = new ItemId("1") }; var discs = new[] { new DiscModel { Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1) }.MakeActive(), new DiscModel { Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2) }.MakeActive(), new DiscModel { Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 3) }.MakeActive(), }; var mocker = StubServices(new[] { adviseSet }, discs); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet; target.SelectedAdviseSetDisc = discs[1]; // Act var result = target.CanMoveDiscDown; // Assert result.Should().BeTrue(); }
public AdviseSetCreatedEventArgs(AdviseSetModel adviseSet) { AdviseSet = adviseSet ?? throw new ArgumentNullException(nameof(adviseSet)); }
public Task UpdateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken) { return(adviseSetRepository.UpdateAdviseSet(adviseSet, cancellationToken)); }
public async Task SelectedAdviseSetSetter_IfSomeAdviseSetSelected_FillsCurrentAdviseSetDiscsCorrectly() { // Arrange var adviseSet1 = new AdviseSetModel { Id = new ItemId("1") }; var adviseSet2 = new AdviseSetModel { Id = new ItemId("2") }; var adviseSetServiceStub = new Mock <IAdviseSetService>(); adviseSetServiceStub.Setup(x => x.GetAllAdviseSets(It.IsAny <CancellationToken>())).ReturnsAsync(new[] { adviseSet1, adviseSet2 }); var disc1 = new DiscModel { Id = new ItemId("2_1"), AdviseSetInfo = new AdviseSetInfo(adviseSet2, 1) }.MakeActive(); var disc2 = new DiscModel { Id = new ItemId("2_2"), AdviseSetInfo = new AdviseSetInfo(adviseSet2, 2) }.MakeActive(); var discs = new[] { new DiscModel { Id = new ItemId("1_1"), AdviseSetInfo = new AdviseSetInfo(adviseSet1, 1) }.MakeActive(), disc1, disc2, new DiscModel { Id = new ItemId("3_1") }.MakeActive(), }; var availableDiscsViewModelMock = new Mock <IAvailableDiscsViewModel>(); var mocker = StubServices(new[] { adviseSet1, adviseSet2 }, discs); mocker.Use(availableDiscsViewModelMock); var target = mocker.CreateInstance <AdviseSetsEditorViewModel>(); await target.Load(CancellationToken.None); target.SelectedAdviseSet = adviseSet1; target.CurrentAdviseSetDiscs.Should().NotBeEmpty(); availableDiscsViewModelMock.Invocations.Clear(); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act target.SelectedAdviseSet = adviseSet2; // Assert target.CurrentAdviseSetDiscs.Should().BeEquivalentTo(new[] { disc1, disc2 }, x => x.WithStrictOrdering()); Func <ObservableCollection <DiscModel>, bool> verifyDiscs = ds => ds.SequenceEqual(new[] { disc1, disc2 }); availableDiscsViewModelMock.Verify(x => x.LoadAvailableDiscsForAdviseSet(It.Is <ObservableCollection <DiscModel> >(ds => verifyDiscs(ds))), Times.Once); var expectedProperties = new[] { nameof(AdviseSetsEditorViewModel.SelectedAdviseSet), nameof(AdviseSetsEditorViewModel.CanDeleteAdviseSet), nameof(AdviseSetsEditorViewModel.CanAddDiscs), nameof(AdviseSetsEditorViewModel.CanRemoveDisc), nameof(AdviseSetsEditorViewModel.CanMoveDiscUp), nameof(AdviseSetsEditorViewModel.CanMoveDiscDown), }; propertyChangedEvents.Select(e => e.PropertyName).Should().BeEquivalentTo(expectedProperties); }
public async Task CreateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken) { await adviseSetRepository.CreateAdviseSet(adviseSet, cancellationToken); DiscLibrary.AddAdviseSet(adviseSet); }