|
|
@@ -3,53 +3,47 @@ package org.leumasjaffe.recipe.controller;
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
import static org.mockito.Mockito.*;
|
|
|
|
|
|
-import java.awt.Component;
|
|
|
+import java.io.IOException;
|
|
|
import java.io.StringReader;
|
|
|
import java.io.StringWriter;
|
|
|
+import java.io.Writer;
|
|
|
import java.util.Optional;
|
|
|
|
|
|
-import org.junit.jupiter.api.BeforeEach;
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
+import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
+import org.junit.platform.runner.JUnitPlatform;
|
|
|
+import org.junit.runner.RunWith;
|
|
|
import org.leumasjaffe.recipe.model.Recipe;
|
|
|
import org.mockito.ArgumentCaptor;
|
|
|
import org.mockito.InOrder;
|
|
|
+import org.mockito.InjectMocks;
|
|
|
import org.mockito.Mock;
|
|
|
-import org.mockito.MockitoAnnotations;
|
|
|
+import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
|
|
-class FileControllerTest {
|
|
|
- @SuppressWarnings("serial")
|
|
|
- private static abstract class StubComponent extends Component implements FileController.Model {}
|
|
|
-
|
|
|
- StubComponent stub;
|
|
|
- FileController<StubComponent> controller;
|
|
|
-
|
|
|
- @BeforeEach
|
|
|
- void setUp() {
|
|
|
- stub = mock(StubComponent.class);
|
|
|
- controller = spy(new FileController<>(stub));
|
|
|
- // Make sure that any errors are directed into the test case's failure trace,
|
|
|
- // rather than a JOptionDialog
|
|
|
- doAnswer(inv -> { throw inv.getArgument(0, Exception.class); })
|
|
|
- .when(controller).errorPopup(any());
|
|
|
- }
|
|
|
+@ExtendWith(MockitoExtension.class)
|
|
|
+@RunWith(JUnitPlatform.class)
|
|
|
+class FileControllerTest {
|
|
|
+ @Mock SaveLoadHandle handle;
|
|
|
+ @Mock FileController.ViewModel viewmodel;
|
|
|
+ @InjectMocks FileController controller;
|
|
|
|
|
|
@Test
|
|
|
void testCanCreateNewModel() {
|
|
|
controller.create();
|
|
|
- verify(stub).setModel(any(Recipe.class));
|
|
|
+ verify(viewmodel).setModel(any(Recipe.class));
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
void testRepeatedCreatesProvideNewObjects() {
|
|
|
- InOrder inOrder = inOrder(stub);
|
|
|
+ InOrder inOrder = inOrder(viewmodel);
|
|
|
final ArgumentCaptor<Recipe> first = ArgumentCaptor.forClass(Recipe.class);
|
|
|
final ArgumentCaptor<Recipe> second = ArgumentCaptor.forClass(Recipe.class);
|
|
|
|
|
|
controller.create();
|
|
|
- inOrder.verify(stub).setModel(first.capture());
|
|
|
+ inOrder.verify(viewmodel).setModel(first.capture());
|
|
|
|
|
|
controller.create();
|
|
|
- inOrder.verify(stub).setModel(second.capture());
|
|
|
+ inOrder.verify(viewmodel).setModel(second.capture());
|
|
|
|
|
|
assertNotSame(first.getValue(), second.getValue());
|
|
|
}
|
|
|
@@ -57,32 +51,73 @@ class FileControllerTest {
|
|
|
@Test
|
|
|
void testOpensContentIntoRecipe() {
|
|
|
final String data = "{ \"title\": \"Example\" }";
|
|
|
- doReturn(Optional.of(new StringReader(data))).when(controller).getOpened();
|
|
|
+ doReturn(Optional.of(new StringReader(data))).when(handle).reader();
|
|
|
|
|
|
controller.open();
|
|
|
|
|
|
- verify(stub).setModel(argThat(r -> r.getTitle().equals("Example")));
|
|
|
+ verify(viewmodel).setModel(argThat(r -> r.getTitle().equals("Example")));
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
void testEmitsErrorWithMalformedData() {
|
|
|
final String data = "{ \"name\": \"Example\" }";
|
|
|
- doReturn(Optional.of(new StringReader(data))).when(controller).getOpened();
|
|
|
- doNothing().when(controller).errorPopup(any());
|
|
|
+ doReturn(Optional.of(new StringReader(data))).when(handle).reader();
|
|
|
+ doNothing().when(handle).error(any());
|
|
|
|
|
|
controller.open();
|
|
|
|
|
|
- verify(controller).errorPopup(any());
|
|
|
+ verify(handle).error(any());
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
void testCanWriteRecipeToStream() {
|
|
|
StringWriter writer = new StringWriter();
|
|
|
- doReturn(Optional.of(writer)).when(controller).getSaved();
|
|
|
+ doReturn(Optional.of(writer)).when(handle).writer();
|
|
|
|
|
|
controller.create();
|
|
|
controller.save();
|
|
|
assertNotEquals("", writer.toString());
|
|
|
}
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void testSaveAsClearsHandle() {
|
|
|
+ StringWriter writer = new StringWriter();
|
|
|
+ doReturn(Optional.of(writer)).when(handle).writer();
|
|
|
+
|
|
|
+ controller.create();
|
|
|
+ controller.saveAs();
|
|
|
+ verify(handle).clear();
|
|
|
+ assertNotEquals("", writer.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void testWriteErrorCallsHandle() {
|
|
|
+ Writer writer = mock(Writer.class, inv -> { throw new IOException(); });
|
|
|
+
|
|
|
+ doReturn(Optional.of(writer)).when(handle).writer();
|
|
|
+ doNothing().when(handle).error(any());
|
|
|
+
|
|
|
+ controller.create();
|
|
|
+ controller.save();
|
|
|
+ verify(handle).error(any());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void testDoesNothingIfHandleReturnsMissingReader() {
|
|
|
+ doReturn(Optional.empty()).when(handle).reader();
|
|
|
+
|
|
|
+ controller.open();
|
|
|
+ verify(viewmodel, never()).setModel(any());
|
|
|
+ verify(handle, never()).error(any());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void testDoesNothingIfHandleReturnsMissingWriter() {
|
|
|
+ doReturn(Optional.empty()).when(handle).writer();
|
|
|
+
|
|
|
+ controller.create();
|
|
|
+ controller.save();
|
|
|
+ verify(handle, never()).error(any());
|
|
|
+ }
|
|
|
|
|
|
}
|