浏览代码

Write integration tests for PhasePanel

Sam Jaffe 5 年之前
父节点
当前提交
de9e38f340

+ 3 - 1
src/main/lombok/org/leumasjaffe/recipe/view/PhasePanel.java

@@ -12,6 +12,7 @@ import org.leumasjaffe.recipe.model.Phase;
 import org.leumasjaffe.recipe.model.Step;
 
 import lombok.AccessLevel;
+import lombok.Getter;
 import lombok.experimental.FieldDefaults;
 
 import org.jdesktop.swingx.VerticalLayout;
@@ -21,7 +22,7 @@ import org.jdesktop.swingx.VerticalLayout;
 public class PhasePanel extends JPanel {
 	ForwardingObservableListener<Phase> listener = new ForwardingObservableListener<>();
 
-	AutoGrowPanel panelSteps;
+	@Getter(AccessLevel.PACKAGE) AutoGrowPanel panelSteps;
 	
 	public PhasePanel(final Phase phase) {		
 		setLayout(new VerticalLayout(5));
@@ -35,6 +36,7 @@ public class PhasePanel extends JPanel {
 				step -> {
 					steps.add(step);
 					listener.setObserved(phase, allChildren(phase));
+					ObserverDispatch.notifySubscribers(phase);
 				},
 				i -> {
 					steps.remove(i);

+ 86 - 0
src/test/java/org/leumasjaffe/recipe/view/PhasePanelIT.java

@@ -0,0 +1,86 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.mockito.Mockito.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.leumasjaffe.mock.MockObserverListener;
+import org.leumasjaffe.observer.ObserverDispatch;
+import org.leumasjaffe.recipe.model.Phase;
+import org.leumasjaffe.recipe.model.Step;
+import org.mockito.Spy;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+class PhasePanelIT extends SwingTestCase {
+	@Spy MockObserverListener listener;
+	List<Step> steps;
+	@Spy Phase stuff;
+	PhasePanel panel;
+
+	@BeforeEach
+	void setUp() {
+		Step step = new Step();
+		step.setInstruction("Dance");
+		steps = new ArrayList<>(Arrays.asList(step));
+		doReturn(steps).when(stuff).getCooking();
+				
+		panel = new PhasePanel(stuff);
+		listener.setObserved(stuff);
+		// setObserved invokes our callback.
+		clearInvocations(listener);
+	}
+
+	@Test
+	void testRecievesSignalWhenNewElementAdded() {
+		final StepPanel newIngredient =
+				(StepPanel) panel.getPanelSteps().getComponent(1);
+		
+		newIngredient.getTxtpnInstructions().setText("Bacon");
+		waitForSwing();
+		
+		verify(listener, times(1)).updateWasSignalled();
+	}
+
+	@Test
+	void testNewItemCanProduceUpdate() {
+		final StepPanel newIngredient =
+				(StepPanel) panel.getPanelSteps().getComponent(1);
+		newIngredient.getTxtpnInstructions().setText("Bacon");
+		waitForSwing();
+
+		ObserverDispatch.notifySubscribers(steps.get(1));
+		
+		verify(listener, times(2)).updateWasSignalled();
+	}
+
+	@Test
+	void testReceivesSignalWhenElementRemoved() {
+		final StepPanel oldIngredient =
+				(StepPanel) panel.getPanelSteps().getComponent(0);
+		oldIngredient.getTxtpnInstructions().setText("");
+		waitForSwing();
+
+		verify(listener, times(1)).updateWasSignalled();
+	}
+
+	@Test
+	void testIgnoresOldItemUpdates() {
+		final Step st = steps.get(0);
+		final StepPanel oldIngredient =
+				(StepPanel) panel.getPanelSteps().getComponent(0);
+		oldIngredient.getTxtpnInstructions().setText("");
+
+		waitForSwing();
+		clearInvocations(listener);
+
+		ObserverDispatch.notifySubscribers(st);
+		verify(listener, never()).updateWasSignalled();
+	}
+
+}

+ 2 - 0
src/test/java/org/leumasjaffe/recipe/view/StepPanelTest.java

@@ -49,6 +49,8 @@ class StepPanelTest extends SwingTestCase {
 		assertThat(panel.getPanelIngredients().getComponents(),
 				arrayWithSize(greaterThanOrEqualTo(1)));
 	}
+	
+	// TODO: Write tests for modifying the txtpnInstructions
 
 	@Test
 	void testPropogatesNotifications() {