View Javadoc
1   package io.github.magwas.inez.element.tests;
2   
3   import static org.junit.jupiter.api.Assertions.assertEquals;
4   import static org.junit.jupiter.api.Assertions.assertThrows;
5   import static org.mockito.Mockito.times;
6   import static org.mockito.Mockito.verify;
7   
8   import java.text.MessageFormat;
9   import java.util.List;
10  
11  import org.junit.jupiter.api.BeforeEach;
12  import org.junit.jupiter.api.DisplayName;
13  import org.junit.jupiter.api.Test;
14  import org.mockito.ArgumentCaptor;
15  import org.mockito.InjectMocks;
16  
17  import io.github.magwas.inez.Bridi;
18  import io.github.magwas.inez.element.BridiElement;
19  import io.github.magwas.inez.element.CreateBridiElementService;
20  import io.github.magwas.inez.storage.SaveBridiService;
21  import io.github.magwas.konveyor.testing.TestBase;
22  import io.github.magwas.konveyor.testing.TestUtil;
23  
24  class CreateBridiElementServiceTest extends TestBase implements BridiElementTestData {
25  
26  	@InjectMocks
27  	CreateBridiElementService createBridiElement;
28  
29  	private BridiElement element;
30  	private List<Bridi> saved;
31  
32  	@BeforeEach
33  	@Override
34  	public void setUp() throws Throwable {
35  		super.setUp();
36  		element = createBridiElement.apply(MY_MODEL_ID, HUMAN_ID, ALICE_REPR);
37  		@SuppressWarnings("unchecked")
38  		ArgumentCaptor<List<Bridi>> argument = ArgumentCaptor.forClass(List.class);
39  		SaveBridiService saveBridi = TestUtil.dependency(createBridiElement, SaveBridiService.class);
40  		verify(saveBridi).apply(argument.capture());
41  		saved = argument.getValue();
42  	}
43  
44  	@Test
45  	@DisplayName("saves 3 bridis")
46  	void test0() {
47  		assertEquals(3, saved.size());
48  	}
49  
50  	@Test
51  	@DisplayName("the first one is the element")
52  	void test1() {
53  		String elementId = element.id;
54  		assertEquals(elementId, saved.getFirst().id());
55  	}
56  
57  	@Test
58  	@DisplayName("with the given representation")
59  	void test2() {
60  		assertEquals(ALICE_REPR, saved.getFirst().representation());
61  	}
62  
63  	@Test
64  	@DisplayName("and the given rerferences")
65  	void test3() {
66  		assertEquals(List.of(), saved.getFirst().references());
67  	}
68  
69  	@Test
70  	@DisplayName("the second one is '{@elementId} is a {@typeId}' ")
71  	void test4() {
72  		assertEquals(List.of(IS_A_ID, element.id, HUMAN_ID), saved.get(1).references());
73  	}
74  
75  	@Test
76  	@DisplayName("the representation of the second one uses actual representations")
77  	void test4_1() {
78  		assertEquals(
79  				MessageFormat.format("{0} is a {1}", ALICE_REPR, HUMAN_REPR),
80  				saved.get(1).representation());
81  	}
82  
83  	@Test
84  	@DisplayName("the third one is '{@containerId} contains {@elementId}' ")
85  	void test5() {
86  		assertEquals(List.of(CONTAINS_ID, MY_MODEL_ID, element.id), saved.get(2).references());
87  	}
88  
89  	@Test
90  	@DisplayName("the representation of the third one uses actual representations")
91  	void test5_1() {
92  		assertEquals(
93  				MessageFormat.format("{0} contains {1}", MY_MODEL_REPR, ALICE_REPR),
94  				saved.get(2).representation());
95  	}
96  
97  	@Test
98  	@DisplayName("the references are saved")
99  	void test6() throws IllegalAccessException {
100 		createBridiElement.apply(MY_MODEL_ID, HUMAN_ID, ALICE_REPR, IS_A_ID, ALICE_ID, GOD_ID);
101 		@SuppressWarnings("unchecked")
102 		ArgumentCaptor<List<Bridi>> argument = ArgumentCaptor.forClass(List.class);
103 		verify(TestUtil.dependency(createBridiElement, SaveBridiService.class), times(2))
104 				.apply(argument.capture());
105 		List<Bridi> saved = argument.getValue();
106 		assertEquals(3, saved.size());
107 		assertEquals(List.of(IS_A_ID, ALICE_ID, GOD_ID), saved.get(0).references());
108 	}
109 
110 	@Test
111 	@DisplayName("if the type does not exist, an IllegalArgumentException is thrown")
112 	void test7() {
113 		assertThrows(
114 				IllegalArgumentException.class,
115 				() -> createBridiElement.apply(MY_MODEL_ID, NONEXISTENT_ID, ALICE_REPR, IS_A_ID, ALICE_ID, GOD_ID));
116 	}
117 
118 	@Test
119 	@DisplayName("if the container does not exist, an IllegalArgumentException is thrown")
120 	void test8() {
121 		assertThrows(
122 				IllegalArgumentException.class,
123 				() -> createBridiElement.apply(NONEXISTENT_ID, HUMAN_ID, ALICE_REPR, IS_A_ID, ALICE_ID, GOD_ID));
124 	}
125 
126 	@Test
127 	@DisplayName("if the there is a nonexisting reference, an IllegalArgumentException is thrown")
128 	void test9() {
129 		assertThrows(
130 				IllegalArgumentException.class,
131 				() -> createBridiElement.apply(MY_MODEL_ID, HUMAN_ID, ALICE_REPR, NONEXISTENT_ID, ALICE_ID, GOD_ID));
132 	}
133 }