review, next getResultsRequest
This commit is contained in:
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 {
|
||||
|
Loading…
Reference in New Issue
Block a user