diff --git a/tests/main_test.go b/tests/main_test.go index c5bf72e..7ab2cf2 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -1395,6 +1395,7 @@ func manualDoneRequest(token string, body map[string]string) (*http.Response, er return http.DefaultClient.Do(req) } +// todo func TestManualDone_Success(t *testing.T) { resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": testUserID}) assert.NoError(t, err) @@ -1407,6 +1408,7 @@ func TestManualDone_Success(t *testing.T) { assert.Equal(t, testUserID, result["id"]) } +// отсмотрено func TestManualDone_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]string{"id": testUserID}) @@ -1434,6 +1436,7 @@ func TestManualDone_Auth(t *testing.T) { }) } +// отсмотрено func TestManualDone_Validation(t *testing.T) { t.Run("EmptyBody", func(t *testing.T) { payload := []byte(`{}`) @@ -1451,7 +1454,7 @@ func TestManualDone_Validation(t *testing.T) { t.Run("InvalidID", func(t *testing.T) { resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": "invalid_id"}) assert.NoError(t, err) - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, http.StatusNotFound, resp.StatusCode) }) t.Run("NonExistentID", func(t *testing.T) { @@ -1461,6 +1464,7 @@ func TestManualDone_Validation(t *testing.T) { }) } +// отсмотрено func TestManualDone_BoundaryCases(t *testing.T) { t.Run("LongID", func(t *testing.T) { longID := strings.Repeat("a", 1000) // Очень длинный ID @@ -1471,6 +1475,7 @@ func TestManualDone_BoundaryCases(t *testing.T) { assert.NotEqual(t, http.StatusInternalServerError, resp.StatusCode) }) + // todo t.Run("UnicodeID", func(t *testing.T) { unicodeID := "тест_id_123" // Unicode символы resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": unicodeID}) @@ -1481,10 +1486,11 @@ func TestManualDone_BoundaryCases(t *testing.T) { }) } +// отсмотрено func TestManualDone_Performance(t *testing.T) { t.Run("ResponseTime", func(t *testing.T) { start := time.Now() - resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": testUserID}) + resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": validUserID}) assert.NoError(t, err) defer resp.Body.Close() @@ -1492,34 +1498,9 @@ func TestManualDone_Performance(t *testing.T) { assert.Less(t, duration.Milliseconds(), int64(500)) // < 500ms assert.Equal(t, http.StatusOK, resp.StatusCode) }) - - t.Run("LoadTest", func(t *testing.T) { - var wg sync.WaitGroup - successCount := 0 - var mu sync.Mutex - - for i := 0; i < 20; i++ { - wg.Add(1) - go func(index int) { - defer wg.Done() - testID := fmt.Sprintf("load_test_id_%d", index) - resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": testID}) - if err == nil && resp != nil { - defer resp.Body.Close() - if resp.StatusCode == http.StatusOK { - mu.Lock() - successCount++ - mu.Unlock() - } - } - }(i) - } - wg.Wait() - - assert.Greater(t, successCount, 10) // > 50% успешных - }) } +// todo func TestManualDone_Security(t *testing.T) { t.Run("SQLInjection", func(t *testing.T) { resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": sqlInjectionInput}) @@ -1534,9 +1515,10 @@ func TestManualDone_Security(t *testing.T) { }) } +// отсмотрено func TestManualDone_SpecialCases(t *testing.T) { t.Run("TransactionAtomicity", func(t *testing.T) { - resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": testUserID}) + resp, err := manualDoneRequest(validAdminToken, map[string]string{"id": validUserID}) assert.NoError(t, err) defer resp.Body.Close() @@ -1544,11 +1526,11 @@ func TestManualDone_SpecialCases(t *testing.T) { }) t.Run("Idempotency", func(t *testing.T) { - resp1, err := manualDoneRequest(validAdminToken, map[string]string{"id": testUserID}) + resp1, err := manualDoneRequest(validAdminToken, map[string]string{"id": validUserID}) assert.NoError(t, err) defer resp1.Body.Close() - resp2, err := manualDoneRequest(validAdminToken, map[string]string{"id": testUserID}) + resp2, err := manualDoneRequest(validAdminToken, map[string]string{"id": validUserID}) assert.NoError(t, err) defer resp2.Body.Close() @@ -1571,6 +1553,7 @@ func createLeadTargetRequest(token string, body map[string]interface{}) (*http.R return http.DefaultClient.Do(req) } +// отсмотрено func TestCreateLeadTarget_Success(t *testing.T) { resp, err := createLeadTargetRequest(validToken, map[string]interface{}{ "type": "mail", @@ -1582,14 +1565,9 @@ func TestCreateLeadTarget_Success(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusOK, resp.StatusCode) - assert.Equal(t, "application/json", resp.Header.Get("Content-Type")) - - var result map[string]interface{} - err = json.NewDecoder(resp.Body).Decode(&result) - assert.NoError(t, err) - assert.NotEmpty(t, result["id"]) } +// отсмотрено func TestCreateLeadTarget_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]interface{}{ @@ -1629,6 +1607,7 @@ func TestCreateLeadTarget_Auth(t *testing.T) { }) } +// отсмотрено func TestCreateLeadTarget_InputValidation(t *testing.T) { t.Run("MissingRequiredFields", func(t *testing.T) { resp, err := createLeadTargetRequest(validToken, map[string]interface{}{ @@ -1658,6 +1637,7 @@ func TestCreateLeadTarget_InputValidation(t *testing.T) { }) } +// todo func TestCreateLeadTarget_Security(t *testing.T) { t.Run("SQLInjection", func(t *testing.T) { resp, err := createLeadTargetRequest(validToken, map[string]interface{}{ @@ -1682,6 +1662,7 @@ func TestCreateLeadTarget_Security(t *testing.T) { }) } +// отсмотрено func TestCreateLeadTarget_Performance(t *testing.T) { t.Run("ResponseTime", func(t *testing.T) { start := time.Now() @@ -1717,6 +1698,7 @@ func TestCreateLeadTarget_Performance(t *testing.T) { }) } +// отсмотрено func TestCreateLeadTarget_BoundaryCases(t *testing.T) { t.Run("MaxLengthFields", func(t *testing.T) { longEmail := strings.Repeat("a", 100) + "@domain.com" @@ -1746,6 +1728,7 @@ func TestCreateLeadTarget_BoundaryCases(t *testing.T) { }) } +// отсмотрено func TestCreateLeadTarget_SpecialCases(t *testing.T) { t.Run("TransactionAtomicity", func(t *testing.T) { resp, err := createLeadTargetRequest(validToken, map[string]interface{}{ @@ -1756,7 +1739,7 @@ func TestCreateLeadTarget_SpecialCases(t *testing.T) { assert.NoError(t, err) defer resp.Body.Close() - assert.True(t, resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusInternalServerError) + assert.True(t, resp.StatusCode == http.StatusOK) }) t.Run("DataValidation", func(t *testing.T) { @@ -1769,15 +1752,6 @@ func TestCreateLeadTarget_SpecialCases(t *testing.T) { 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) - - assert.NotEmpty(t, result["id"]) - assert.Equal(t, "mail", result["type"]) - assert.Equal(t, float64(123), result["quizID"]) - assert.Equal(t, "validation@mail.com", result["target"]) }) } @@ -1795,6 +1769,7 @@ func updateLeadTargetRequest(token string, body map[string]interface{}) (*http.R return http.DefaultClient.Do(req) } +// отсмотрено func TestUpdateLeadTarget_Success(t *testing.T) { createResp, err := createLeadTargetRequest(validToken, map[string]interface{}{ "type": "mail", @@ -1803,14 +1778,18 @@ func TestUpdateLeadTarget_Success(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - - var createResult map[string]interface{} - err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.Equal(t, http.StatusOK, createResp.StatusCode) + getResp, err := getLeadTargetByQuizIDRequest(validToken, "123") assert.NoError(t, err) - targetID := createResult["id"] + defer getResp.Body.Close() + assert.Equal(t, http.StatusOK, getResp.StatusCode) + var getRespLead []model.LeadTarget + err = json.NewDecoder(getResp.Body).Decode(&getRespLead) + assert.NoError(t, err) + assert.True(t, len(getRespLead) > 0) resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ - "id": targetID, + "id": getRespLead[0].ID, "target": "new_target@mail.com", }) assert.NoError(t, err) @@ -1822,10 +1801,11 @@ func TestUpdateLeadTarget_Success(t *testing.T) { var result map[string]interface{} err = json.NewDecoder(resp.Body).Decode(&result) assert.NoError(t, err) - assert.Equal(t, targetID, result["id"]) + assert.Equal(t, float64(getRespLead[0].ID), result["id"]) assert.Equal(t, "new_target@mail.com", result["target"]) } +// отсмотрено func TestUpdateLeadTarget_Auth(t *testing.T) { t.Run("NoToken", func(t *testing.T) { payload, err := json.Marshal(map[string]interface{}{ @@ -1862,6 +1842,7 @@ func TestUpdateLeadTarget_Auth(t *testing.T) { }) } +// отсмотрено func TestUpdateLeadTarget_InputValidation(t *testing.T) { t.Run("MissingRequiredFields", func(t *testing.T) { resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ @@ -1901,6 +1882,7 @@ func TestUpdateLeadTarget_InputValidation(t *testing.T) { }) } +// отсмотрено func TestUpdateLeadTarget_Existence(t *testing.T) { t.Run("NonExistentID", func(t *testing.T) { resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ @@ -1913,6 +1895,7 @@ func TestUpdateLeadTarget_Existence(t *testing.T) { }) } +// todo func TestUpdateLeadTarget_Security(t *testing.T) { t.Run("SQLInjection", func(t *testing.T) { resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ @@ -1935,6 +1918,7 @@ func TestUpdateLeadTarget_Security(t *testing.T) { }) } +// отсмотрено func TestUpdateLeadTarget_Performance(t *testing.T) { t.Run("ResponseTime", func(t *testing.T) { createResp, err := createLeadTargetRequest(validToken, map[string]interface{}{ @@ -1944,15 +1928,19 @@ func TestUpdateLeadTarget_Performance(t *testing.T) { }) assert.NoError(t, err) defer createResp.Body.Close() - - var createResult map[string]interface{} - err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.Equal(t, http.StatusOK, createResp.StatusCode) + getResp, err := getLeadTargetByQuizIDRequest(validToken, "123") assert.NoError(t, err) - targetID := createResult["id"] + defer getResp.Body.Close() + assert.Equal(t, http.StatusOK, getResp.StatusCode) + var getRespLead []model.LeadTarget + err = json.NewDecoder(getResp.Body).Decode(&getRespLead) + assert.NoError(t, err) + assert.True(t, len(getRespLead) > 0) start := time.Now() resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ - "id": targetID, + "id": getRespLead[0].ID, "target": "updated_perf@mail.com", }) duration := time.Since(start) @@ -1961,61 +1949,31 @@ func TestUpdateLeadTarget_Performance(t *testing.T) { defer resp.Body.Close() assert.Less(t, duration.Milliseconds(), int64(1000)) }) - - t.Run("LoadTest", func(t *testing.T) { - var wg sync.WaitGroup - for i := 0; i < 30; i++ { - wg.Add(1) - go func(index int) { - defer wg.Done() - createResp, err := createLeadTargetRequest(validToken, map[string]interface{}{ - "type": "mail", - "quizID": 1000, - "target": fmt.Sprintf("load%d@mail.com", index), - }) - if err != nil { - return - } - defer createResp.Body.Close() - - var createResult map[string]interface{} - err = json.NewDecoder(createResp.Body).Decode(&createResult) - if err != nil { - return - } - targetID := createResult["id"] - - resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ - "id": targetID, - "target": fmt.Sprintf("updated_load%d@mail.com", index), - }) - if err == nil && resp != nil { - resp.Body.Close() - } - }(i) - } - wg.Wait() - }) } +// отсмотрено func TestUpdateLeadTarget_BoundaryCases(t *testing.T) { t.Run("MaxLengthTarget", func(t *testing.T) { createResp, err := createLeadTargetRequest(validToken, map[string]interface{}{ "type": "mail", - "quizID": 1000, - "target": "old@mail.com", + "quizID": 456, + "target": "perf@mail.com", }) assert.NoError(t, err) defer createResp.Body.Close() - - var createResult map[string]interface{} - err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.Equal(t, http.StatusOK, createResp.StatusCode) + getResp, err := getLeadTargetByQuizIDRequest(validToken, "123") assert.NoError(t, err) - targetID := createResult["id"] + defer getResp.Body.Close() + assert.Equal(t, http.StatusOK, getResp.StatusCode) + var getRespLead []model.LeadTarget + err = json.NewDecoder(getResp.Body).Decode(&getRespLead) + assert.NoError(t, err) + assert.True(t, len(getRespLead) > 0) longEmail := strings.Repeat("a", 100) + "@domain.com" resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ - "id": targetID, + "id": getRespLead[0].ID, "target": longEmail, }) assert.NoError(t, err) @@ -2026,19 +1984,23 @@ func TestUpdateLeadTarget_BoundaryCases(t *testing.T) { t.Run("SpecialCharacters", func(t *testing.T) { createResp, err := createLeadTargetRequest(validToken, map[string]interface{}{ "type": "mail", - "quizID": 999, - "target": "old@mail.com", + "quizID": 456, + "target": "perf@mail.com", }) assert.NoError(t, err) defer createResp.Body.Close() - - var createResult map[string]interface{} - err = json.NewDecoder(createResp.Body).Decode(&createResult) + assert.Equal(t, http.StatusOK, createResp.StatusCode) + getResp, err := getLeadTargetByQuizIDRequest(validToken, "123") assert.NoError(t, err) - targetID := createResult["id"] + defer getResp.Body.Close() + assert.Equal(t, http.StatusOK, getResp.StatusCode) + var getRespLead []model.LeadTarget + err = json.NewDecoder(getResp.Body).Decode(&getRespLead) + assert.NoError(t, err) + assert.True(t, len(getRespLead) > 0) resp, err := updateLeadTargetRequest(validToken, map[string]interface{}{ - "id": targetID, + "id": getRespLead[0].ID, "target": "special!@#$%^&*()@domain.com", }) assert.NoError(t, err)