package tests import ( "context" "github.com/pioz/faker" "math" "math/rand" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/quiz" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/result" "penahub.gitlab.yandexcloud.net/backend/quiz/core.git/clients/auth" //"database/sql" "fmt" "testing" "time" "github.com/stretchr/testify/assert" bdd "github.com/themakers/bdd" ) const baseURL = "http://localhost:" const authClientUrl = "test.com" const postgresCred string = "host=localhost port=35432 user=squiz password=Redalert2 dbname=squiz sslmode=disable" const appPort = "1488" const storerPort = "1489" const answererPort = "1490" const healthChecksPort = "5489" var types4testing = []string{ model.TypeVariant, model.TypeImages, model.TypeVarImages, model.TypeFile, model.TypeText, model.TypeEmoji, model.TypeSelect, model.TypeDate, model.TypeNumber, model.TypePage, model.TypeRating, } func TestDAL(t *testing.T) { //login := "D" + strconv.FormatInt(time.Now().Unix(), 10) //token := registerUser(login) // //m, ok := token.Claims.(jwt.MapClaims) //if !ok { // panic("malformed JWT") //} // //id, ok := m["id"].(string) //if !ok || id == "" { // panic("missing id claim in JWT") //} id := "123" ctx := context.Background() authClient := auth.NewAuthClient(authClientUrl) fmt.Println(id) bdd.Scenario(t, "DAL testing", func(t *testing.T, runID string) { var ( err error d *dal.DAL records []model.Quiz questions []model.Question answersSession string ) bdd.Act(t, "Postgres Tables Creating", func() { bdd.Test(t, "test dbconnect", func() { d, err = dal.New(ctx, postgresCred, authClient) assert.NoError(t, err, nil) assert.NotNil(t, d, nil) }) //bdd.Test(t, "positive test of table creating", func() { // err = d.Init() // assert.NoError(t, err, nil) //}) // //bdd.Test(t, "negative test of table creating", func() { // err = d.Init() // assert.NoError(t, err, nil) //}) }) bdd.Act(t, "create quiz testing", func() { record := model.Quiz{ AccountId: id, Fingerprinting: true, Repeatable: true, NotePrevented: true, MailNotifications: true, UniqueAnswers: true, Name: "test", Description: "test", Config: `{"Mailing": {"When": "test","Theme": "Quiz test","Reply": "test","ReplName": "test"}}`, Status: model.StatusDraft, Limit: 100, DueTo: uint64(time.Now().Add(time.Hour).Unix()), TimeOfPassing: 60, Pausable: true, GroupId: 2, } statuses4creating := []string{ model.StatusDraft, model.StatusStart, model.StatusStop, model.StatusOffLimit, model.StatusTimeout, model.StatusTemplate, } for i := 0; i < 100; i++ { record2 := model.Quiz{ AccountId: id, Fingerprinting: true, Repeatable: true, NotePrevented: true, MailNotifications: true, UniqueAnswers: true, Name: record.Name + fmt.Sprint(i), Description: "test", Config: `{"Mailing": {"When": "test","Theme": "Quiz test","Reply": "test","ReplName": "test"}}`, Status: statuses4creating[rand.Intn(len(statuses4creating))], Limit: 100, DueTo: uint64(time.Now().Add(time.Hour).Unix()), ParentIds: []int32{}, TimeOfPassing: 60, Pausable: true, GroupId: 1, } bdd.Test(t, "positive quiz storing", func() { err := d.QuizRepo.CreateQuiz(ctx, &record2) assert.NoError(t, err, nil) assert.NotZero(t, record2.Id, nil) assert.NotEqual(t, record2.CreatedAt, nil) assert.NotEqual(t, record2.UpdatedAt, nil) records = append(records, record2) }) } for i := 0; i < len(records)-1; i++ { if records[i].Status == model.StatusStart { bdd.Test(t, "get quiz by qid", func() { qu, err := d.QuizRepo.GetQuizByQid(ctx, records[i].Qid) assert.Equal(t, records[i].Id, qu.Id) assert.NoError(t, err, nil) }) } bdd.Test(t, "get quiz by id", func() { qu, err := d.QuizRepo.GetQuizById(ctx, id, records[i].Id) assert.Equal(t, records[i].Id, qu.Id) assert.Equal(t, records[i].Qid, qu.Qid) assert.NoError(t, err, nil) }) bdd.Test(t, "get quiz config", func() { _, _, err := d.QuizRepo.GetQuizConfig(ctx, records[i].Id) assert.NoError(t, err, nil) }) } for i := 0; i < len(records)%80; i++ { bdd.Test(t, "update quiz", func() { updquiz := model.Quiz{ Id: records[i].Id, Qid: records[i].Qid, AccountId: id, Deleted: records[i].Deleted, Archived: records[i].Archived, Fingerprinting: records[i].Fingerprinting, Repeatable: records[i].Repeatable, NotePrevented: records[i].NotePrevented, MailNotifications: records[i].MailNotifications, UniqueAnswers: records[i].UniqueAnswers, Name: faker.String() + records[i].Name, Description: faker.String() + records[i].Description, Config: faker.String() + records[i].Config, Status: records[i].Status, Limit: records[i].Limit, DueTo: records[i].DueTo, TimeOfPassing: records[i].TimeOfPassing, Pausable: records[i].Pausable, Version: records[i].Version, VersionComment: records[i].VersionComment, ParentIds: records[i].ParentIds, CreatedAt: records[i].CreatedAt, UpdatedAt: records[i].UpdatedAt, QuestionsCount: records[i].QuestionsCount, SessionCount: records[i].SessionCount, PassedCount: records[i].PassedCount, AverageTime: records[i].AverageTime, Super: records[i].Super, GroupId: records[i].GroupId, } err := d.QuizRepo.UpdateQuiz(ctx, id, updquiz) assert.NoError(t, err, nil) }) bdd.Test(t, "move to history quiz", func() { qu, err := d.QuizRepo.MoveToHistoryQuiz(ctx, records[i].Id, id) assert.Equal(t, records[i].Id+100, qu.Id) assert.NoError(t, err, nil) }) } bdd.Test(t, "negative test quiz storing1", func() { record.Name = faker.StringWithSize(300) err := d.QuizRepo.CreateQuiz(ctx, &record) assert.Error(t, err, nil) }) bdd.Test(t, "negative test quiz storing2", func() { record.Status = model.StatusTemplate err := d.QuizRepo.CreateQuiz(ctx, &record) assert.Error(t, err, nil) }) }) bdd.Act(t, "get list of quizes", func() { bdd.Test(t, "get list of quizes", func() { res, _, err := d.QuizRepo.GetQuizList(ctx, quiz.GetQuizListDeps{ Limit: 10, Offset: 0, From: 0, To: 0, Group: 0, Deleted: false, Archived: false, Super: true, Search: "", Status: "", AccountId: id, }) assert.NoError(t, err, nil) assert.Equal(t, 0, len(res), nil) //assert.Greater(t, cnt, uint64(0), nil) }) }) bdd.Act(t, "create question testing", func() { quix4filling := records[rand.Intn(len(records))] for _, questionType := range types4testing { bdd.Test(t, fmt.Sprintf("positive question creating: %s", questionType), func() { question := model.Question{ Id: 0, QuizId: quix4filling.Id, Title: "testNone", Description: "sample text", Type: questionType, Required: true, Deleted: false, Page: 0, Content: "test", Version: 0, ParentIds: nil, CreatedAt: time.Now(), UpdatedAt: time.Now(), } err := d.QuestionRepo.CreateQuestion(ctx, &question) assert.NoError(t, err, nil) assert.NotZero(t, question.Id, nil) questions = append(questions, question) bdd.Test(t, "get question list", func() { ques, count, err := d.QuestionRepo.GetQuestionList(ctx, 0, 10, 1226358000, 1289430000, quix4filling.Id, false, true, "", questionType) fmt.Println(ques) fmt.Println(count) assert.NoError(t, err, nil) }) }) } bdd.Test(t, "test create answers", func() { testanswers := make([]model.Answer, 0) for i := 0; i < 15; i++ { recAns := model.Answer{ Content: "test", QuestionId: questions[0].Id, Result: false, Email: faker.String(), QuizId: faker.Uint64(), } testanswers = append(testanswers, recAns) } answersSession = faker.String() anss, err := d.AnswerRepo.CreateAnswers(ctx, testanswers, answersSession, "seeeeeeeesssion", questions[0].QuizId) if len(err) != 0 { assert.NoError(t, err[0], nil) } if len(anss) != len(testanswers) { panic("test create answers crushed") } }) bdd.Test(t, "Get All Answers By Quiz ID(session)", func() { ansss, err := d.AnswerRepo.GetAllAnswersByQuizID(ctx, answersSession) assert.NoError(t, err, nil) assert.Equal(t, 1, len(ansss)) }) bdd.Test(t, "update question", func() { for i := 0; i < len(questions)%80; i++ { bdd.Test(t, "get question title", func() { title, tipe, err := d.QuestionRepo.GetQuestionTitleByID(ctx, questions[i].Id) assert.NoError(t, err, nil) assert.Equal(t, questions[i].Title, title) assert.Equal(t, questions[i].Type, tipe) }) updateques := model.Question{ Id: questions[i].Id, QuizId: questions[i].QuizId, Title: faker.String() + questions[i].Title, Description: faker.String() + questions[i].Description, Type: questions[i].Type, Required: questions[i].Required, Deleted: questions[i].Deleted, Page: questions[i].Page, Content: faker.String() + questions[i].Content, Version: questions[i].Version, ParentIds: questions[i].ParentIds, CreatedAt: questions[i].CreatedAt, UpdatedAt: questions[i].UpdatedAt, } err := d.QuestionRepo.UpdateQuestion(ctx, updateques) assert.NoError(t, err, nil) bdd.Test(t, "move to history question", func() { que, err := d.QuestionRepo.MoveToHistoryQuestion(ctx, questions[i].Id) assert.NoError(t, err, nil) assert.Equal(t, questions[i].Id+11, que.Id) }) } }) bdd.Test(t, "negative question creating: overflow title", func() { question := model.Question{ Id: 0, QuizId: quix4filling.Id, Title: faker.StringWithSize(1024), Description: "sample text", Type: model.TypeText, Required: true, Deleted: false, Page: 0, Content: "test", Version: 0, ParentIds: nil, CreatedAt: time.Time{}, UpdatedAt: time.Time{}, } err := d.QuestionRepo.CreateQuestion(ctx, &question) assert.Error(t, err, nil) }) bdd.Test(t, "negative question creating: invalid status", func() { question := model.Question{ Id: 0, QuizId: quix4filling.Id, Title: `testNonete`, Description: "sample text", Type: "test", Required: true, Deleted: true, Page: 0, Content: "test", Version: 0, ParentIds: nil, CreatedAt: time.Time{}, UpdatedAt: time.Time{}, } err := d.QuestionRepo.CreateQuestion(ctx, &question) assert.Error(t, err, nil) }) }) bdd.Act(t, "edit some questions", func() { bdd.Test(t, "positive delete question", func() { question, err := d.QuestionRepo.DeleteQuestion(ctx, questions[0].Id) assert.NoError(t, err) assert.True(t, question.Deleted) questions[0] = question }) bdd.Test(t, "negative delete question", func() { question, err := d.QuestionRepo.DeleteQuestion(ctx, math.MaxUint64) assert.Error(t, err) assert.Zero(t, question.Id) }) bdd.Test(t, "positive create new version of question", func() { questions[0].Deleted = true questions[0].Version += 1 questions[0].ParentIds = append(questions[0].ParentIds, int32(questions[0].Id)) questions[0].Title = faker.StringWithSize(100) err := d.QuestionRepo.CreateQuestion(ctx, &questions[0]) assert.NoError(t, err) }) }) bdd.Act(t, "edit some quizes", func() { bdd.Test(t, "positive delete quiz", func() { quiz, err := d.QuizRepo.DeleteQuiz(ctx, id, records[0].Id) fmt.Println(quiz) assert.NoError(t, err) assert.True(t, quiz.Deleted) records[0].Id = quiz.Id }) bdd.Test(t, "negative delete question", func() { quiz, err := d.QuizRepo.DeleteQuiz(ctx, id, math.MaxUint64) assert.Error(t, err) assert.Zero(t, quiz.Id) }) bdd.Test(t, "positive create new version of question", func() { records[0].Deleted = true records[0].Version += 1 records[0].ParentIds = append(records[0].ParentIds, int32(records[0].Id)) records[0].Name = faker.StringWithSize(100) err := d.QuizRepo.CreateQuiz(ctx, &records[0]) assert.NoError(t, err) }) }) bdd.Act(t, "update expired quizes", func() { bdd.Test(t, "check that we have quizes for expiration", func() { record2 := model.Quiz{ AccountId: id, Fingerprinting: true, Repeatable: true, NotePrevented: true, MailNotifications: true, UniqueAnswers: true, Name: faker.StringWithSize(100), Description: "test", Config: "test", Status: model.StatusStart, Limit: 0, DueTo: uint64(time.Now().Add(-time.Hour).Unix()), TimeOfPassing: 0, Pausable: false, } err := d.QuizRepo.CreateQuiz(ctx, &record2) assert.NoError(t, err, nil) assert.NotZero(t, record2.Id, nil) assert.NotEqual(t, record2.CreatedAt, nil) assert.NotEqual(t, record2.UpdatedAt, nil) }) }) bdd.Act(t, "copy question flow", func() { bdd.Test(t, "duplicate question", func() { copiedQuestion, err := d.QuestionRepo.CopyQuestion(ctx, questions[4].Id, 0) assert.NoError(t, err) assert.Equal(t, questions[4].QuizId, copiedQuestion.QuizId) assert.NotEqual(t, questions[4].Id, copiedQuestion.Id) }) bdd.Test(t, "copy question to another quiz", func() { copiedQuestion, err := d.QuestionRepo.CopyQuestion(ctx, questions[4].Id, records[10].Id) assert.NoError(t, err) assert.Equal(t, records[10].Id, copiedQuestion.QuizId) assert.NotEqual(t, questions[4].Id, copiedQuestion.Id) }) }) bdd.Act(t, "copy quiz flow", func() { bdd.Test(t, "quiz duplication", func() { copiesQuiz, err := d.QuizRepo.CopyQuiz(ctx, records[10].AccountId, records[10].Id) assert.NoError(t, err) assert.NotEqual(t, records[10].Id, copiesQuiz.Id) }) }) bdd.Act(t, "get history for quiz", func() { bdd.Test(t, "positive quiz history", func() { hist, err := d.QuizRepo.QuizHistory(ctx, quiz.QuizHistoryDeps{ Id: records[0].Id, Limit: 100, Offset: 0, AccountId: id, }) assert.NoError(t, err) assert.Equal(t, len(hist), 2) }) bdd.Test(t, "negative quiz history", func() { _, err := d.QuizRepo.QuizHistory(ctx, quiz.QuizHistoryDeps{ Id: math.MaxUint64, Limit: 100, Offset: 0, AccountId: id, }) assert.NoError(t, err) assert.Equal(t, nil, nil) }) }) bdd.Act(t, "get history for question", func() { bdd.Test(t, "positive question history", func() { hist, err := d.QuestionRepo.QuestionHistory(ctx, questions[0].Id, 100, 0) assert.NoError(t, err) assert.Equal(t, len(hist), 2) }) bdd.Test(t, "negative question history", func() { _, err := d.QuestionRepo.QuestionHistory(ctx, math.MaxUint64, 100, 0) assert.NoError(t, err) }) }) bdd.Act(t, "Worker Stat Process", func() { err := d.WorkerRepo.WorkerStatProcess(ctx) assert.NoError(t, err, nil) }) bdd.Act(t, "Worker Timeout Process", func() { err := d.WorkerRepo.WorkerTimeoutProcess(ctx) assert.NoError(t, err, nil) }) // todo нужно будет обновить эти тесты связать с выше стоящими bdd.Act(t, "Get Account By ID", func() { account, err := d.AccountRepo.GetAccountByID(ctx, "64eb6ce57047f28fdabf69ec") assert.NoError(t, err, nil) fmt.Println(account) }) bdd.Act(t, "Get Privileges By Account ID", func() { privileges, err := d.AccountRepo.GetPrivilegesByAccountID(ctx, "64eb6ce57047f28fdabf69ec") assert.NoError(t, err, nil) fmt.Println(privileges) }) bdd.Act(t, "Get Accounts", func() { accounts, count, err := d.AccountRepo.GetAccounts(ctx, 10, 0) assert.NoError(t, err, nil) fmt.Println(accounts) fmt.Println(len(accounts)) fmt.Println(count) }) bdd.Act(t, "Update Privilege", func() { priv := model.ShortPrivilege{ PrivilegeID: "quizCnt", PrivilegeName: "Количество Заявок", Amount: 0, CreatedAt: time.Now(), } err := d.AccountRepo.UpdatePrivilege(ctx, &priv, "047c1109-1fba-47d8-b4ec-6ded153a2ea9") assert.NoError(t, err, nil) }) bdd.Act(t, "Insert Privilege", func() { priv := model.ShortPrivilege{ PrivilegeID: "quizCnt", PrivilegeName: "123", Amount: 123, CreatedAt: time.Now(), } err := d.AccountRepo.InsertPrivilege(ctx, &priv, "047c1109-1fba-47d8-b4ec-6ded153a2ea9") assert.NoError(t, err, nil) }) bdd.Act(t, "Get Expired", func() { priv, err := d.AccountRepo.GetExpired(ctx, "quizCnt") fmt.Println(priv) assert.NoError(t, err, nil) }) bdd.Act(t, "Delete Privilege By ID", func() { err := d.AccountRepo.DeletePrivilegeByID(ctx, "10") assert.NoError(t, err, nil) }) bdd.Act(t, "Update Privilege Amount", func() { err := d.AccountRepo.UpdatePrivilegeAmount(ctx, "2", 100000) assert.NoError(t, err, nil) }) bdd.Act(t, "Get Acc And Privilege By Email(userid)", func() { acc, priv, err := d.AccountRepo.GetAccAndPrivilegeByEmail(ctx, "650061935ad320604ff24cc2") fmt.Println(acc, priv) assert.NoError(t, err, nil) }) bdd.Act(t, "Get Quiz Results", func() { now := time.Now() yearAgo := now.AddDate(-1, 0, 0) yearAhead := now.AddDate(1, 0, 0) ansexp, count, err := d.ResultRepo.GetQuizResults(ctx, 9422, result.GetQuizResDeps{ To: yearAhead, From: yearAgo, New: false, Page: 1, Limit: 10, }, true) assert.NoError(t, err, nil) fmt.Println(ansexp) fmt.Println(count) }) bdd.Act(t, "Update Answers Status", func() { err := d.ResultRepo.UpdateAnswersStatus(ctx, "64eb6ce57047f28fdabf69ec", []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) assert.NoError(t, err, nil) }) bdd.Act(t, "Get Quiz Results CSV", func() { now := time.Now() yearAgo := now.AddDate(-1, 0, 0) yearAhead := now.AddDate(1, 0, 0) ans, err := d.ResultRepo.GetQuizResultsCSV(ctx, 14734, result.GetQuizResDeps{ To: yearAhead, From: yearAgo, New: false, }) fmt.Println(ans) assert.NoError(t, err, nil) }) bdd.Act(t, "Get Questions", func() { ques, err := d.ResultRepo.GetQuestions(ctx, 14734) fmt.Println(ques) assert.NoError(t, err, nil) }) bdd.Act(t, "Check Results Owner", func() { anss, err := d.ResultRepo.CheckResultsOwner(ctx, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "64eb6ce57047f28fdabf69ec") fmt.Println(anss) assert.NoError(t, err, nil) }) bdd.Act(t, "Get Result Answers", func() { anss, err := d.ResultRepo.GetResultAnswers(ctx, 1) fmt.Println(anss) assert.NoError(t, err, nil) }) bdd.Act(t, "Check Result Owner", func() { anss, err := d.ResultRepo.CheckResultOwner(ctx, 1, "64eb6ce57047f28fdabf69ec") assert.Equal(t, anss, true) assert.NoError(t, err, nil) }) bdd.Act(t, "Soft Delete Result By ID", func() { err := d.ResultRepo.SoftDeleteResultByID(ctx, 10) assert.NoError(t, err, nil) }) }) }