|
@@ -22,27 +22,117 @@
|
22
|
22
|
|
23
|
23
|
package com.dmdirc.parser.irc.processors;
|
24
|
24
|
|
25
|
|
-import com.dmdirc.harness.parser.TestParser;
|
|
25
|
+import com.dmdirc.parser.common.ParserError;
|
|
26
|
+import com.dmdirc.parser.irc.IRCClientInfo;
|
|
27
|
+import com.dmdirc.parser.irc.IRCParser;
|
|
28
|
+import com.dmdirc.parser.irc.ProcessingManager;
|
|
29
|
+
|
|
30
|
+import org.junit.Before;
|
26
|
31
|
import org.junit.Test;
|
27
|
|
-import static org.junit.Assert.*;
|
|
32
|
+import org.junit.runner.RunWith;
|
|
33
|
+import org.mockito.ArgumentCaptor;
|
|
34
|
+import org.mockito.Mock;
|
|
35
|
+import org.mockito.runners.MockitoJUnitRunner;
|
|
36
|
+
|
|
37
|
+import static org.junit.Assert.assertEquals;
|
|
38
|
+import static org.junit.Assert.assertTrue;
|
|
39
|
+import static org.junit.Assume.assumeFalse;
|
|
40
|
+import static org.mockito.Matchers.any;
|
|
41
|
+import static org.mockito.Matchers.anyBoolean;
|
|
42
|
+import static org.mockito.Matchers.anyString;
|
|
43
|
+import static org.mockito.Matchers.eq;
|
|
44
|
+import static org.mockito.Mockito.doAnswer;
|
|
45
|
+import static org.mockito.Mockito.mock;
|
|
46
|
+import static org.mockito.Mockito.never;
|
|
47
|
+import static org.mockito.Mockito.verify;
|
|
48
|
+import static org.mockito.Mockito.when;
|
28
|
49
|
|
|
50
|
+@RunWith(MockitoJUnitRunner.class)
|
29
|
51
|
public class Process001Test {
|
30
|
|
-
|
|
52
|
+
|
|
53
|
+ @Mock private IRCParser parser;
|
|
54
|
+ @Mock private ProcessingManager processingManager;
|
|
55
|
+ @Mock private IRCClientInfo localClient;
|
|
56
|
+ private Process001 processor;
|
|
57
|
+
|
|
58
|
+ @Before
|
|
59
|
+ public void setup() {
|
|
60
|
+ when(parser.getLocalClient()).thenReturn(localClient);
|
|
61
|
+ processor = new Process001(parser, processingManager);
|
|
62
|
+ }
|
|
63
|
+
|
|
64
|
+ @Test
|
|
65
|
+ public void testSets001Received() {
|
|
66
|
+ when(localClient.isFake()).thenReturn(true);
|
|
67
|
+ assumeFalse(parser.got001);
|
|
68
|
+ processor.process("001", ":test.server.com", "001", "userName", "Hello!");
|
|
69
|
+ assertTrue(parser.got001);
|
|
70
|
+ }
|
|
71
|
+
|
|
72
|
+ @Test
|
|
73
|
+ public void testUpdatesServerName() {
|
|
74
|
+ when(localClient.isFake()).thenReturn(true);
|
|
75
|
+ processor.process("001", ":test.server.com", "001", "userName", "Hello!");
|
|
76
|
+ verify(parser).updateServerName("test.server.com");
|
|
77
|
+ }
|
|
78
|
+
|
|
79
|
+ @Test
|
|
80
|
+ public void testAddsLocalClientIfFake() {
|
|
81
|
+ when(localClient.isFake()).thenReturn(true);
|
|
82
|
+ processor.process("001", ":test.server.com", "001", "userName", "Hello!");
|
|
83
|
+ verify(parser).addClient(localClient);
|
|
84
|
+ }
|
|
85
|
+
|
31
|
86
|
@Test
|
32
|
|
- public void testDuplicate001() {
|
33
|
|
- final TestParser tp = new TestParser();
|
34
|
|
-
|
35
|
|
- assertTrue(tp.getLocalClient().isFake());
|
36
|
|
-
|
37
|
|
- tp.injectConnectionStrings();
|
38
|
|
-
|
39
|
|
- assertEquals("nick", tp.getLocalClient().getNickname());
|
40
|
|
- assertFalse(tp.getLocalClient().isFake());
|
41
|
|
-
|
42
|
|
- tp.injectLine(":server 001 nick2 :Crazy second 001 for you, nick2");
|
43
|
|
-
|
44
|
|
- assertEquals("nick2", tp.getLocalClient().getNickname());
|
45
|
|
- assertFalse(tp.getLocalClient().isFake());
|
|
87
|
+ public void testUpdatesLocalClientIfFake() {
|
|
88
|
+ when(localClient.isFake()).thenReturn(true);
|
|
89
|
+ processor.process("001", ":test.server.com", "001", "userName", "Hello!");
|
|
90
|
+ verify(localClient).setUserBits(eq("userName"), eq(true), anyBoolean());
|
|
91
|
+ verify(localClient).setFake(false);
|
|
92
|
+ }
|
|
93
|
+
|
|
94
|
+ @Test
|
|
95
|
+ public void testIgnoresDuplicate001WithSameNick() {
|
|
96
|
+ when(localClient.getNickname()).thenReturn("UsernaME");
|
|
97
|
+ processor.process("001", ":test.server.com", "001", "userName", "Hello!");
|
|
98
|
+ verify(parser, never()).addClient(any());
|
|
99
|
+ verify(parser, never()).forceRemoveClient(any());
|
|
100
|
+ }
|
|
101
|
+
|
|
102
|
+ @Test
|
|
103
|
+ public void testReplacesLocalUserOnDuplicate001() {
|
|
104
|
+ when(localClient.getNickname()).thenReturn("UsernaME");
|
|
105
|
+ processor.process("001", ":test.server.com", "001", "newName", "Hello!");
|
|
106
|
+ verify(parser).forceRemoveClient(localClient);
|
|
107
|
+ verify(localClient).setUserBits(eq("newName"), eq(true), anyBoolean());
|
|
108
|
+ verify(parser).addClient(localClient);
|
|
109
|
+ }
|
|
110
|
+
|
|
111
|
+ @Test
|
|
112
|
+ public void testRaisesFatalErrorIfDuplicate001CausesNicknameCollision() {
|
|
113
|
+ setupLocalClientToTrackNicknameChanges();
|
|
114
|
+
|
|
115
|
+ when(parser.isKnownClient("newName")).thenReturn(true);
|
|
116
|
+ when(parser.getClient("newName")).thenReturn(mock(IRCClientInfo.class));
|
|
117
|
+
|
|
118
|
+ processor.process("001", ":test.server.com", "001", "newName", "Hello!");
|
|
119
|
+
|
|
120
|
+ final ArgumentCaptor<ParserError> errorCaptor = ArgumentCaptor.forClass(ParserError.class);
|
|
121
|
+ verify(parser).callErrorInfo(errorCaptor.capture());
|
|
122
|
+ assertEquals(ParserError.ERROR_FATAL, errorCaptor.getValue().getLevel());
|
|
123
|
+ }
|
|
124
|
+
|
|
125
|
+ /**
|
|
126
|
+ * Ensures that the local client mock returns new nicknames after setUserBits is called.
|
|
127
|
+ */
|
|
128
|
+ private void setupLocalClientToTrackNicknameChanges() {
|
|
129
|
+ final StringBuilder nickname = new StringBuilder("UserName");
|
|
130
|
+ when(localClient.getNickname()).thenAnswer(invocation -> nickname.toString());
|
|
131
|
+ doAnswer(invocation -> {
|
|
132
|
+ nickname.setLength(0);
|
|
133
|
+ nickname.append(invocation.getArgumentAt(0, String.class));
|
|
134
|
+ return null;
|
|
135
|
+ }).when(localClient).setUserBits(anyString(), eq(true), anyBoolean());
|
46
|
136
|
}
|
47
|
137
|
|
48
|
138
|
}
|