cf52c1f8b3eebc0d2c5e6d48e5920eaea7c6297a
[demos/kafka/wordcount] / src / test / java / de / juplo / kafka / wordcount / top10 / TestData.java
1 package de.juplo.kafka.wordcount.top10;
2
3 import de.juplo.kafka.wordcount.counter.TestCounter;
4 import de.juplo.kafka.wordcount.counter.TestWord;
5 import de.juplo.kafka.wordcount.query.TestEntry;
6 import de.juplo.kafka.wordcount.query.TestRanking;
7 import de.juplo.kafka.wordcount.query.TestUser;
8 import org.apache.kafka.streams.KeyValue;
9 import org.apache.kafka.streams.state.ReadOnlyKeyValueStore;
10 import org.springframework.util.LinkedMultiValueMap;
11 import org.springframework.util.MultiValueMap;
12
13 import java.util.Arrays;
14 import java.util.stream.Stream;
15
16 import static org.assertj.core.api.Assertions.assertThat;
17
18
19 class TestData
20 {
21         static final TestUser PETER = TestUser.of("peter");
22         static final TestUser KLAUS = TestUser.of("klaus");
23
24         static final KeyValue<TestWord, TestCounter>[] INPUT_MESSAGES = new KeyValue[]
25         {
26                         new KeyValue<>(
27                                         TestWord.of(PETER.getUser(),"Hallo"),
28                                         TestCounter.of(PETER.getUser(),"Hallo",1)),
29                         new KeyValue<>(
30                                         TestWord.of(KLAUS.getUser(),"Müsch"),
31                                         TestCounter.of(KLAUS.getUser(),"Müsch",1)),
32                         new KeyValue<>(
33                                         TestWord.of(PETER.getUser(),"Welt"),
34                                         TestCounter.of(PETER.getUser(),"Welt",1)),
35                         new KeyValue<>(
36                                         TestWord.of(KLAUS.getUser(),"Müsch"),
37                                         TestCounter.of(KLAUS.getUser(),"Müsch",2)),
38                         new KeyValue<>(
39                                         TestWord.of(KLAUS.getUser(),"s"),
40                                         TestCounter.of(KLAUS.getUser(),"s",1)),
41                         new KeyValue<>(
42                                         TestWord.of(PETER.getUser(),"Boäh"),
43                                         TestCounter.of(PETER.getUser(),"Boäh",1)),
44                         new KeyValue<>(
45                                         TestWord.of(PETER.getUser(),"Welt"),
46                                         TestCounter.of(PETER.getUser(),"Welt",2)),
47                         new KeyValue<>(
48                                         TestWord.of(PETER.getUser(),"Boäh"),
49                                         TestCounter.of(PETER.getUser(),"Boäh",2)),
50                         new KeyValue<>(
51                                         TestWord.of(KLAUS.getUser(),"s"),
52                                         TestCounter.of(KLAUS.getUser(),"s",2)),
53                         new KeyValue<>(
54                                         TestWord.of(PETER.getUser(),"Boäh"),
55                                         TestCounter.of(PETER.getUser(),"Boäh",3)),
56                         new KeyValue<>(
57                                         TestWord.of(KLAUS.getUser(),"s"),
58                                         TestCounter.of(KLAUS.getUser(),"s",3)),
59         };
60
61         static void assertExpectedMessages(MultiValueMap<TestUser, TestRanking> receivedMessages)
62         {
63                 expectedMessages().forEach(
64                                 (user, rankings) ->
65                                                 assertThat(receivedMessages.get(user))
66                                                                 .containsExactlyElementsOf(rankings));
67         }
68
69         static void assertExpectedState(ReadOnlyKeyValueStore<User, Ranking> store)
70         {
71                 assertRankingEqualsRankingFromLastMessage(PETER, store.get(userOf(PETER)));
72                 assertRankingEqualsRankingFromLastMessage(KLAUS, store.get(userOf(KLAUS)));
73         }
74
75         static User userOf(TestUser user)
76         {
77                 return User.of(user.getUser());
78         }
79
80         static void assertExpectedNumberOfMessagesForUsers(MultiValueMap<TestUser, TestRanking> receivedMessages)
81         {
82                 assertThat(countMessagesForUser(PETER, receivedMessages));
83                 assertThat(countMessagesForUser(KLAUS, receivedMessages));
84         }
85
86         static int countMessagesForUser(TestUser user, MultiValueMap<TestUser, TestRanking> messagesForUsers)
87         {
88                 return messagesForUsers.get(user) == null
89                                 ? 0
90                                 : messagesForUsers.get(user).size();
91         }
92
93
94         static void assertExpectedLastMessagesForUsers(MultiValueMap<TestUser, TestRanking> receivedMessages)
95         {
96                 assertRankingEqualsRankingFromLastMessage(PETER, getLastMessageFor(PETER, receivedMessages));
97                 assertRankingEqualsRankingFromLastMessage(KLAUS, getLastMessageFor(KLAUS, receivedMessages));
98         }
99
100         static void assertRankingEqualsRankingFromLastMessage(TestUser user, Ranking ranking)
101         {
102                 TestRanking testRanking = TestRanking.of(testEntriesOf(ranking.getEntries()));
103                 assertRankingEqualsRankingFromLastMessage(user, testRanking);
104         }
105
106         static TestEntry[] testEntriesOf(Entry... entries)
107         {
108                 return Arrays
109                                 .stream(entries)
110                                 .map(entry -> TestEntry.of(
111                                                 entry.getWord(),
112                                                 entry.getCounter() == null
113                                                                 ? -1l
114                                                                 : entry.getCounter()))
115                                 .toArray(size -> new TestEntry[size]);
116         }
117
118         static void assertRankingEqualsRankingFromLastMessage(TestUser user, TestRanking ranking)
119         {
120                 assertThat(ranking).isEqualTo(getLastMessageFor(user));
121         }
122
123         static TestRanking getLastMessageFor(TestUser user)
124         {
125                 return getLastMessageFor(user, expectedMessages());
126         }
127
128         static TestRanking getLastMessageFor(TestUser user, MultiValueMap<TestUser, TestRanking> messagesForUsers)
129         {
130                 return messagesForUsers
131                                 .get(user)
132                                 .stream()
133                                 .reduce(null, (left, right) -> right);
134         }
135
136         static KeyValue<TestUser, TestRanking>[] EXPECTED_MESSAGES = new KeyValue[]
137         {
138                         KeyValue.pair( // 0
139                                         PETER,
140                                         TestRanking.of(
141                                                         TestEntry.of("Hallo", 1l))),
142                         KeyValue.pair( // 1
143                                         KLAUS,
144                                         TestRanking.of(
145                                                         TestEntry.of("Müsch", 1l))),
146                         KeyValue.pair( // 2
147                                         PETER,
148                                         TestRanking.of(
149                                                         TestEntry.of("Hallo", 1l),
150                                                         TestEntry.of("Welt", 1l))),
151                         KeyValue.pair( // 3
152                                         KLAUS,
153                                         TestRanking.of(
154                                                         TestEntry.of("Müsch", 2l))),
155                         KeyValue.pair( // 4
156                                         KLAUS,
157                                         TestRanking.of(
158                                                         TestEntry.of("Müsch", 2l),
159                                                         TestEntry.of("s", 1l))),
160                         KeyValue.pair( // 5
161                                         PETER,
162                                         TestRanking.of(
163                                                         TestEntry.of("Hallo", 1l),
164                                                         TestEntry.of("Welt", 1l),
165                                                         TestEntry.of("Boäh", 1l))),
166                         KeyValue.pair( // 6
167                                         PETER,
168                                         TestRanking.of(
169                                                         TestEntry.of("Welt", 2l),
170                                                         TestEntry.of("Hallo", 1l),
171                                                         TestEntry.of("Boäh", 1l))),
172                         KeyValue.pair( // 7
173                                         PETER,
174                                         TestRanking.of(
175                                                         TestEntry.of("Welt", 2l),
176                                                         TestEntry.of("Boäh", 2l),
177                                                         TestEntry.of("Hallo", 1l))),
178                         KeyValue.pair( // 8
179                                         KLAUS,
180                                         TestRanking.of(
181                                                         TestEntry.of("Müsch", 2l),
182                                                         TestEntry.of("s", 2l))),
183                         KeyValue.pair( // 9
184                                         PETER,
185                                         TestRanking.of(
186                                                         TestEntry.of("Boäh", 3l),
187                                                         TestEntry.of("Welt", 2l),
188                                                         TestEntry.of("Hallo", 1l))),
189                         KeyValue.pair( // 10
190                                         KLAUS,
191                                         TestRanking.of(
192                                                         TestEntry.of("s", 3l),
193                                                         TestEntry.of("Müsch", 2l))),
194         };
195
196         static MultiValueMap<TestUser, TestRanking> expectedMessages()
197         {
198                 MultiValueMap<TestUser, TestRanking> expectedMessages = new LinkedMultiValueMap<>();
199                 Stream
200                                 .of(EXPECTED_MESSAGES)
201                                 .forEach(keyValue -> expectedMessages.add(keyValue.key, keyValue.value));
202                 return expectedMessages;
203         }
204 }