1- using Desktop . Domain ;
1+ using Desktop . Common ;
2+ using Desktop . Domain ;
23using Desktop . Tasks ;
4+ using Desktop . Tests . TestAPI ;
5+ using FluentAssertions ;
36using Moq ;
47using NUnit . Framework ;
58using static Desktop . Tests . TestAPI . TaskFactory ;
@@ -11,15 +14,58 @@ public class TaskEditingViewModelTests
1114 [ Test ]
1215 public void TasksModificationsAreCommandedToBePersisted ( )
1316 {
14- var aRepositoryMock = new Mock < ITaskRepository > ( ) ;
15- var anotherRepositoryMock = new Mock < ITaskRepository > ( ) ;
17+ var aRepositoryMock = RepositoryMockThatAlwaysSucceeds ( ) ;
18+ var anotherRepositoryMock = RepositoryMockThatAlwaysSucceeds ( ) ;
19+ var sut = TaskEditingViewModel (
20+ taskBeingEdited : AnyDesktopTask ( ) ,
21+ repositories : [ aRepositoryMock . Object , anotherRepositoryMock . Object ] ) ;
1622
17- var sut = new TaskEditingViewModel (
18- AnyDesktopTask ( ) ,
19- [ aRepositoryMock . Object , anotherRepositoryMock . Object ] ) ;
2023 sut . Save . Execute ( ( "New name" , "New description" ) ) ;
2124
2225 aRepositoryMock . Verify ( m => m . Save ( It . IsAny < Task > ( ) ) ) ;
2326 anotherRepositoryMock . Verify ( m => m . Save ( It . IsAny < Task > ( ) ) ) ;
2427 }
28+
29+ private static Mock < ITaskRepository > RepositoryMockThatAlwaysSucceeds ( )
30+ {
31+ var mock = new Mock < ITaskRepository > ( ) ;
32+ mock
33+ . Setup ( x => x . Save ( It . IsAny < Task > ( ) ) )
34+ . ReturnsAsync ( ResultWithoutValue . Success ( ) ) ;
35+
36+ return mock ;
37+ }
38+
39+ [ Test ]
40+ public void TaskEditing_Fails_MessageNotifiesUserAndTaskRemainsUnmodified ( )
41+ {
42+ var existingTask = DesktopTask ( "Old name" , "Old description" ) ;
43+ var repository = new InMemoryTaskRepository ( [ existingTask ] ) ;
44+ repository . FailAlways ( ) ;
45+ var messageNotifierMock = new Mock < IMessageNotifier > ( ) ;
46+ var sut = TaskEditingViewModel (
47+ taskBeingEdited : existingTask ,
48+ messageNotifierMock . Object ,
49+ repositories : repository ) ;
50+
51+ sut . Save . Execute ( ( "New name" , "New description" ) ) ;
52+
53+ messageNotifierMock . Verify ( x => x . Notify (
54+ "Task editing has failed due to " +
55+ "an internal error. The modifications will be reverted. " +
56+ "Please, try again later." ) ) ;
57+ existingTask . Name . Should ( ) . Be ( "Old name" ) ;
58+ existingTask . Description . Should ( ) . Be ( "Old description" ) ;
59+ }
60+
61+ private static TaskEditingViewModel TaskEditingViewModel (
62+ Task taskBeingEdited ,
63+ IMessageNotifier messageNotifier = null ,
64+ params ITaskRepository [ ] repositories )
65+ {
66+ return new TaskEditingViewModel (
67+ taskBeingEdited ,
68+ messageNotifier ?? new Mock < IMessageNotifier > ( ) . Object ,
69+ repositories ) ;
70+ }
2571}
0 commit comments