91 lines
2.8 KiB
Go
91 lines
2.8 KiB
Go
package rtpconn
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestChooseCoinSide(t *testing.T) {
|
|
for i, want := range []string{"heads", "tails"} {
|
|
got, err := chooseCoinSide(bytes.NewReader([]byte{byte(i)}))
|
|
if err != nil {
|
|
t.Fatalf("chooseCoinSide(%d): %v", i, err)
|
|
}
|
|
if got != want {
|
|
t.Fatalf("chooseCoinSide(%d) = %q, want %q", i, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCoinRejectsArguments(t *testing.T) {
|
|
for _, value := range []any{nil, "", " "} {
|
|
if err := validateCoinRequest(value); err != nil {
|
|
t.Fatalf("validateCoinRequest(%#v): %v", value, err)
|
|
}
|
|
}
|
|
for _, value := range []any{"twice", 2} {
|
|
if err := validateCoinRequest(value); err == nil {
|
|
t.Fatalf("validateCoinRequest(%#v) unexpectedly succeeded", value)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCoinFlipIsServerGeneratedAndStoredInHistory(t *testing.T) {
|
|
hallName := newChalkboardTestHall(t)
|
|
flipper := addTestWebClient(t, hallName, "Participant", "message")
|
|
observer := addTestWebClient(t, hallName, "Operator", "op")
|
|
|
|
if err := handleClientMessage(flipper, clientMessage{
|
|
Type: "hallaction", Kind: "coin", Value: "",
|
|
}); err != nil {
|
|
t.Fatalf("handleClientMessage(coin): %v", err)
|
|
}
|
|
|
|
for name, messages := range map[string][]clientMessage{
|
|
"flipper": drainMessages(flipper),
|
|
"observer": drainMessages(observer),
|
|
} {
|
|
if len(messages) != 1 {
|
|
t.Fatalf("%s received %d messages, want 1: %#v", name, len(messages), messages)
|
|
}
|
|
message := messages[0]
|
|
if message.Type != "chat" || message.Kind != "coin" || !message.Privileged {
|
|
t.Fatalf("%s received non-authoritative coin message: %#v", name, message)
|
|
}
|
|
if message.Source != "" || message.Username == nil || *message.Username != "Coin" {
|
|
t.Fatalf("%s received coin message with unexpected identity: %#v", name, message)
|
|
}
|
|
text, ok := message.Value.(string)
|
|
if !ok || (text != "Participant flips a coin: heads." &&
|
|
text != "Participant flips a coin: tails.") {
|
|
t.Fatalf("%s received malformed coin announcement %q", name, text)
|
|
}
|
|
}
|
|
|
|
history := flipper.hall.GetChatHistory()
|
|
if len(history) != 1 || history[0].Kind != "coin" {
|
|
t.Fatalf("coin history = %#v", history)
|
|
}
|
|
}
|
|
|
|
func TestCoinFlipRequiresMessagePermission(t *testing.T) {
|
|
hallName := newChalkboardTestHall(t)
|
|
flipper := addTestWebClient(t, hallName, "Participant", "message")
|
|
flipper.permissions = remove("message", flipper.permissions)
|
|
|
|
if err := handleClientMessage(flipper, clientMessage{
|
|
Type: "hallaction", Kind: "coin", Value: "",
|
|
}); err != nil {
|
|
t.Fatalf("handleClientMessage(coin): %v", err)
|
|
}
|
|
if got := flipper.hall.GetChatHistory(); len(got) != 0 {
|
|
t.Fatalf("unauthorised coin flip entered history: %#v", got)
|
|
}
|
|
messages := drainMessages(flipper)
|
|
if len(messages) != 1 || messages[0].Kind != "error" ||
|
|
!strings.Contains(messages[0].Value.(string), "not authorised") {
|
|
t.Fatalf("unauthorised coin response = %#v", messages)
|
|
}
|
|
}
|