From 3e30800ee0d22901443a0cfa044cd3a33387f036 Mon Sep 17 00:00:00 2001 From: pasha1coil Date: Mon, 14 Jul 2025 15:58:08 +0300 Subject: [PATCH] first, added sql for tables and jwt emulation --- tests/jwt_helper.go | 88 ++++++++++++++++++++++++++++++++++++++++++ tests/main_test.go | 42 ++++++++++---------- tests/test_data.sql | 94 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 203 insertions(+), 21 deletions(-) create mode 100644 tests/jwt_helper.go create mode 100644 tests/test_data.sql diff --git a/tests/jwt_helper.go b/tests/jwt_helper.go new file mode 100644 index 0000000..9cfdfdf --- /dev/null +++ b/tests/jwt_helper.go @@ -0,0 +1,88 @@ +package tests + +import ( + "fmt" + "github.com/golang-jwt/jwt/v5" + "strings" + "time" +) + +func CreateJWT(userID string) string { + var privateKey = strings.Replace(`-----BEGIN RSA PRIVATE KEY----- + MIICWwIBAAKBgHgnvr7O2tiApjJfid1orFnIGm6980fZp+Lpbjo+NC/0whMFga2B + iw5b1G2Q/B2u0tpO1Fs/E8z7Lv1nYfr5jx2S8x6BdA4TS2kB9Kf0wn0+7wSlyikH + oKhbtzwXHZl17GsyEi6wHnsqNBSauyIWhpha8i+Y+3GyaOY536H47qyXAgMBAAEC + gYAOphnVPXbk6lpYzdkLC1Xn5EOEuNfOLLURLxBnPWozZo26r/Mtahu/9mYhrYlv + PP8r6mxta3VIil8iOdZyOLa/4d1LPd+UehgEXIJEiYXLtn7RS5eUnoPuQxssfs1k + OWjdN8p6SzppleegFTvGRX4KM3cDLfSphOk8JuBCrpSSYQJBAOdqizTSrdKMTuVe + c7Jk1JOJkyFuFs+N5zeryyeFGH7IpRdWy0rkWMxIUAi8Ap1vYVBPHv4tDOo3sy5X + VLc/knkCQQCE62pg+0TmsrhO/2Pgog6MLBkzlzXYMRp/01HbmznwYF+ejfPnzLkz + hnUlxRUNK3lhXM/7H6oAjvqF2R72u/OPAkEAterkmdbQfEZ+MwNoEiH/lie9OLdx + SSI1VGdBYcTYN7qFRW6eizYstBJYkDU0HQ0Uw+we4hMKJwk4W0KdvxxDiQJAeqlB + V1QqBneBbK10PzVuFV8QtrJhJyxRVwrtbKq38iMNuqUnI4+ijXEUpJFWVvv6nKXo + 7McQvEk12dU/JNTX8wJAOlAtSNjp9tVwpMpC0w2St1eKc1L2SknjeohA5ldoBz8sGeZsPhTU3eHSD1neAZXLKN5K68z3zFBr20ubY9nyLw== + -----END RSA PRIVATE KEY-----`, "\t", "", -1) + + privateKeyPem, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(privateKey)) + if err != nil { + panic(fmt.Errorf("failed to parse private key on of : %w", err)) + return "" + } + + now := time.Now().UTC() + + claims := jwt.MapClaims{ + "id": userID, + "exp": now.Add(5 * time.Minute).Unix(), + "aud": "pena", + "iss": "pena-auth-service", + } + + token, err := jwt.NewWithClaims(jwt.SigningMethodRS256, claims).SignedString(privateKeyPem) + if err != nil { + panic(fmt.Errorf("failed to sing on of : %w", err)) + return "" + } + + return token +} + +func CreateExpiredToken(userID string) string { + var privateKey = strings.Replace(`-----BEGIN RSA PRIVATE KEY----- + MIICWwIBAAKBgHgnvr7O2tiApjJfid1orFnIGm6980fZp+Lpbjo+NC/0whMFga2B + iw5b1G2Q/B2u0tpO1Fs/E8z7Lv1nYfr5jx2S8x6BdA4TS2kB9Kf0wn0+7wSlyikH + oKhbtzwXHZl17GsyEi6wHnsqNBSauyIWhpha8i+Y+3GyaOY536H47qyXAgMBAAEC + gYAOphnVPXbk6lpYzdkLC1Xn5EOEuNfOLLURLxBnPWozZo26r/Mtahu/9mYhrYlv + PP8r6mxta3VIil8iOdZyOLa/4d1LPd+UehgEXIJEiYXLtn7RS5eUnoPuQxssfs1k + OWjdN8p6SzppleegFTvGRX4KM3cDLfSphOk8JuBCrpSSYQJBAOdqizTSrdKMTuVe + c7Jk1JOJkyFuFs+N5zeryyeFGH7IpRdWy0rkWMxIUAi8Ap1vYVBPHv4tDOo3sy5X + VLc/knkCQQCE62pg+0TmsrhO/2Pgog6MLBkzlzXYMRp/01HbmznwYF+ejfPnzLkz + hnUlxRUNK3lhXM/7H6oAjvqF2R72u/OPAkEAterkmdbQfEZ+MwNoEiH/lie9OLdx + SSI1VGdBYcTYN7qFRW6eizYstBJYkDU0HQ0Uw+we4hMKJwk4W0KdvxxDiQJAeqlB + V1QqBneBbK10PzVuFV8QtrJhJyxRVwrtbKq38iMNuqUnI4+ijXEUpJFWVvv6nKXo + 7McQvEk12dU/JNTX8wJAOlAtSNjp9tVwpMpC0w2St1eKc1L2SknjeohA5ldoBz8sGeZsPhTU3eHSD1neAZXLKN5K68z3zFBr20ubY9nyLw== + -----END RSA PRIVATE KEY-----`, "\t", "", -1) + + privateKeyPem, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(privateKey)) + if err != nil { + panic(fmt.Errorf("failed to parse private key on of : %w", err)) + return "" + } + + now := time.Now().UTC() + + claims := jwt.MapClaims{ + "id": userID, + "exp": now.Add(-1 * time.Hour).Unix(), + "aud": "pena", + "iss": "pena-auth-service", + } + + token, err := jwt.NewWithClaims(jwt.SigningMethodRS256, claims).SignedString(privateKeyPem) + if err != nil { + panic(fmt.Errorf("failed to sing on of : %w", err)) + return "" + } + + return token +} diff --git a/tests/main_test.go b/tests/main_test.go index 7352449..000fbec 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -14,33 +14,33 @@ import ( "time" ) +var PublicKey = `-----BEGIN PUBLIC KEY-----MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHgnvr7O2tiApjJfid1orFnIGm6980fZp+Lpbjo+NC/0whMFga2Biw5b1G2Q/B2u0tpO1Fs/E8z7Lv1nYfr5jx2S8x6BdA4TS2kB9Kf0wn0+7wSlyikHoKhbtzwXHZl17GsyEi6wHnsqNBSauyIWhpha8i+Y+3GyaOY536H47qyXAgMBAAE=-----END PUBLIC KEY-----` + var baseURL = os.Getenv("API_BASE_URL") -var validToken = os.Getenv("VALID_JWT_TOKEN") -var expiredToken = os.Getenv("EXPIRED_JWT_TOKEN") +var validToken = CreateJWT(validUserID) // validUserID +var expiredToken = CreateExpiredToken(validUserID) -//todo -var validTokenForDelete = os.Getenv("VALID_JWT_TOKEN_FOR_DELETE") - -var validAdminToken = os.Getenv("VALID_ADMIN_JWT_TOKEN") -var existingUserIDToken = os.Getenv("EXISTING_USER_ID_JWT_TOKEN") +// todo +var validTokenForDelete = CreateJWT(userIDForDelete) // userIDForDelete +var validAdminToken = CreateJWT(validUserID) // os.Getenv("VALID_ADMIN_JWT_TOKEN") +var existingUserIDToken = CreateJWT(existingUserID) // existingUserID // Токены для операций удаления // todo -var deleteAccountToken = os.Getenv("DELETE_ACCOUNT_TOKEN") +var deleteAccountToken = CreateJWT(userIDForDelete) // userIDForDelete +var deleteQuestionToken = CreateJWT(userIDForDelete) // userIDForDelete +var deleteQuizToken = CreateJWT(userIDForDelete) // userIDForDelete +var deleteResultToken = CreateJWT(userIDForDelete) // userIDForDelete +var deleteLeadTargetToken = CreateJWT(userIDForDelete) // userIDForDelete +var deletedAccountToken = CreateJWT(userIDForDelete) // userIDForDelete +var AccountWithOutPrivilegeToken = CreateJWT(userWithoutPrivileges) // userWithoutPrivileges -var deleteQuestionToken = os.Getenv("DELETE_QUESTION_TOKEN") -var deleteQuizToken = os.Getenv("DELETE_QUIZ_TOKEN") -var deleteResultToken = os.Getenv("DELETE_RESULT_TOKEN") -var deleteLeadTargetToken = os.Getenv("DELETE_LEAD_TARGET_TOKEN") -var deletedAccountToken = os.Getenv("DELETED_ACCOUNT_TOKEN") -var AccountWithOutPrivilegeToken = os.Getenv("ACCOUNT_WITH_PRIVILEGE_TOKEN") - -//todo -var userIDForDelete = os.Getenv("USER_ID_FOR_DELETE") - -var existingUserID = os.Getenv("EXISTING_USER_ID") -var testUserID = os.Getenv("TEST_USER_ID") -var userWithoutPrivileges = os.Getenv("USER_NO_PRIVILEGES") +// todo +var userIDForDelete = "user_for_delete_789" +var existingUserID = "existing_user_456" +var testUserID = "test_user_123" +var userWithoutPrivileges = "no_privileges_user" +var validUserID = "multi_privileges_user" var sqlInjectionInput = "'; DROP TABLE accounts; --" var xssInput = "" diff --git a/tests/test_data.sql b/tests/test_data.sql new file mode 100644 index 0000000..c88c369 --- /dev/null +++ b/tests/test_data.sql @@ -0,0 +1,94 @@ +-- DELETE FROM quiz_privilege_usage; +-- DELETE FROM privileges; +-- DELETE FROM answer; +-- DELETE FROM question; +-- DELETE FROM quiz; +-- DELETE FROM account; + + +INSERT INTO account (id, user_id, created_at, deleted) VALUES + ('550e8400-e29b-41d4-a716-446655440001', 'test_user_123', CURRENT_TIMESTAMP, false), + ('550e8400-e29b-41d4-a716-446655440002', 'existing_user_456', CURRENT_TIMESTAMP, false), + ('550e8400-e29b-41d4-a716-446655440003', 'user_for_delete_789', CURRENT_TIMESTAMP, false), + ('550e8400-e29b-41d4-a716-446655440004', 'deleted_user_999', CURRENT_TIMESTAMP, true), + ('550e8400-e29b-41d4-a716-446655440005', 'no_privileges_user', CURRENT_TIMESTAMP, false), + ('550e8400-e29b-41d4-a716-446655440006', 'multi_privileges_user', CURRENT_TIMESTAMP, false); + +INSERT INTO privileges (privilegeID, account_id, privilege_name, amount) VALUES + ('quizCnt', '550e8400-e29b-41d4-a716-446655440001', 'Количество Заявок', 10), + ('quizUnlimTime', '550e8400-e29b-41d4-a716-446655440002', 'Безлимит Опросов', 30), + ('squizHideBadge', '550e8400-e29b-41d4-a716-446655440002', 'Скрытие шильдика в опроснике', 15), + ('quizManual', '550e8400-e29b-41d4-a716-446655440003', 'Заказать quiz', 2), + ('quizGigaChat', '550e8400-e29b-41d4-a716-446655440003', 'Услуга от GigaChat', 5), + ('quizCnt', '550e8400-e29b-41d4-a716-446655440006', 'Количество Заявок', 50), + ('quizUnlimTime', '550e8400-e29b-41d4-a716-446655440006', 'Безлимит Опросов', 90), + ('squizHideBadge', '550e8400-e29b-41d4-a716-446655440006', 'Скрытие шильдика в опроснике', 60), + ('quizManual', '550e8400-e29b-41d4-a716-446655440006', 'Заказать quiz', 10), + ('quizGigaChat', '550e8400-e29b-41d4-a716-446655440006', 'Услуга от GigaChat', 20); + +INSERT INTO quiz (qid, accountid, name, description, status, created_at, updated_at) VALUES + (gen_random_uuid(), 'test_user_123', 'Тестовый квиз 1', 'Описание тестового квиза 1', 'start', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'test_user_123', 'Тестовый квиз 2', 'Описание тестового квиза 2', 'draft', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'existing_user_456', 'Существующий квиз 1', 'Описание существующего квиза 1', 'start', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'existing_user_456', 'Существующий квиз 2', 'Описание существующего квиза 2', 'template', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'user_for_delete_789', 'Квиз для удаления 1', 'Описание квиза для удаления 1', 'start', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'user_for_delete_789', 'Квиз для удаления 2', 'Описание квиза для удаления 2', 'draft', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'multi_privileges_user', 'Мультипривилегированный квиз 1', 'Описание мультипривилегированного квиза 1', 'start', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'multi_privileges_user', 'Мультипривилегированный квиз 2', 'Описание мультипривилегированного квиза 2', 'template', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + +DO $$ + DECLARE + quiz1_id BIGINT; + quiz2_id BIGINT; + quiz3_id BIGINT; + quiz4_id BIGINT; + quiz5_id BIGINT; + quiz6_id BIGINT; + quiz7_id BIGINT; + quiz8_id BIGINT; + BEGIN + SELECT id INTO quiz1_id FROM quiz WHERE name = 'Тестовый квиз 1' LIMIT 1; + SELECT id INTO quiz2_id FROM quiz WHERE name = 'Тестовый квиз 2' LIMIT 1; + SELECT id INTO quiz3_id FROM quiz WHERE name = 'Существующий квиз 1' LIMIT 1; + SELECT id INTO quiz4_id FROM quiz WHERE name = 'Существующий квиз 2' LIMIT 1; + SELECT id INTO quiz5_id FROM quiz WHERE name = 'Квиз для удаления 1' LIMIT 1; + SELECT id INTO quiz6_id FROM quiz WHERE name = 'Квиз для удаления 2' LIMIT 1; + SELECT id INTO quiz7_id FROM quiz WHERE name = 'Мультипривилегированный квиз 1' LIMIT 1; + SELECT id INTO quiz8_id FROM quiz WHERE name = 'Мультипривилегированный квиз 2' LIMIT 1; + + INSERT INTO question (quiz_id, title, description, questiontype, required, deleted, page, content, version) VALUES + (quiz1_id, 'Первый вопрос тестового квиза', 'Описание первого вопроса', 'variant', true, false, 1, '{"options": ["Вариант 1", "Вариант 2", "Вариант 3"]}', 1), + (quiz1_id, 'Второй вопрос тестового квиза', 'Описание второго вопроса', 'text', false, false, 1, '{"placeholder": "Введите ответ"}', 1), + (quiz2_id, 'Вопрос черновика', 'Описание вопроса черновика', 'select', true, false, 1, '{"options": ["Выбор 1", "Выбор 2"]}', 1), + (quiz3_id, 'Вопрос существующего квиза', 'Описание вопроса существующего квиза', 'rating', false, false, 1, '{"max_rating": 5}', 1), + (quiz4_id, 'Вопрос шаблона', 'Описание вопроса шаблона', 'emoji', true, false, 1, '{"emojis": ["😀", "😢", "😡"]}', 1), + (quiz5_id, 'Вопрос для удаления 1', 'Описание вопроса для удаления 1', 'variant', true, false, 1, '{"options": ["Удалить 1", "Удалить 2"]}', 1), + (quiz5_id, 'Вопрос для удаления 2', 'Описание вопроса для удаления 2', 'text', false, false, 1, '{"placeholder": "Введите текст для удаления"}', 1), + (quiz6_id, 'Вопрос черновика для удаления', 'Описание вопроса черновика для удаления', 'select', true, false, 1, '{"options": ["Удалить выбор 1", "Удалить выбор 2"]}', 1), + (quiz7_id, 'Вопрос мультипривилегированного квиза 1', 'Описание вопроса мультипривилегированного квиза 1', 'images', true, false, 1, '{"images": ["image1.jpg", "image2.jpg"]}', 1), + (quiz8_id, 'Вопрос мультипривилегированного квиза 2', 'Описание вопроса мультипривилегированного квиза 2', 'varimg', false, false, 1, '{"options": ["Вариант с картинкой 1", "Вариант с картинкой 2"], "images": ["img1.jpg", "img2.jpg"]}', 1); + + INSERT INTO answer (content, quiz_id, question_id, fingerprint, session, version) VALUES + ('Ответ на первый вопрос', quiz1_id, (SELECT id FROM question WHERE title = 'Первый вопрос тестового квиза' LIMIT 1), 'fp_test_1', 'session_1', 1), + ('Ответ на второй вопрос', quiz1_id, (SELECT id FROM question WHERE title = 'Второй вопрос тестового квиза' LIMIT 1), 'fp_test_2', 'session_1', 1), + ('Ответ на вопрос существующего квиза', quiz3_id, (SELECT id FROM question WHERE title = 'Вопрос существующего квиза' LIMIT 1), 'fp_existing_1', 'session_2', 1), + ('Ответ на вопрос шаблона', quiz4_id, (SELECT id FROM question WHERE title = 'Вопрос шаблона' LIMIT 1), 'fp_template_1', 'session_3', 1), + ('Ответ на вопрос для удаления 1', quiz5_id, (SELECT id FROM question WHERE title = 'Вопрос для удаления 1' LIMIT 1), 'fp_delete_1', 'session_4', 1), + ('Ответ на вопрос для удаления 2', quiz5_id, (SELECT id FROM question WHERE title = 'Вопрос для удаления 2' LIMIT 1), 'fp_delete_2', 'session_4', 1), + ('Ответ на вопрос мультипривилегированного квиза 1', quiz7_id, (SELECT id FROM question WHERE title = 'Вопрос мультипривилегированного квиза 1' LIMIT 1), 'fp_multipriv_1', 'session_5', 1), + ('Ответ на вопрос мультипривилегированного квиза 2', quiz8_id, (SELECT id FROM question WHERE title = 'Вопрос мультипривилегированного квиза 2' LIMIT 1), 'fp_multipriv_2', 'session_6', 1); + + INSERT INTO quiz_privilege_usage (quiz_id, privilege_id, used_count) VALUES + (quiz1_id, 'quizCnt', 2), + (quiz3_id, 'quizUnlimTime', 1), + (quiz4_id, 'squizHideBadge', 1), + (quiz5_id, 'quizManual', 2), + (quiz7_id, 'quizGigaChat', 1), + (quiz8_id, 'quizCnt', 1); + + END $$; + +UPDATE quiz SET + questions_count = (SELECT COUNT(*) FROM question WHERE quiz_id = quiz.id AND deleted = false), + answers_count = (SELECT COUNT(*) FROM answer WHERE quiz_id = quiz.id) +WHERE id IN (SELECT DISTINCT quiz_id FROM question); \ No newline at end of file