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 }