review, next getResultsRequest

This commit is contained in:
pasha1coil 2025-07-17 19:17:54 +03:00
parent 64a076a299
commit c8fb9c74ae

@ -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 {