Test multiple clients valid simultaneously

This commit is contained in:
Evan Goode 2025-08-21 22:22:39 -04:00
parent a27c0ed3c2
commit 039bcd31c5

View File

@ -94,7 +94,8 @@ func (ts *TestSuite) testAuthenticate(t *testing.T) {
} }
{ {
// If we send our own clientToken, the server should use it // If we send our own clientToken, the server should use it
clientToken := "12345678901234567890123456789012" clientToken := "11111111111111111111111111111111"
otherClientToken := "22222222222222222222222222222222"
payload := authenticateRequest{ payload := authenticateRequest{
Username: TEST_PLAYER_NAME, Username: TEST_PLAYER_NAME,
Password: TEST_PASSWORD, Password: TEST_PASSWORD,
@ -106,18 +107,18 @@ func (ts *TestSuite) testAuthenticate(t *testing.T) {
// Authentication should succeed and we should get a valid clientToken and // Authentication should succeed and we should get a valid clientToken and
// accessToken // accessToken
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var response authenticateResponse var response0 authenticateResponse
assert.Nil(t, json.NewDecoder(rec.Body).Decode(&response)) assert.Nil(t, json.NewDecoder(rec.Body).Decode(&response0))
assert.Equal(t, clientToken, response.ClientToken) assert.Equal(t, clientToken, response0.ClientToken)
// Check that the database was updated // Check that the database was updated
var client Client var client Client
result := ts.App.DB.Preload("Player").First(&client, "client_token = ?", response.ClientToken) result := ts.App.DB.Preload("Player").First(&client, "client_token = ?", clientToken)
assert.Nil(t, result.Error) assert.Nil(t, result.Error)
assert.NotNil(t, client.Player) assert.NotNil(t, client.Player)
assert.Equal(t, TEST_PLAYER_NAME, client.Player.Name) assert.Equal(t, TEST_PLAYER_NAME, client.Player.Name)
accessTokenClient := ts.App.GetClient(response.AccessToken, StalePolicyDeny) accessTokenClient := ts.App.GetClient(response0.AccessToken, StalePolicyDeny)
assert.NotNil(t, accessTokenClient) assert.NotNil(t, accessTokenClient)
accessTokenClient.Player = client.Player accessTokenClient.Player = client.Player
accessTokenClient.User = client.User accessTokenClient.User = client.User
@ -126,8 +127,8 @@ func (ts *TestSuite) testAuthenticate(t *testing.T) {
// The accessToken should be valid // The accessToken should be valid
validatePayload := validateRequest{ validatePayload := validateRequest{
ClientToken: response.ClientToken, ClientToken: response0.ClientToken,
AccessToken: response.AccessToken, AccessToken: response0.AccessToken,
} }
rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil) rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil)
assert.Equal(t, http.StatusNoContent, rec.Code) assert.Equal(t, http.StatusNoContent, rec.Code)
@ -143,25 +144,59 @@ func (ts *TestSuite) testAuthenticate(t *testing.T) {
rec = ts.PostJSON(t, ts.Server, "/authenticate", payload, nil, nil) rec = ts.PostJSON(t, ts.Server, "/authenticate", payload, nil, nil)
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var newResponse authenticateResponse var response1 authenticateResponse
assert.Nil(t, json.NewDecoder(rec.Body).Decode(&newResponse)) assert.Nil(t, json.NewDecoder(rec.Body).Decode(&response1))
assert.Equal(t, clientToken, newResponse.ClientToken) assert.Equal(t, clientToken, response1.ClientToken)
result = ts.App.DB.First(&client, "client_token = ?", clientToken) result = ts.App.DB.First(&client, "client_token = ?", clientToken)
assert.Nil(t, result.Error) assert.Nil(t, result.Error)
// The old accessToken should be invalid // The old accessToken should be invalid
validatePayload = validateRequest{ validatePayload = validateRequest{
ClientToken: response.ClientToken, ClientToken: response0.ClientToken,
AccessToken: response.AccessToken, AccessToken: response0.AccessToken,
} }
rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil) rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil)
assert.Equal(t, http.StatusForbidden, rec.Code) assert.Equal(t, http.StatusForbidden, rec.Code)
// The new accessToken should be valid // The new accessToken should be valid
validatePayload = validateRequest{ validatePayload = validateRequest{
ClientToken: newResponse.ClientToken, ClientToken: response1.ClientToken,
AccessToken: newResponse.AccessToken, AccessToken: response1.AccessToken,
}
rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil)
assert.Equal(t, http.StatusNoContent, rec.Code)
// Authentication should succeed if we POST /authenticate again with a different clientToken
payload = authenticateRequest{
Username: TEST_PLAYER_NAME,
Password: TEST_PASSWORD,
ClientToken: &otherClientToken,
RequestUser: false,
}
rec = ts.PostJSON(t, ts.Server, "/authenticate", payload, nil, nil)
assert.Equal(t, http.StatusOK, rec.Code)
var response2 authenticateResponse
assert.Nil(t, json.NewDecoder(rec.Body).Decode(&response2))
assert.Equal(t, otherClientToken, response2.ClientToken)
var otherClient Client
result = ts.App.DB.First(&otherClient, "client_token = ?", otherClientToken)
assert.Nil(t, result.Error)
// The old accessToken should still be valid
validatePayload = validateRequest{
ClientToken: response1.ClientToken,
AccessToken: response1.AccessToken,
}
rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil)
assert.Equal(t, http.StatusNoContent, rec.Code)
// The new accessToken should be valid
validatePayload = validateRequest{
ClientToken: response2.ClientToken,
AccessToken: response2.AccessToken,
} }
rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil) rec = ts.PostJSON(t, ts.Server, "/validate", validatePayload, nil, nil)
assert.Equal(t, http.StatusNoContent, rec.Code) assert.Equal(t, http.StatusNoContent, rec.Code)