1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
defmodule ExIRC.ChannelsTest do
use ExUnit.Case, async: true
alias ExIRC.Channels, as: Channels
test "Joining a channel adds it to the tree of currently joined channels" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.channels
assert Enum.member?(channels, "#testchannel")
end
test "The channel name is downcased when joining" do
channels = Channels.init() |> Channels.join("#TestChannel") |> Channels.channels
assert Enum.member?(channels, "#testchannel")
end
test "Joining the same channel twice is a noop" do
channels = Channels.init() |> Channels.join("#TestChannel") |> Channels.join("#testchannel") |> Channels.channels
assert 1 == Enum.count(channels)
end
test "Parting a channel removes it from the tree of currently joined channels" do
tree = Channels.init() |> Channels.join("#testchannel")
assert Enum.member?(Channels.channels(tree), "#testchannel")
tree = Channels.part(tree, "#testchannel")
refute Enum.member?(Channels.channels(tree), "#testchannel")
end
test "Parting a channel not in the tree is a noop" do
tree = Channels.init()
{count, _} = Channels.part(tree, "#testchannel")
assert 0 == count
end
test "Can set the topic for a channel" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.set_topic("#testchannel", "Welcome to Test Channel!")
assert "Welcome to Test Channel!" == Channels.channel_topic(channels, "#testchannel")
end
test "Setting the topic for a channel we haven't joined returns :error" do
channels = Channels.init() |> Channels.set_topic("#testchannel", "Welcome to Test Channel!")
assert {:error, :no_such_channel} == Channels.channel_topic(channels, "#testchannel")
end
test "Can set the channel type" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.set_type("#testchannel", "@")
assert :secret == Channels.channel_type(channels, "#testchannel")
channels = Channels.set_type(channels, "#testchannel", "*")
assert :private == Channels.channel_type(channels, "#testchannel")
channels = Channels.set_type(channels, "#testchannel", "=")
assert :public == Channels.channel_type(channels, "#testchannel")
end
test "Setting the channel type for a channel we haven't joined returns :error" do
channels = Channels.init() |> Channels.set_type("#testchannel", "@")
assert {:error, :no_such_channel} == Channels.channel_type(channels, "#testchannel")
end
test "Setting an invalid channel type raises CaseClauseError" do
assert_raise CaseClauseError, "no case clause matching: '!'", fn ->
Channels.init() |> Channels.join("#testchannel") |> Channels.set_type("#testchannel", "!")
end
end
test "Can join a user to a channel" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.user_join("#testchannel", "testnick")
assert Channels.channel_has_user?(channels, "#testchannel", "testnick")
end
test "Can join multiple users to a channel" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.users_join("#testchannel", ["testnick", "anothernick"])
assert Channels.channel_has_user?(channels, "#testchannel", "testnick")
assert Channels.channel_has_user?(channels, "#testchannel", "anothernick")
end
test "Strips rank designations from nicks" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.users_join("#testchannel", ["+testnick", "@anothernick", "&athirdnick", "%somanynicks", "~onemorenick"])
assert Channels.channel_has_user?(channels, "#testchannel", "testnick")
assert Channels.channel_has_user?(channels, "#testchannel", "anothernick")
assert Channels.channel_has_user?(channels, "#testchannel", "athirdnick")
assert Channels.channel_has_user?(channels, "#testchannel", "somanynicks")
assert Channels.channel_has_user?(channels, "#testchannel", "onemorenick")
end
test "Joining a users to a channel we aren't in is a noop" do
channels = Channels.init() |> Channels.user_join("#testchannel", "testnick")
assert {:error, :no_such_channel} == Channels.channel_has_user?(channels, "#testchannel", "testnick")
channels = Channels.init() |> Channels.users_join("#testchannel", ["testnick", "anothernick"])
assert {:error, :no_such_channel} == Channels.channel_has_user?(channels, "#testchannel", "testnick")
end
test "Can part a user from a channel" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.user_join("#testchannel", "testnick")
assert Channels.channel_has_user?(channels, "#testchannel", "testnick")
channels = channels |> Channels.user_part("#testchannel", "testnick")
refute Channels.channel_has_user?(channels, "#testchannel", "testnick")
end
test "Parting a user from a channel we aren't in is a noop" do
channels = Channels.init() |> Channels.user_part("#testchannel", "testnick")
assert {:error, :no_such_channel} == Channels.channel_has_user?(channels, "#testchannel", "testnick")
end
test "Can quit a user from all channels" do
channels =
Channels.init()
|> Channels.join("#testchannel")
|> Channels.user_join("#testchannel", "testnick")
|> Channels.join("#anotherchannel")
|> Channels.user_join("#anotherchannel", "testnick")
|> Channels.user_join("#anotherchannel", "secondnick")
assert Channels.channel_has_user?(channels, "#testchannel", "testnick")
channels = channels |> Channels.user_quit("testnick")
refute Channels.channel_has_user?(channels, "#testchannel", "testnick")
refute Channels.channel_has_user?(channels, "#anotherchannel", "testnick")
assert Channels.channel_has_user?(channels, "#anotherchannel", "secondnick")
end
test "Can rename a user" do
channels = Channels.init()
|> Channels.join("#testchannel")
|> Channels.join("#anotherchan")
|> Channels.user_join("#testchannel", "testnick")
|> Channels.user_join("#anotherchan", "testnick")
assert Channels.channel_has_user?(channels, "#testchannel", "testnick")
assert Channels.channel_has_user?(channels, "#anotherchan", "testnick")
channels = Channels.user_rename(channels, "testnick", "newnick")
refute Channels.channel_has_user?(channels, "#testchannel", "testnick")
refute Channels.channel_has_user?(channels, "#anotherchan", "testnick")
assert Channels.channel_has_user?(channels, "#testchannel", "newnick")
assert Channels.channel_has_user?(channels, "#anotherchan", "newnick")
end
test "Renaming a user that doesn't exist is a noop" do
channels = Channels.init() |> Channels.join("#testchannel") |> Channels.user_rename("testnick", "newnick")
refute Channels.channel_has_user?(channels, "#testchannel", "testnick")
refute Channels.channel_has_user?(channels, "#testchannel", "newnick")
end
test "Can get the current set of channel data as a tuple of the channel name and it's data as a proplist" do
channels = Channels.init()
|> Channels.join("#testchannel")
|> Channels.set_type("#testchannel", "@")
|> Channels.set_topic("#testchannel", "Welcome to Test!")
|> Channels.join("#anotherchan")
|> Channels.set_type("#anotherchan", "=")
|> Channels.set_topic("#anotherchan", "Welcome to Another Channel!")
|> Channels.user_join("#testchannel", "testnick")
|> Channels.user_join("#anotherchan", "testnick")
|> Channels.to_proplist
testchannel = {"#testchannel", [users: ["testnick"], topic: "Welcome to Test!", type: :secret]}
anotherchan = {"#anotherchan", [users: ["testnick"], topic: "Welcome to Another Channel!", type: :public]}
assert [testchannel, anotherchan] == channels
end
end
|