diff --git a/tests/main_test.go b/tests/main_test.go index 802a759..1d7af2e 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -6212,6 +6212,7 @@ func deleteQuizRequest(token string, body map[string]interface{}) (*http.Respons return http.DefaultClient.Do(req) } +// отсмотрено func TestDeleteQuiz_Success(t *testing.T) { createResp, err := createQuizRequest(deleteQuizToken, map[string]interface{}{ "name": "Квиз для удаления", @@ -6219,10 +6220,10 @@ func TestDeleteQuiz_Success(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) assert.NoError(t, err) - quizID := createResult["id"] + quizID := createResult.Id resp, err := deleteQuizRequest(deleteQuizToken, map[string]interface{}{ "id": quizID, @@ -6233,12 +6234,13 @@ func TestDeleteQuiz_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.DeactivateResp err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.Equal(t, quizID, result["deactivated"]) + assert.Equal(t, quizID, result.Deactivated) } +// отсмотрено func TestDeleteQuiz_Idempotency(t *testing.T) { createResp, err := createQuizRequest(deleteQuizToken, map[string]interface{}{ "name": "Квиз для идемпотентности", @@ -6246,10 +6248,10 @@ func TestDeleteQuiz_Idempotency(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) assert.NoError(t, err) - quizID := createResult["id"] + quizID := createResult.Id resp1, err := deleteQuizRequest(deleteQuizToken, map[string]interface{}{ "id": quizID, @@ -6265,16 +6267,17 @@ func TestDeleteQuiz_Idempotency(t *testing.T) { defer resp2.Body.Close() assert.Equal(t, http.StatusOK, resp2.StatusCode) - var result1, result2 map[string]interface{} + var result1, result2 quiz.DeactivateResp err = json.NewDecoder(resp1.Body).Decode(&result1) assert.NoError(t, err) err = json.NewDecoder(resp2.Body).Decode(&result2) assert.NoError(t, err) - assert.Equal(t, quizID, result1["deactivated"]) - assert.Equal(t, quizID, result2["deactivated"]) + assert.Equal(t, quizID, result1.Deactivated) + assert.Equal(t, quizID, result2.Deactivated) } +// отсмотрено func TestDeleteQuiz_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]interface{}{ @@ -6308,12 +6311,13 @@ func TestDeleteQuiz_Auth(t *testing.T) { }) } +// отсмотрено func TestDeleteQuiz_InputValidation(t *testing.T) { t.Run("MissingID", func(t *testing.T) { resp, err := deleteQuizRequest(deleteQuizToken, map[string]interface{}{}) assert.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusFailedDependency, resp.StatusCode) }) t.Run("InvalidID", func(t *testing.T) { @@ -6324,7 +6328,7 @@ func TestDeleteQuiz_InputValidation(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusBadRequest, resp.StatusCode) }) - + // todo 404 t.Run("NonExistentID", func(t *testing.T) { resp, err := deleteQuizRequest(deleteQuizToken, map[string]interface{}{ "id": 99999, @@ -6335,8 +6339,9 @@ func TestDeleteQuiz_InputValidation(t *testing.T) { }) } +// отсмотрено func TestDeleteQuiz_Performance(t *testing.T) { - var quizIDs []interface{} + var quizIDs []uint64 for i := 0; i < 10; i++ { createResp, err := createQuizRequest(deleteQuizToken, map[string]interface{}{ "name": fmt.Sprintf("Квиз для удаления %d", i), @@ -6344,11 +6349,11 @@ func TestDeleteQuiz_Performance(t *testing.T) { }) assert.NoError(t, err) - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) createResp.Body.Close() assert.NoError(t, err) - quizIDs = append(quizIDs, createResult["id"]) + quizIDs = append(quizIDs, createResult.Id) } t.Run("ResponseTime", func(t *testing.T) { @@ -6395,6 +6400,7 @@ func archiveQuizRequest(token string, body map[string]interface{}) (*http.Respon return http.DefaultClient.Do(req) } +// отсмотрено func TestArchiveQuiz_Success(t *testing.T) { createResp, err := createQuizRequest(validToken, map[string]interface{}{ "name": "Квиз для архивации", @@ -6402,10 +6408,10 @@ func TestArchiveQuiz_Success(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) assert.NoError(t, err) - quizID := createResult["id"] + quizID := createResult.Id resp, err := archiveQuizRequest(validToken, map[string]interface{}{ "id": quizID, @@ -6416,12 +6422,13 @@ func TestArchiveQuiz_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.DeactivateResp err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.Equal(t, quizID, result["deactivated"]) + assert.Equal(t, quizID, result.Deactivated) } +// отсмотрено func TestArchiveQuiz_Idempotency(t *testing.T) { createResp, err := createQuizRequest(validToken, map[string]interface{}{ "name": "Квиз для архивации (идемпотентность)", @@ -6429,10 +6436,10 @@ func TestArchiveQuiz_Idempotency(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) assert.NoError(t, err) - quizID := createResult["id"] + quizID := createResult.Id resp1, err := archiveQuizRequest(validToken, map[string]interface{}{ "id": quizID, @@ -6448,16 +6455,17 @@ func TestArchiveQuiz_Idempotency(t *testing.T) { defer resp2.Body.Close() assert.Equal(t, http.StatusOK, resp2.StatusCode) - var result1, result2 map[string]interface{} + var result1, result2 quiz.DeactivateResp err = json.NewDecoder(resp1.Body).Decode(&result1) assert.NoError(t, err) err = json.NewDecoder(resp2.Body).Decode(&result2) assert.NoError(t, err) - assert.Equal(t, quizID, result1["deactivated"]) - assert.Equal(t, quizID, result2["deactivated"]) + assert.Equal(t, quizID, result1.Deactivated) + assert.Equal(t, quizID, result2.Deactivated) } +// отсмотрено func TestArchiveQuiz_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]interface{}{ @@ -6491,12 +6499,13 @@ func TestArchiveQuiz_Auth(t *testing.T) { }) } +// отсмотрено func TestArchiveQuiz_InputValidation(t *testing.T) { t.Run("MissingID", func(t *testing.T) { resp, err := archiveQuizRequest(validToken, map[string]interface{}{}) assert.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusFailedDependency, resp.StatusCode) }) t.Run("InvalidID", func(t *testing.T) { @@ -6507,7 +6516,7 @@ func TestArchiveQuiz_InputValidation(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusBadRequest, resp.StatusCode) }) - + // todo 404 t.Run("NonExistentID", func(t *testing.T) { resp, err := archiveQuizRequest(validToken, map[string]interface{}{ "id": 99999, @@ -6518,8 +6527,9 @@ func TestArchiveQuiz_InputValidation(t *testing.T) { }) } +// отсмотрено func TestArchiveQuiz_Performance(t *testing.T) { - var quizIDs []interface{} + var quizIDs []uint64 for i := 0; i < 10; i++ { createResp, err := createQuizRequest(validToken, map[string]interface{}{ "name": fmt.Sprintf("Квиз для архивации %d", i), @@ -6527,11 +6537,11 @@ func TestArchiveQuiz_Performance(t *testing.T) { }) assert.NoError(t, err) - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) createResp.Body.Close() assert.NoError(t, err) - quizIDs = append(quizIDs, createResult["id"]) + quizIDs = append(quizIDs, createResult.Id) } t.Run("ResponseTime", func(t *testing.T) { @@ -6564,6 +6574,7 @@ func TestArchiveQuiz_Performance(t *testing.T) { }) } +// отсмотрено func TestMoveQuiz_BoundaryCases(t *testing.T) { t.Run("EmptyQIDAndAccountID", func(t *testing.T) { resp, err := moveQuizRequest(validToken, map[string]interface{}{ @@ -6574,7 +6585,7 @@ func TestMoveQuiz_BoundaryCases(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusBadRequest, resp.StatusCode) }) - + // todo t.Run("LongQIDAndAccountID", func(t *testing.T) { longStr := make([]byte, 1025) for i := range longStr { @@ -6590,6 +6601,7 @@ func TestMoveQuiz_BoundaryCases(t *testing.T) { }) } +// отсмотрено func TestMoveQuiz_ErrorHandling(t *testing.T) { t.Run("MalformedJSON", func(t *testing.T) { req, err := http.NewRequest("POST", baseURL+"/quiz/move", bytes.NewReader([]byte("{invalid_json}"))) @@ -6617,6 +6629,7 @@ func moveQuizRequest(token string, body map[string]interface{}) (*http.Response, return http.DefaultClient.Do(req) } +// отсмотрено func TestMoveQuiz_Success(t *testing.T) { createResp, err := createQuizRequest(validToken, map[string]interface{}{ "name": "Квиз для переноса", @@ -6624,10 +6637,10 @@ func TestMoveQuiz_Success(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) assert.NoError(t, err) - quizQID := createResult["qid"] + quizQID := createResult.Qid resp, err := moveQuizRequest(validToken, map[string]interface{}{ "qid": quizQID, @@ -6640,6 +6653,7 @@ func TestMoveQuiz_Success(t *testing.T) { assert.Equal(t, "application/json", resp.Header.Get("Content-Type")) } +// отсмотрено func TestMoveQuiz_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]interface{}{ @@ -6667,6 +6681,7 @@ func TestMoveQuiz_Auth(t *testing.T) { }) } +// отсмотрено func TestMoveQuiz_InputValidation(t *testing.T) { t.Run("MissingQID", func(t *testing.T) { resp, err := moveQuizRequest(validToken, map[string]interface{}{ @@ -6685,7 +6700,7 @@ func TestMoveQuiz_InputValidation(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusBadRequest, resp.StatusCode) }) - + // todo 404 t.Run("NonExistentQID", func(t *testing.T) { resp, err := moveQuizRequest(validToken, map[string]interface{}{ "qid": "non-existent-qid", @@ -6695,7 +6710,7 @@ func TestMoveQuiz_InputValidation(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusBadRequest, resp.StatusCode) }) - + // todo 404 t.Run("NonExistentAccountID", func(t *testing.T) { resp, err := moveQuizRequest(validToken, map[string]interface{}{ "qid": "test-qid", @@ -6707,6 +6722,7 @@ func TestMoveQuiz_InputValidation(t *testing.T) { }) } +// отсмотрено func TestMoveQuiz_Performance(t *testing.T) { createResp, err := createQuizRequest(validToken, map[string]interface{}{ "name": "Квиз для теста производительности переноса", @@ -6714,10 +6730,10 @@ func TestMoveQuiz_Performance(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - var createResult map[string]interface{} + var createResult model.Quiz err = json.NewDecoder(createResp.Body).Decode(&createResult) assert.NoError(t, err) - quizQID := createResult["qid"] + quizQID := createResult.Qid t.Run("ResponseTime", func(t *testing.T) { start := time.Now() @@ -6733,14 +6749,53 @@ func TestMoveQuiz_Performance(t *testing.T) { }) } +// отсмотрено func TestCreateQuizTemplate_BoundaryCases(t *testing.T) { + createResp, err := createQuizRequest(validToken, map[string]interface{}{ + "name": "Квиз для теста граничных случаев", + "description": "Детальный тест для проверки граничных случаев создания шаблонов", + "fingerprinting": true, + "repeatable": true, + "note_prevented": false, + "mail_notifications": true, + "unique_answers": false, + "config": "{\"showCorrectAnswers\": true, \"allowReview\": true}", + "status": "template", + "limit": 100, + "question_cnt": 15, + "time_of_passing": 3600, + "pausable": true, + "super": false, + }) + assert.NoError(t, err) + defer createResp.Body.Close() + var createResult model.Quiz + err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.NoError(t, err) + quizQID := createResult.Qid + + resp, err := createQuestionRequest(validToken, map[string]interface{}{ + "quiz_id": createResult.Id, + "title": "Какой основной компонент воздуха?", + "type": "variant", + "description": "Выберите один правильный ответ.", + "required": true, + "page": 1, + "content": "{}", + }) + 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")) + t.Run("ManyRequests", func(t *testing.T) { var wg sync.WaitGroup for i := 0; i < 20; i++ { wg.Add(1) go func() { defer wg.Done() - resp, err := createQuizTemplateRequest(validToken) + resp, err := createQuizTemplateRequest(validToken, quizQID) if err == nil && resp != nil { resp.Body.Close() } @@ -6750,8 +6805,16 @@ func TestCreateQuizTemplate_BoundaryCases(t *testing.T) { }) } -func createQuizTemplateRequest(token string) (*http.Response, error) { - req, err := http.NewRequest("POST", baseURL+"/quiz/template", nil) +func createQuizTemplateRequest(token string, qid string) (*http.Response, error) { + payload := map[string]interface{}{ + "qid": qid, + } + jsonData, err := json.Marshal(payload) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", baseURL+"/quiz/template", bytes.NewReader(jsonData)) if err != nil { return nil, err } @@ -6760,8 +6823,47 @@ func createQuizTemplateRequest(token string) (*http.Response, error) { return http.DefaultClient.Do(req) } +// отсмотрено func TestCreateQuizTemplate_Success(t *testing.T) { - resp, err := createQuizTemplateRequest(validToken) + createResp, err := createQuizRequest(validToken, map[string]interface{}{ + "name": "Квиз для теста производительности переноса", + "description": "Комплексный тест для проверки создания шаблонов", + "fingerprinting": true, + "repeatable": true, + "note_prevented": false, + "mail_notifications": true, + "unique_answers": false, + "config": "{\"showCorrectAnswers\": true, \"allowReview\": true, \"showProgress\": true}", + "status": "template", + "limit": 200, + "question_cnt": 20, + "time_of_passing": 7200, + "pausable": true, + "super": false, + }) + assert.NoError(t, err) + defer createResp.Body.Close() + var createResult model.Quiz + err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.NoError(t, err) + quizQID := createResult.Qid + + resp, err := createQuestionRequest(validToken, map[string]interface{}{ + "quiz_id": createResult.Id, + "title": "Какой основной компонент воздуха?", + "type": "variant", + "description": "Выберите один правильный ответ.", + "required": true, + "page": 1, + "content": "{}", + }) + 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")) + + resp, err = createQuizTemplateRequest(validToken, quizQID) assert.NoError(t, err) defer resp.Body.Close() @@ -6775,9 +6877,54 @@ func TestCreateQuizTemplate_Success(t *testing.T) { assert.IsType(t, float64(0), result["id"]) } +// отсмотрено func TestCreateQuizTemplate_Auth(t *testing.T) { + createResp, err := createQuizRequest(validToken, map[string]interface{}{ + "name": "Квиз для теста авторизации", + "description": "Тест для проверки авторизации при создании шаблонов", + "fingerprinting": false, + "repeatable": false, + "note_prevented": true, + "mail_notifications": false, + "unique_answers": true, + "config": "{\"showCorrectAnswers\": false, \"strictMode\": true}", + "status": "template", + "limit": 50, + "question_cnt": 5, + "time_of_passing": 1800, + "pausable": false, + "super": false, + }) + assert.NoError(t, err) + defer createResp.Body.Close() + var createResult model.Quiz + err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.NoError(t, err) + quizQID := createResult.Qid + + resp, err := createQuestionRequest(validToken, map[string]interface{}{ + "quiz_id": createResult.Id, + "title": "Какой основной компонент воздуха?", + "type": "variant", + "description": "Выберите один правильный ответ.", + "required": true, + "page": 1, + "content": "{}", + }) + 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")) + t.Run("NoToken", func(t *testing.T) { - req, err := http.NewRequest("POST", baseURL+"/quiz/template", nil) + payload := map[string]interface{}{ + "qid": quizQID, + } + jsonData, err := json.Marshal(payload) + assert.NoError(t, err) + + req, err := http.NewRequest("POST", baseURL+"/quiz/template", bytes.NewReader(jsonData)) assert.NoError(t, err) req.Header.Set("Content-Type", "application/json") @@ -6787,19 +6934,74 @@ func TestCreateQuizTemplate_Auth(t *testing.T) { }) t.Run("InvalidToken", func(t *testing.T) { - resp, err := createQuizTemplateRequest("invalid_token") + resp, err := createQuizTemplateRequest("invalid_token", quizQID) assert.NoError(t, err) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) }) } +// отсмотрено func TestCreateQuizTemplate_Performance(t *testing.T) { + createResp, err := createQuizRequest(validToken, map[string]interface{}{ + "name": "Квиз для теста производительности", + "description": "Тест производительности создания шаблонов", + "fingerprinting": true, + "repeatable": true, + "note_prevented": false, + "mail_notifications": true, + "unique_answers": false, + "config": "{\"showCorrectAnswers\": true, \"performanceMode\": true}", + "status": "template", + "limit": 150, + "question_cnt": 12, + "time_of_passing": 5400, + "pausable": true, + "super": false, + }) + assert.NoError(t, err) + defer createResp.Body.Close() + var createResult model.Quiz + err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.NoError(t, err) + quizQID := createResult.Qid + + resp, err := createQuestionRequest(validToken, map[string]interface{}{ + "quiz_id": createResult.Id, + "title": "Какой основной компонент воздуха?", + "type": "variant", + "description": "Выберите один правильный ответ.", + "required": true, + "page": 1, + "content": "{}", + }) + 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")) + + resp, err = createQuestionRequest(validToken, map[string]interface{}{ + "quiz_id": createResult.Id, + "title": "Какой основной компонент воздуха?", + "type": "variant", + "description": "Выберите один правильный ответ.", + "required": true, + "page": 1, + "content": "{}", + }) + 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")) + t.Run("ResponseTime", func(t *testing.T) { start := time.Now() - resp, err := createQuizTemplateRequest(validToken) + resp, err := createQuizTemplateRequest(validToken, quizQID) duration := time.Since(start) assert.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) defer resp.Body.Close() assert.Less(t, duration.Milliseconds(), int64(500)) }) @@ -6810,8 +7012,9 @@ func TestCreateQuizTemplate_Performance(t *testing.T) { wg.Add(1) go func() { defer wg.Done() - resp, err := createQuizTemplateRequest(validToken) + resp, err := createQuizTemplateRequest(validToken, quizQID) if err == nil && resp != nil { + assert.Equal(t, http.StatusOK, resp.StatusCode) resp.Body.Close() } }() @@ -6820,6 +7023,222 @@ func TestCreateQuizTemplate_Performance(t *testing.T) { }) } +// отсмотрено +func TestCreateQuizTemplate_InputValidation(t *testing.T) { + t.Run("EmptyQid", func(t *testing.T) { + payload := map[string]interface{}{ + "qid": "", + } + jsonData, err := json.Marshal(payload) + assert.NoError(t, err) + + req, err := http.NewRequest("POST", baseURL+"/quiz/template", bytes.NewReader(jsonData)) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer "+validToken) + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + }) + + t.Run("MissingQid", func(t *testing.T) { + payload := map[string]interface{}{} + jsonData, err := json.Marshal(payload) + assert.NoError(t, err) + + req, err := http.NewRequest("POST", baseURL+"/quiz/template", bytes.NewReader(jsonData)) + assert.NoError(t, err) + req.Header.Set("Authorization", "Bearer "+validToken) + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + }) + + t.Run("InvalidQid", func(t *testing.T) { + resp, err := createQuizTemplateRequest(validToken, "invalid-qid-format") + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + }) + + t.Run("NonExistentQid", func(t *testing.T) { + resp, err := createQuizTemplateRequest(validToken, "non-existent-qid-12345") + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + }) + + t.Run("QuizWithDraftStatus", func(t *testing.T) { + createResp, err := createQuizRequest(validToken, map[string]interface{}{ + "name": "Квиз со статусом draft", + "description": "Квиз для тестирования статуса draft", + "fingerprinting": false, + "repeatable": true, + "note_prevented": false, + "mail_notifications": false, + "unique_answers": false, + "config": "{\"showCorrectAnswers\": true}", + "status": "draft", + "limit": 10, + "question_cnt": 2, + "time_of_passing": 600, + "pausable": false, + "super": false, + }) + assert.NoError(t, err) + defer createResp.Body.Close() + var createResult model.Quiz + err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.NoError(t, err) + + resp, err := createQuizTemplateRequest(validToken, createResult.Qid) + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + }) +} + +// todo +func TestCreateQuizTemplate_Security(t *testing.T) { + createResp, err := createQuizRequest(validToken, map[string]interface{}{ + "name": "Квиз для теста безопасности", + "description": "Тест безопасности при создании шаблонов", + "fingerprinting": true, + "repeatable": false, + "note_prevented": true, + "mail_notifications": false, + "unique_answers": true, + "config": "{\"showCorrectAnswers\": false, \"securityMode\": true}", + "status": "template", + "limit": 75, + "question_cnt": 8, + "time_of_passing": 2700, + "pausable": false, + "super": false, + }) + assert.NoError(t, err) + defer createResp.Body.Close() + var createResult model.Quiz + err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.NoError(t, err) + + t.Run("SQLInjection", func(t *testing.T) { + resp, err := createQuizTemplateRequest(validToken, sqlInjectionInput) + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + }) + + t.Run("XSSAttempt", func(t *testing.T) { + resp, err := createQuizTemplateRequest(validToken, xssInput) + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + }) + + t.Run("LargeQid", func(t *testing.T) { + largeQid := strings.Repeat("a", 1000) + resp, err := createQuizTemplateRequest(validToken, largeQid) + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + }) +} + +// отсмотрено +func TestCreateQuizTemplate_SpecialCases(t *testing.T) { + createResp, err := createQuizRequest(validToken, map[string]interface{}{ + "name": "Квиз для специальных случаев", + "description": "Тест специальных случаев создания шаблонов", + "fingerprinting": false, + "repeatable": true, + "note_prevented": false, + "mail_notifications": true, + "unique_answers": false, + "config": "{\"showCorrectAnswers\": true, \"flexibleMode\": true}", + "status": "template", + "limit": 300, + "question_cnt": 25, + "time_of_passing": 9000, + "pausable": true, + "super": false, + }) + assert.NoError(t, err) + defer createResp.Body.Close() + var createResult model.Quiz + err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.NoError(t, err) + quizQID := createResult.Qid + + resp, err := createQuestionRequest(validToken, map[string]interface{}{ + "quiz_id": createResult.Id, + "title": "Какой основной компонент воздуха?", + "type": "variant", + "description": "Выберите один правильный ответ.", + "required": true, + "page": 1, + "content": "{}", + }) + 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")) + + t.Run("DuplicateTemplateCreation", func(t *testing.T) { + resp1, err := createQuizTemplateRequest(validToken, quizQID) + assert.NoError(t, err) + defer resp1.Body.Close() + assert.Equal(t, http.StatusOK, resp1.StatusCode) + + resp2, err := createQuizTemplateRequest(validToken, quizQID) + assert.NoError(t, err) + defer resp2.Body.Close() + assert.Equal(t, http.StatusOK, resp2.StatusCode) + + var result1, result2 map[string]interface{} + err = json.NewDecoder(resp1.Body).Decode(&result1) + assert.NoError(t, err) + err = json.NewDecoder(resp2.Body).Decode(&result2) + assert.NoError(t, err) + assert.NotEqual(t, result1["id"], result2["id"]) + }) + // todo need 403 + t.Run("TemplateFromDifferentUser", func(t *testing.T) { + createResp2, err := createQuizRequest(existingUserIDToken, map[string]interface{}{ + "name": "Квиз другого пользователя", + "description": "Квиз созданный другим пользователем для тестирования доступа", + "fingerprinting": true, + "repeatable": false, + "note_prevented": true, + "mail_notifications": false, + "unique_answers": true, + "config": "{\"showCorrectAnswers\": false, \"privateMode\": true}", + "status": "template", + "limit": 60, + "question_cnt": 6, + "time_of_passing": 2400, + "pausable": false, + "super": false, + }) + assert.NoError(t, err) + defer createResp2.Body.Close() + var createResult2 model.Quiz + err = json.NewDecoder(createResp2.Body).Decode(&createResult2) + assert.NoError(t, err) + + resp, err := createQuizTemplateRequest(validToken, createResult2.Qid) + assert.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusForbidden, resp.StatusCode) + }) +} + func getResultsRequest(token string, quizId string, body map[string]interface{}) (*http.Response, error) { payload, err := json.Marshal(body) if err != nil {