learnsteam-quiz-api/test/quiz_test.go
2023-11-17 01:38:01 +09:00

184 lines
4.3 KiB
Go

package learsteam_quiz_test
import (
"encoding/json"
"learnsteam/learsteam-quiz-api/internal/controllers"
"learnsteam/learsteam-quiz-api/internal/models"
"learnsteam/learsteam-quiz-api/internal/repositories"
"learnsteam/learsteam-quiz-api/internal/services"
"os"
"strconv"
"testing"
"time"
"github.com/google/uuid"
"github.com/stretchr/testify/suite"
"github.com/tj/assert"
"gorm.io/datatypes"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
type QuizTestSuite struct {
suite.Suite
db *gorm.DB
repository repositories.QuizRepository
service services.QuizService
controller controllers.QuizController
}
func (suite *QuizTestSuite) SetupSuite() {
// err := os.Remove("test.db")
// if err != nil {
// suite.Fail("Failed to remove the test database file")
// }
gorm_config := gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}}
db, _ := gorm.Open(sqlite.Open("test.db"), &gorm_config)
db.AutoMigrate(&models.Quiz{})
repository := repositories.NewQuizRepository(db)
service := services.NewQuizService(repository)
controller := controllers.NewQuizController(service)
suite.db = db
suite.service = service
suite.repository = repository
suite.controller = controller
suite.CreateSampleData()
}
func (suite *QuizTestSuite) CreateSampleData() {
var quizzes []models.Quiz
program_id := "1_id"
c := []string{"1", "2", "3", "4"}
var j datatypes.JSON
j, _ = json.Marshal(c)
for i := 1; i < 6; i++ {
q := models.Quiz{
ID: strconv.Itoa(i),
ProgramID: program_id,
Sequence: i,
QuizType: "multiple",
Question: strconv.Itoa(i) + " question",
Choice: j,
Answer: j,
Hint: "힌트입니다.",
Comment: "설명입니다.",
UpdatedAt: time.Now(),
CreatedAt: time.Now(),
}
quizzes = append(quizzes, q)
}
for _, quiz := range quizzes {
suite.db.Create(&quiz)
}
}
func (suite *QuizTestSuite) TearDownSuite() {
// DB 삭제
suite.db.Migrator().DropTable(&models.Quiz{})
err := os.Remove("test.db")
if err != nil {
suite.Fail("Failed to remove the test database file")
}
}
func (suite *QuizTestSuite) SetupTest() {
suite.CreateSampleData()
}
func (suite *QuizTestSuite) TearDownTest() {
}
func TestQuizSuite(t *testing.T) {
suite.Run(t, new(QuizTestSuite))
}
// 목록 테스트
func (suite *QuizTestSuite) TestListQuizSuccess() {
quizzes, err := suite.repository.List("id_1", 1, 10)
assert.NoError(suite.T(), err)
assert.NotNil(suite.T(), quizzes)
assert.Equal(suite.T(), 5, len(*quizzes))
}
// Find 테스트
func (suite *QuizTestSuite) TestFindQuizSuccess() {
quiz, err := suite.repository.Find("1")
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), "1", quiz.ID)
}
// Find 테스트
func (suite *QuizTestSuite) TestFindQuizFail() {
_, err := suite.repository.Find("x")
assert.Error(suite.T(), err)
}
// 수정 테스트
func (suite *QuizTestSuite) TestUpdateQuizFail() {
c := []string{"1", "2", "3", "4"}
var j datatypes.JSON
j, _ = json.Marshal(c)
q := &models.Quiz{
ID: uuid.NewString(),
ProgramID: uuid.NewString(),
Sequence: 1,
QuizType: "multiple",
Question: "question",
Choice: j,
Answer: j,
Hint: "힌트입니다.",
Comment: "설명입니다.",
UpdatedAt: time.Now(),
CreatedAt: time.Now(),
}
quiz, err := suite.repository.Create(q)
assert.NoError(suite.T(), err)
quiz.QuizType = "check"
quiz.Choice = j
quiz.Answer = j
quiz.Hint = "힌트입니다!"
updatedQuiz, err := suite.repository.Update(quiz)
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), updatedQuiz.QuizType, quiz.QuizType)
assert.Equal(suite.T(), updatedQuiz.Choice, quiz.Choice)
assert.Equal(suite.T(), updatedQuiz.Answer, quiz.Answer)
}
// 삭제 테스트
func (suite *QuizTestSuite) TestDeleteQuizSuccess() {
c := []string{"1", "2", "3", "4"}
var j datatypes.JSON
j, _ = json.Marshal(c)
q := &models.Quiz{
ID: uuid.NewString(),
ProgramID: uuid.NewString(),
Sequence: 1,
QuizType: "multiple",
Question: "question",
Choice: j,
Answer: j,
Hint: "힌트입니다.",
Comment: "설명입니다.",
UpdatedAt: time.Now(),
CreatedAt: time.Now(),
}
_, err := suite.repository.Create(q)
assert.NoError(suite.T(), err)
err = suite.repository.Delete(q.ID)
assert.NoError(suite.T(), err)
_, err = suite.repository.Find(q.ID)
assert.Error(suite.T(), err)
}