summaryrefslogtreecommitdiff
path: root/test/channels_test.exs
blob: b29551b54e26c4e4b61d4635b218dbfc5183d3f6 (plain) (blame)
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