1
0
mirror of https://github.com/shazow/ssh-chat.git synced 2025-05-09 19:51:05 +03:00

tests: Add chat.TestIgnore again

This commit is contained in:
Andrey Petrov 2016-09-13 19:08:37 -04:00
parent 0aaaa6a1fb
commit 0096404142

@ -34,112 +34,6 @@ func TestRoomServe(t *testing.T) {
}
}
/*
func TestIgnore(t *testing.T) {
var buffer []byte
ch := NewRoom()
go ch.Serve()
defer ch.Close()
// Create 3 users, join the room and clear their screen buffers
users := make([]ScreenedUser, 3)
for i := 0; i < 3; i++ {
screen := &MockScreen{}
user := message.NewScreen(fmt.Sprintf("user%d", i), screen)
users[i] = ScreenedUser{
user: user,
screen: screen,
}
_, err := ch.Join(user)
if err != nil {
t.Fatal(err)
}
}
for _, u := range users {
for i := 0; i < 3; i++ {
u.user.HandleMsg(u.user.ConsumeOne())
u.screen.Read(&buffer)
}
}
// Use some handy variable names for distinguish between roles
ignorer := users[0]
ignored := users[1]
other := users[2]
// test ignoring unexisting user
if err := sendCommand("/ignore test", ignorer, ch, &buffer); err != nil {
t.Fatal(err)
}
expectOutput(t, buffer, "-> Err: user not found: test"+message.Newline)
// test ignoring existing user
if err := sendCommand("/ignore "+ignored.user.Name(), ignorer, ch, &buffer); err != nil {
t.Fatal(err)
}
expectOutput(t, buffer, "-> Ignoring: "+ignored.user.Name()+message.Newline)
// ignoring the same user twice returns an error message and doesn't add the user twice
if err := sendCommand("/ignore "+ignored.user.Name(), ignorer, ch, &buffer); err != nil {
t.Fatal(err)
}
expectOutput(t, buffer, "-> Err: user already ignored: user1"+message.Newline)
if ignoredList := ignorer.user.Ignored.ListPrefix(""); len(ignoredList) != 1 {
t.Fatalf("should have %d ignored users, has %d", 1, len(ignoredList))
}
// when a message is sent from the ignored user, it is delivered to non-ignoring users
ch.Send(message.NewPublicMsg("hello", ignored.user))
other.user.HandleMsg(other.user.ConsumeOne())
other.screen.Read(&buffer)
expectOutput(t, buffer, ignored.user.Name()+": hello"+message.Newline)
// ensure ignorer doesn't have received any message
if ignorer.user.HasMessages() {
t.Fatal("should not have messages")
}
// `/ignore` returns a list of ignored users
if err := sendCommand("/ignore", ignorer, ch, &buffer); err != nil {
t.Fatal(err)
}
expectOutput(t, buffer, "-> 1 ignored: "+ignored.user.Name()+message.Newline)
// `/unignore [USER]` removes the user from ignored ones
if err := sendCommand("/unignore "+ignored.user.Name(), users[0], ch, &buffer); err != nil {
t.Fatal(err)
}
expectOutput(t, buffer, "-> No longer ignoring: user1"+message.Newline)
if err := sendCommand("/ignore", users[0], ch, &buffer); err != nil {
t.Fatal(err)
}
expectOutput(t, buffer, "-> 0 users ignored."+message.Newline)
if ignoredList := ignorer.user.Ignored.ListPrefix(""); len(ignoredList) != 0 {
t.Fatalf("should have %d ignored users, has %d", 0, len(ignoredList))
}
// after unignoring a user, its messages can be received again
ch.Send(message.NewPublicMsg("hello again!", ignored.user))
// give some time for the channel to get the message
time.Sleep(100)
// ensure ignorer has received the message
if !ignorer.user.HasMessages() {
// FIXME: This is flaky :/
t.Fatal("should have messages")
}
ignorer.user.HandleMsg(ignorer.user.ConsumeOne())
ignorer.screen.Read(&buffer)
expectOutput(t, buffer, ignored.user.Name()+": hello again!"+message.Newline)
}
*/
func expectOutput(t *testing.T, buffer []byte, expected string) {
bytes := []byte(expected)
if !reflect.DeepEqual(buffer, bytes) {
@ -185,6 +79,94 @@ func TestRoomJoin(t *testing.T) {
}
}
func TestIgnore(t *testing.T) {
ch := NewRoom()
go ch.Serve()
defer ch.Close()
addUser := func(name string) (message.Author, <-chan []byte) {
s := &ChannelWriter{
Chan: make(chan []byte, 3),
}
u := message.PipedScreen(name, s)
u.SetConfig(message.UserConfig{
Quiet: true,
})
ch.Join(u)
return u, s.Chan
}
u_foo, m_foo := addUser("foo")
u_bar, m_bar := addUser("bar")
u_quux, m_quux := addUser("quux")
var expected, actual []byte
// foo ignores bar, quux hears both
ch.Send(message.ParseInput("/ignore bar", u_foo))
expected = []byte("-> Ignoring: bar" + message.Newline)
actual = <-m_foo
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
// bar and quux sends a message, quux hears bar, foo only hears quux
ch.Send(message.ParseInput("i am bar", u_bar))
ch.Send(message.ParseInput("i am quux", u_quux))
expected = []byte("bar: i am bar" + message.Newline)
actual = <-m_quux
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
expected = []byte("quux: i am quux" + message.Newline)
actual = <-m_bar
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
actual = <-m_foo
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
// foo sends a message, both quux and bar hear it
ch.Send(message.ParseInput("i am foo", u_foo))
expected = []byte("foo: i am foo" + message.Newline)
actual = <-m_quux
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
actual = <-m_bar
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
// Confirm foo's message queue is still empty
select {
case actual = <-m_foo:
t.Errorf("foo's message queue is not empty: %q", actual)
default:
// Pass.
}
// Unignore and listen to bar again.
ch.Send(message.ParseInput("/unignore bar", u_foo))
expected = []byte("-> No longer ignoring: bar" + message.Newline)
actual = <-m_foo
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
ch.Send(message.ParseInput("i am bar again", u_bar))
expected = []byte("bar: i am bar again" + message.Newline)
actual = <-m_foo
if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: %q; Expected: %q", actual, expected)
}
}
func TestRoomDoesntBroadcastAnnounceMessagesWhenQuiet(t *testing.T) {
msgs := make(chan message.Message)
u := message.HandledScreen("foo", func(m message.Message) error {