Răsfoiți Sursa

make chat room lookup case-insensitive

This allows you to join a room without having to worry about
matching room name casing.
Mike 1 an în urmă
părinte
comite
457f8ed689
2 a modificat fișierele cu 88 adăugiri și 52 ștergeri
  1. 4 4
      state/user_store.go
  2. 84 48
      state/user_store_test.go

+ 4 - 4
state/user_store.go

@@ -967,7 +967,7 @@ func (f SQLiteUserStore) ChatRoomByCookie(cookie string) (ChatRoom, error) {
 	q := `
 		SELECT exchange, name, created, creator
 		FROM chatRoom
-		WHERE cookie = ?
+		WHERE lower(cookie) = lower(?)
 	`
 	var creator string
 	err := f.db.QueryRow(q, cookie).Scan(
@@ -989,16 +989,16 @@ func (f SQLiteUserStore) ChatRoomByCookie(cookie string) (ChatRoom, error) {
 func (f SQLiteUserStore) ChatRoomByName(exchange uint16, name string) (ChatRoom, error) {
 	chatRoom := ChatRoom{
 		exchange: exchange,
-		name:     name,
 	}
 
 	q := `
-		SELECT created, creator
+		SELECT name, created, creator
 		FROM chatRoom
-		WHERE exchange = ? AND name = ?
+		WHERE exchange = ? AND lower(name) = lower(?)
 	`
 	var creator string
 	err := f.db.QueryRow(q, exchange, name).Scan(
+		&chatRoom.name,
 		&chatRoom.createTime,
 		&creator,
 	)

+ 84 - 48
state/user_store_test.go

@@ -697,64 +697,100 @@ func TestSQLiteUserStore_SetUserPassword_ErrNoUser(t *testing.T) {
 	assert.ErrorIs(t, err, ErrNoUser)
 }
 
-func TestSQLiteUserStore_ChatRoomByCookie_RoomFound(t *testing.T) {
-	defer func() {
-		assert.NoError(t, os.Remove(testFile))
-	}()
-
-	userStore, err := NewSQLiteUserStore(testFile)
-	assert.NoError(t, err)
-
-	chatRoom := NewChatRoom("my new chat room!", NewIdentScreenName("the-screen-name"), PrivateExchange)
-
-	err = userStore.CreateChatRoom(&chatRoom)
-	assert.NoError(t, err)
+func TestSQLiteUserStore_ChatRoomByCookie(t *testing.T) {
+	tests := []struct {
+		name        string
+		givenRoom   ChatRoom
+		lookupRoom  ChatRoom
+		expectedErr error
+	}{
+		{
+			name:        "chat room found",
+			givenRoom:   NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			lookupRoom:  NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			expectedErr: nil,
+		},
+		{
+			name:        "chat room found - different name casing",
+			givenRoom:   NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			lookupRoom:  NewChatRoom("MY CHAT ROOM", NewIdentScreenName("creator"), PrivateExchange),
+			expectedErr: nil,
+		},
+		{
+			name:        "chat room not found",
+			givenRoom:   NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			lookupRoom:  NewChatRoom("your chat room", NewIdentScreenName("creator"), PrivateExchange),
+			expectedErr: ErrChatRoomNotFound,
+		},
+	}
 
-	gotRoom, err := userStore.ChatRoomByCookie(chatRoom.Cookie())
-	assert.NoError(t, err)
-	assert.Equal(t, chatRoom, gotRoom)
-}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			defer func() {
+				assert.NoError(t, os.Remove(testFile))
+			}()
 
-func TestSQLiteUserStore_ChatRoomByCookie_RoomNotFound(t *testing.T) {
-	defer func() {
-		assert.NoError(t, os.Remove(testFile))
-	}()
+			userStore, err := NewSQLiteUserStore(testFile)
+			assert.NoError(t, err)
 
-	userStore, err := NewSQLiteUserStore(testFile)
-	assert.NoError(t, err)
+			err = userStore.CreateChatRoom(&tt.givenRoom)
+			assert.NoError(t, err)
 
-	_, err = userStore.ChatRoomByCookie("the-chat-cookie")
-	assert.ErrorIs(t, err, ErrChatRoomNotFound)
+			gotRoom, err := userStore.ChatRoomByCookie(tt.lookupRoom.Cookie())
+			assert.ErrorIs(t, err, tt.expectedErr)
+			if tt.expectedErr == nil {
+				assert.Equal(t, tt.givenRoom.Cookie(), gotRoom.Cookie())
+			}
+		})
+	}
 }
 
-func TestSQLiteUserStore_ChatRoomByName_RoomFound(t *testing.T) {
-	defer func() {
-		assert.NoError(t, os.Remove(testFile))
-	}()
-
-	userStore, err := NewSQLiteUserStore(testFile)
-	assert.NoError(t, err)
-
-	chatRoom := NewChatRoom("my new chat room!", NewIdentScreenName("the-screen-name"), PrivateExchange)
-
-	err = userStore.CreateChatRoom(&chatRoom)
-	assert.NoError(t, err)
+func TestSQLiteUserStore_ChatRoomByName(t *testing.T) {
+	tests := []struct {
+		name        string
+		givenRoom   ChatRoom
+		lookupRoom  ChatRoom
+		expectedErr error
+	}{
+		{
+			name:        "chat room found",
+			givenRoom:   NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			lookupRoom:  NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			expectedErr: nil,
+		},
+		{
+			name:        "chat room found - different name casing",
+			givenRoom:   NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			lookupRoom:  NewChatRoom("MY CHAT ROOM", NewIdentScreenName("creator"), PrivateExchange),
+			expectedErr: nil,
+		},
+		{
+			name:        "chat room not found",
+			givenRoom:   NewChatRoom("my chat room", NewIdentScreenName("creator"), PrivateExchange),
+			lookupRoom:  NewChatRoom("your chat room", NewIdentScreenName("creator"), PrivateExchange),
+			expectedErr: ErrChatRoomNotFound,
+		},
+	}
 
-	gotRoom, err := userStore.ChatRoomByName(chatRoom.Exchange(), chatRoom.Name())
-	assert.NoError(t, err)
-	assert.Equal(t, chatRoom, gotRoom)
-}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			defer func() {
+				assert.NoError(t, os.Remove(testFile))
+			}()
 
-func TestSQLiteUserStore_ChatRoomByName_RoomNotFound(t *testing.T) {
-	defer func() {
-		assert.NoError(t, os.Remove(testFile))
-	}()
+			userStore, err := NewSQLiteUserStore(testFile)
+			assert.NoError(t, err)
 
-	userStore, err := NewSQLiteUserStore(testFile)
-	assert.NoError(t, err)
+			err = userStore.CreateChatRoom(&tt.givenRoom)
+			assert.NoError(t, err)
 
-	_, err = userStore.ChatRoomByName(4, "the-chat-room")
-	assert.ErrorIs(t, err, ErrChatRoomNotFound)
+			gotRoom, err := userStore.ChatRoomByName(tt.lookupRoom.Exchange(), tt.lookupRoom.Name())
+			assert.ErrorIs(t, err, tt.expectedErr)
+			if tt.expectedErr == nil {
+				assert.Equal(t, tt.givenRoom.Cookie(), gotRoom.Cookie())
+			}
+		})
+	}
 }
 
 func TestSQLiteUserStore_AllChatRooms(t *testing.T) {