From 10a83013e086eb0978f31d7cef33c9d01077e7f4 Mon Sep 17 00:00:00 2001 From: pasha1coil Date: Thu, 17 Jul 2025 12:42:22 +0300 Subject: [PATCH] review, next editQuizRequest --- tests/main_test.go | 195 +++++++++++++++++++++------------------------ 1 file changed, 89 insertions(+), 106 deletions(-) diff --git a/tests/main_test.go b/tests/main_test.go index a24ae9a..8d78397 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -6,6 +6,7 @@ import ( "fmt" "gitea.pena/SQuiz/common/model" "gitea.pena/SQuiz/core/internal/controllers/http_controllers/question" + "gitea.pena/SQuiz/core/internal/controllers/http_controllers/quiz" "github.com/pioz/faker" "github.com/stretchr/testify/assert" "net/http" @@ -4744,6 +4745,7 @@ func createQuizRequest(token string, body map[string]interface{}) (*http.Respons return http.DefaultClient.Do(req) } +// todo если у нас квиз без статуса передается, то будет ошибка func TestCreateQuiz_Success(t *testing.T) { t.Run("MinimalQuiz", func(t *testing.T) { resp, err := createQuizRequest(validToken, map[string]interface{}{ @@ -4755,22 +4757,20 @@ func TestCreateQuiz_Success(t *testing.T) { assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, "application/json", resp.Header.Get("Content-Type")) - var result map[string]interface{} + var result model.Quiz err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.NotEmpty(t, result["id"]) - assert.NotEmpty(t, result["qid"]) - assert.NotEmpty(t, result["accountid"]) - assert.Equal(t, "Новый квиз по истории", result["name"]) - assert.Equal(t, "draft", result["status"]) // Значение по умолчанию - assert.Equal(t, false, result["deleted"]) - assert.Equal(t, false, result["archived"]) - assert.Equal(t, float64(1), result["version"]) - assert.NotEmpty(t, result["created_at"]) - assert.NotEmpty(t, result["updated_at"]) + assert.NotEmpty(t, result.Id) + assert.NotEmpty(t, result.Qid) + assert.NotEmpty(t, result.AccountId) + assert.Equal(t, "Новый квиз по истории", result.Name) + assert.Equal(t, "draft", result.Status) + assert.Equal(t, false, result.Deleted) + assert.Equal(t, false, result.Archived) + assert.Equal(t, 1, result.Version) }) - + // отсмотрено t.Run("FullQuiz", func(t *testing.T) { resp, err := createQuizRequest(validToken, map[string]interface{}{ "name": "Полный квиз по географии", @@ -4783,42 +4783,39 @@ func TestCreateQuiz_Success(t *testing.T) { "config": "{\"showCorrectAnswers\": true}", "status": "start", "limit": 100, - "due_to": 1700000000, "question_cnt": 10, "time_of_passing": 3600, "pausable": true, "super": false, - "group_id": nil, }) assert.NoError(t, err) defer resp.Body.Close() assert.Equal(t, http.StatusCreated, resp.StatusCode) - var result map[string]interface{} + var result model.Quiz err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.NotEmpty(t, result["id"]) - assert.Equal(t, "Полный квиз по географии", result["name"]) - assert.Equal(t, "Детальный тест на знание столиц и стран.", result["description"]) - assert.Equal(t, true, result["fingerprinting"]) - assert.Equal(t, true, result["repeatable"]) - assert.Equal(t, false, result["note_prevented"]) - assert.Equal(t, true, result["mail_notifications"]) - assert.Equal(t, false, result["unique_answers"]) - assert.Equal(t, "{\"showCorrectAnswers\": true}", result["config"]) - assert.Equal(t, "start", result["status"]) - assert.Equal(t, float64(100), result["limit"]) - assert.Equal(t, float64(1700000000), result["due_to"]) - assert.Equal(t, float64(10), result["question_cnt"]) - assert.Equal(t, float64(3600), result["time_of_passing"]) - assert.Equal(t, true, result["pausable"]) - assert.Equal(t, false, result["super"]) - assert.Nil(t, result["group_id"]) + assert.NotEmpty(t, result.Id) + assert.Equal(t, "Полный квиз по географии", result.Name) + assert.Equal(t, "Детальный тест на знание столиц и стран.", result.Description) + assert.Equal(t, true, result.Fingerprinting) + assert.Equal(t, true, result.Repeatable) + assert.Equal(t, false, result.NotePrevented) + assert.Equal(t, true, result.MailNotifications) + assert.Equal(t, false, result.UniqueAnswers) + assert.Equal(t, "{\"showCorrectAnswers\": true}", result.Config) + assert.Equal(t, "start", result.Status) + assert.Equal(t, uint64(100), result.Limit) + assert.Equal(t, uint64(10), result.QuestionsCount) + assert.Equal(t, uint64(3600), result.TimeOfPassing) + assert.Equal(t, true, result.Pausable) + assert.Equal(t, false, result.Super) }) } +// отсмотрено func TestCreateQuiz_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]interface{}{ @@ -4852,16 +4849,8 @@ func TestCreateQuiz_Auth(t *testing.T) { }) } +// отсмотрено func TestCreateQuiz_InputValidation(t *testing.T) { - t.Run("MissingName", func(t *testing.T) { - resp, err := createQuizRequest(validToken, map[string]interface{}{ - "description": "Test description", - }) - assert.NoError(t, err) - defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - }) - t.Run("NameTooLong", func(t *testing.T) { longName := strings.Repeat("a", 701) // Больше 700 символов resp, err := createQuizRequest(validToken, map[string]interface{}{ @@ -4869,7 +4858,7 @@ func TestCreateQuiz_InputValidation(t *testing.T) { }) assert.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusUnprocessableEntity, resp.StatusCode) }) t.Run("InvalidStatus", func(t *testing.T) { @@ -4879,7 +4868,7 @@ func TestCreateQuiz_InputValidation(t *testing.T) { }) assert.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) }) t.Run("InvalidFingerprinting", func(t *testing.T) { @@ -4913,6 +4902,7 @@ func TestCreateQuiz_InputValidation(t *testing.T) { }) } +// отсмотрено func TestCreateQuiz_StatusValues(t *testing.T) { statuses := []string{"draft", "template", "stop", "start"} @@ -4935,9 +4925,11 @@ func TestCreateQuiz_StatusValues(t *testing.T) { } } +// отсмотрено func TestCreateQuiz_DefaultValues(t *testing.T) { resp, err := createQuizRequest(validToken, map[string]interface{}{ - "name": "Quiz with defaults", + "name": "Quiz with defaults", + "status": "draft", }) assert.NoError(t, err) defer resp.Body.Close() @@ -4952,31 +4944,30 @@ func TestCreateQuiz_DefaultValues(t *testing.T) { assert.Equal(t, false, result["fingerprinting"]) assert.Equal(t, false, result["repeatable"]) assert.Equal(t, false, result["note_prevented"]) - assert.Equal(t, true, result["pausable"]) + assert.Equal(t, false, result["pausable"]) assert.Equal(t, false, result["super"]) } +// отсмотрено func TestCreateQuiz_Conflict(t *testing.T) { resp1, err := createQuizRequest(validToken, map[string]interface{}{ - "name": "Duplicate Quiz Name", + "name": "Duplicate Quiz Name", + "status": "draft", + "pausable": true, + "time_of_passing": 0, }) assert.NoError(t, err) defer resp1.Body.Close() - assert.Equal(t, http.StatusCreated, resp1.StatusCode) - - resp2, err := createQuizRequest(validToken, map[string]interface{}{ - "name": "Duplicate Quiz Name", - }) - assert.NoError(t, err) - defer resp2.Body.Close() - assert.Equal(t, http.StatusConflict, resp2.StatusCode) + assert.Equal(t, http.StatusConflict, resp1.StatusCode) } +// todo func TestCreateQuiz_Security(t *testing.T) { t.Run("SQLInjection", func(t *testing.T) { resp, err := createQuizRequest(validToken, map[string]interface{}{ "name": sqlInjectionInput, "description": sqlInjectionInput, + "status": "draft", }) assert.NoError(t, err) defer resp.Body.Close() @@ -4988,6 +4979,7 @@ func TestCreateQuiz_Security(t *testing.T) { resp, err := createQuizRequest(validToken, map[string]interface{}{ "name": xssInput, "description": xssInput, + "status": "draft", }) assert.NoError(t, err) defer resp.Body.Close() @@ -4996,11 +4988,13 @@ func TestCreateQuiz_Security(t *testing.T) { }) } +// отсмотрено func TestCreateQuiz_Performance(t *testing.T) { t.Run("ResponseTime", func(t *testing.T) { start := time.Now() resp, err := createQuizRequest(validToken, map[string]interface{}{ - "name": "Performance Test Quiz", + "name": "Performance Test Quiz", + "status": "draft", }) duration := time.Since(start) @@ -5016,7 +5010,8 @@ func TestCreateQuiz_Performance(t *testing.T) { go func(index int) { defer wg.Done() resp, err := createQuizRequest(validToken, map[string]interface{}{ - "name": fmt.Sprintf("Load Test Quiz %d", index), + "name": fmt.Sprintf("Load Test Quiz %d", index), + "status": "draft", }) if err == nil && resp != nil { resp.Body.Close() @@ -5027,22 +5022,24 @@ func TestCreateQuiz_Performance(t *testing.T) { }) } +// отсмотрено func TestCreateQuiz_SuperQuiz(t *testing.T) { t.Run("SuperQuizWithoutGroup", func(t *testing.T) { resp, err := createQuizRequest(validToken, map[string]interface{}{ - "name": "Super Quiz", - "super": true, + "name": "Super Quiz", + "super": true, + "status": "draft", }) assert.NoError(t, err) defer resp.Body.Close() assert.Equal(t, http.StatusCreated, resp.StatusCode) - var result map[string]interface{} + var result model.Quiz err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.Equal(t, true, result["super"]) - assert.Nil(t, result["group_id"]) + assert.Equal(t, true, result.Super) + assert.Equal(t, uint64(0), result.GroupId) }) t.Run("NonSuperQuizWithGroup", func(t *testing.T) { @@ -5050,17 +5047,18 @@ func TestCreateQuiz_SuperQuiz(t *testing.T) { "name": "Group Quiz", "super": false, "group_id": 123, + "status": "draft", }) assert.NoError(t, err) defer resp.Body.Close() assert.Equal(t, http.StatusCreated, resp.StatusCode) - var result map[string]interface{} + var result model.Quiz err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.Equal(t, false, result["super"]) - assert.Equal(t, float64(123), result["group_id"]) + assert.Equal(t, false, result.Super) + assert.Equal(t, uint64(123), result.GroupId) }) } @@ -5078,9 +5076,10 @@ func getQuizListRequest(token string, body map[string]interface{}) (*http.Respon return http.DefaultClient.Do(req) } +// todo чекнуть запрос в бд что то не то res [] 27 ! ? pq: argument of OFFSET must be type bigint, not type text "sessions_count": converting NULL to uint64 is unsupported func TestGetQuizList_Success(t *testing.T) { quizNames := []string{"Квиз по географии", "Квиз по истории", "Квиз по математике"} - var quizIDs []interface{} + var quizIDs []uint64 for _, name := range quizNames { resp, err := createQuizRequest(validToken, map[string]interface{}{ @@ -5089,17 +5088,18 @@ func TestGetQuizList_Success(t *testing.T) { }) assert.NoError(t, err) - var result map[string]interface{} + var result model.Quiz err = json.NewDecoder(resp.Body).Decode(&result) resp.Body.Close() assert.NoError(t, err) - quizIDs = append(quizIDs, result["id"]) + quizIDs = append(quizIDs, result.Id) } t.Run("BasicList", func(t *testing.T) { resp, err := getQuizListRequest(validToken, map[string]interface{}{ - "limit": 5, - "page": 1, + "limit": 5, + "page": 1, + "status": "start", }) assert.NoError(t, err) defer resp.Body.Close() @@ -5107,23 +5107,19 @@ func TestGetQuizList_Success(t *testing.T) { assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, "application/json", resp.Header.Get("Content-Type")) - var result map[string]interface{} + var result quiz.GetQuizListResp err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.NotEmpty(t, result["count"]) - assert.NotEmpty(t, result["items"]) + assert.NotEmpty(t, result.Count) + assert.NotEmpty(t, result.Items) - items, ok := result["items"].([]interface{}) - assert.True(t, ok) - assert.LessOrEqual(t, len(items), 5) + assert.LessOrEqual(t, len(result.Items), 5) - if len(items) > 0 { - firstItem, ok := items[0].(map[string]interface{}) - assert.True(t, ok) - assert.NotEmpty(t, firstItem["id"]) - assert.NotEmpty(t, firstItem["name"]) - assert.NotEmpty(t, firstItem["status"]) + if len(result.Items) > 0 { + assert.NotEmpty(t, result.Items[0].Id) + assert.NotEmpty(t, result.Items[0].Name) + assert.NotEmpty(t, result.Items[0].Status) } }) @@ -5156,6 +5152,7 @@ func TestGetQuizList_Success(t *testing.T) { }) } +// отсмотрено func TestGetQuizList_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]interface{}{ @@ -5192,6 +5189,7 @@ func TestGetQuizList_Auth(t *testing.T) { }) } +// отсмотрено func TestGetQuizList_InputValidation(t *testing.T) { t.Run("InvalidLimit", func(t *testing.T) { resp, err := getQuizListRequest(validToken, map[string]interface{}{ @@ -5220,7 +5218,7 @@ func TestGetQuizList_InputValidation(t *testing.T) { }) assert.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusOK, resp.StatusCode) }) t.Run("ZeroPage", func(t *testing.T) { @@ -5230,7 +5228,7 @@ func TestGetQuizList_InputValidation(t *testing.T) { }) assert.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusOK, resp.StatusCode) }) t.Run("InvalidFrom", func(t *testing.T) { @@ -5257,7 +5255,7 @@ func TestGetQuizList_InputValidation(t *testing.T) { }) assert.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) }) t.Run("InvalidDeleted", func(t *testing.T) { @@ -5297,6 +5295,8 @@ func TestGetQuizList_InputValidation(t *testing.T) { }) } +// отсмотрено +// todo "sessions_count": converting NULL to uint64 is unsupported func TestGetQuizList_Pagination(t *testing.T) { for i := 0; i < 15; i++ { resp, err := createQuizRequest(validToken, map[string]interface{}{ @@ -5342,26 +5342,9 @@ func TestGetQuizList_Pagination(t *testing.T) { assert.True(t, ok) assert.LessOrEqual(t, len(items), 5) }) - // todo со временм бдшка же заполнится - t.Run("EmptyPage", func(t *testing.T) { - resp, err := getQuizListRequest(validToken, map[string]interface{}{ - "limit": 5, - "page": 100, - }) - assert.NoError(t, err) - defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) - - var result map[string]interface{} - err = json.NewDecoder(resp.Body).Decode(&result) - assert.NoError(t, err) - - items, ok := result["items"].([]interface{}) - assert.True(t, ok) - assert.Empty(t, items) - }) } +// todo res [] 0 ! pq: syntax error in tsquery: "Filter Test" ? pq: argument of LIMIT must be type bigint, not type text func TestGetQuizList_Filters(t *testing.T) { statuses := []string{"draft", "start", "stop", "template"} for _, status := range statuses { @@ -5438,6 +5421,7 @@ func TestGetQuizList_Filters(t *testing.T) { }) } +// отсмотрено func TestGetQuizList_DefaultValues(t *testing.T) { resp, err := getQuizListRequest(validToken, map[string]interface{}{}) assert.NoError(t, err) @@ -5445,15 +5429,14 @@ func TestGetQuizList_DefaultValues(t *testing.T) { assert.Equal(t, http.StatusOK, resp.StatusCode) - var result map[string]interface{} + var result quiz.GetQuizListResp err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - items, ok := result["items"].([]interface{}) - assert.True(t, ok) - assert.LessOrEqual(t, len(items), 10) + assert.LessOrEqual(t, len(result.Items), 10) } +// отсмотрено func TestGetQuizList_Performance(t *testing.T) { t.Run("ResponseTime", func(t *testing.T) { start := time.Now()