diff --git a/tests/main_test.go b/tests/main_test.go index 76aefdd..1c0c821 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "gitea.pena/SQuiz/common/model" "github.com/stretchr/testify/assert" - "io" "net/http" "os" "sync" @@ -16,6 +15,7 @@ import ( var baseURL = os.Getenv("API_BASE_URL") var validToken = os.Getenv("VALID_JWT_TOKEN") var expiredToken = os.Getenv("EXPIRED_JWT_TOKEN") +var validTokenForDelete = os.Getenv("VALID_JWT_TOKEN_FOR_DELETE") var existingUserID = os.Getenv("EXISTING_USER_ID") var testUserID = os.Getenv("TEST_USER_ID") @@ -35,10 +35,8 @@ func TestGetAccount_Success(t *testing.T) { assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, "application/json", resp.Header.Get("Content-Type")) - body, err := io.ReadAll(resp.Body) - assert.NoError(t, err) var acc model.Account - err = json.Unmarshal(body, &acc) + err = json.NewDecoder(resp.Body).Decode(&acc) assert.NoError(t, err) assert.NotEmpty(t, acc.ID) assert.NotEmpty(t, acc.UserID) @@ -238,3 +236,106 @@ func createAccountRequest(t *testing.T, token string, payload map[string]interfa assert.NoError(t, err) return resp } + +func TestDeleteAccount_Success(t *testing.T) { + req, err := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer "+validTokenForDelete) + + client := &http.Client{Timeout: 5 * time.Second} + resp, err := client.Do(req) + assert.NoError(t, err) + defer resp.Body.Close() + + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json", resp.Header.Get("Content-Type")) + + var result map[string]string + err = json.NewDecoder(resp.Body).Decode(&result) + assert.NoError(t, err) + assert.NotEmpty(t, result["accountId"]) +} + +func TestDeleteAccount_Auth(t *testing.T) { + t.Run("NoToken", func(t *testing.T) { + req, err := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + assert.NoError(t, err) + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) + }) + + t.Run("InvalidToken", func(t *testing.T) { + req, err := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer invalid_token") + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) + }) + + t.Run("ExpiredToken", func(t *testing.T) { + req, err := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer "+expiredToken) + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) + }) +} + +func TestDeleteAccount_AlreadyDeleted(t *testing.T) { + req, err := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer "+validTokenForDelete) + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) +} + +func TestDeleteAccount_NonExistent(t *testing.T) { + req, err := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer "+validTokenForDelete) + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) +} + +// todo 3.3.4 3.3.5 + +func TestDeleteAccount_Performance(t *testing.T) { + t.Run("ResponseTime", func(t *testing.T) { + req, _ := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + req.Header.Set("Authorization", "Bearer "+validToken) + + start := time.Now() + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + defer resp.Body.Close() + + duration := time.Since(start) + assert.Less(t, duration.Milliseconds(), int64(500)) + }) +} + +func TestDeleteAccount_Load(t *testing.T) { + var wg sync.WaitGroup + for i := 0; i < 50; i++ { + wg.Add(1) + go func() { + defer wg.Done() + req, err := http.NewRequest("DELETE", baseURL+"/account/delete", nil) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer "+validToken) + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + if resp != nil { + defer resp.Body.Close() + } + }() + } + wg.Wait() +} + +// todo 3.3.7 3.3.8 3.4