184 lines
4.3 KiB
Go
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)
|
||
|
}
|