删掉失效的文件
This commit is contained in:
		| @@ -1,38 +0,0 @@ | ||||
| package repository_test | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
| 	"testing" | ||||
|  | ||||
| 	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"gorm.io/driver/sqlite" | ||||
| 	"gorm.io/gorm" | ||||
| ) | ||||
|  | ||||
| // setupTestDB 是一个共享的辅助函数,用于为集成测试创建一个干净的、内存中的 SQLite 数据库实例。 | ||||
| func setupTestDB(t *testing.T) *gorm.DB { | ||||
| 	// "file::memory:?cache=shared" 是 GORM 连接内存 SQLite 的标准方式,确保在同一测试中的不同连接可以访问相同的数据,而我们显然不需要这个 | ||||
| 	db, err := gorm.Open(sqlite.Open("file::memory:"), &gorm.Config{}) | ||||
| 	assert.NoError(t, err, "连接内存数据库时发生错误") | ||||
|  | ||||
| 	// 自动迁移所有需要的表结构 | ||||
| 	err = db.AutoMigrate(models.GetAllModels()...) | ||||
| 	assert.NoError(t, err, "数据库迁移时发生错误") | ||||
|  | ||||
| 	return db | ||||
| } | ||||
|  | ||||
| // TestMain 是一个特殊的函数,它会在包内的所有测试运行之前被调用。 | ||||
| // 我们可以在这里进行一些全局的设置和清理工作。 | ||||
| func TestMain(m *testing.M) { | ||||
| 	// 在所有测试运行前可以执行一些设置代码 | ||||
|  | ||||
| 	// 运行包中的所有测试 | ||||
| 	code := m.Run() | ||||
|  | ||||
| 	// 在所有测试运行后可以执行一些清理代码 | ||||
|  | ||||
| 	// 退出测试 | ||||
| 	os.Exit(code) | ||||
| } | ||||
| @@ -1,78 +0,0 @@ | ||||
| // Package repository_test 包含对 repository 包的集成测试 | ||||
| package repository_test | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models" | ||||
| 	"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"gorm.io/gorm" | ||||
| ) | ||||
|  | ||||
| func TestGormUserRepository(t *testing.T) { | ||||
| 	db := setupTestDB(t) | ||||
| 	repo := repository.NewGormUserRepository(db) | ||||
|  | ||||
| 	plainPassword := "my-secret-password" | ||||
| 	userToCreate := &models.User{ | ||||
| 		Username: "testuser", | ||||
| 		Password: plainPassword, // 我们提供的是明文密码 | ||||
| 	} | ||||
|  | ||||
| 	t.Run("创建 - 成功创建并验证密码哈希", func(t *testing.T) { | ||||
| 		err := repo.Create(userToCreate) | ||||
| 		assert.NoError(t, err) | ||||
|  | ||||
| 		// 验证用户已被创建 | ||||
| 		assert.NotZero(t, userToCreate.ID) | ||||
|  | ||||
| 		// 从数据库中直接取回记录,以验证 BeforeSave 钩子是否生效 | ||||
| 		var savedUser models.User | ||||
| 		db.First(&savedUser, userToCreate.ID) | ||||
|  | ||||
| 		// 验证密码字段存储的不是明文 | ||||
| 		assert.NotEqual(t, plainPassword, savedUser.Password, "数据库中存储的密码不应是明文") | ||||
|  | ||||
| 		// 验证存储的哈希是正确的 | ||||
| 		assert.True(t, savedUser.CheckPassword(plainPassword), "存储的密码哈希应该能与原明文匹配") | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("创建 - 用户名冲突", func(t *testing.T) { | ||||
| 		// 尝试创建一个同名用户 | ||||
| 		duplicateUser := &models.User{Username: "testuser", Password: "anypassword"} | ||||
| 		err := repo.Create(duplicateUser) | ||||
|  | ||||
| 		// 我们期望一个错误,因为用户名是唯一的 | ||||
| 		assert.Error(t, err, "创建同名用户应该返回错误") | ||||
| 		// 更精确地,可以检查是否是唯一键冲突错误 | ||||
| 		assert.Contains(t, err.Error(), "UNIQUE constraint failed: users.username", "错误信息应包含唯一键冲突") | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("按用户名查找 - 找到用户", func(t *testing.T) { | ||||
| 		foundUser, err := repo.FindByUsername("testuser") | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.NotNil(t, foundUser) | ||||
| 		assert.Equal(t, userToCreate.ID, foundUser.ID) | ||||
| 		assert.Equal(t, "testuser", foundUser.Username) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("按用户名查找 - 未找到用户", func(t *testing.T) { | ||||
| 		_, err := repo.FindByUsername("nonexistent") | ||||
| 		assert.Error(t, err, "查找不存在的用户应该返回错误") | ||||
| 		assert.ErrorIs(t, err, gorm.ErrRecordNotFound, "错误类型应为 gorm.ErrRecordNotFound") | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("按ID查找 - 找到用户", func(t *testing.T) { | ||||
| 		foundUser, err := repo.FindByID(userToCreate.ID) | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.NotNil(t, foundUser) | ||||
| 		assert.Equal(t, userToCreate.ID, foundUser.ID) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("按ID查找 - 未找到用户", func(t *testing.T) { | ||||
| 		_, err := repo.FindByID(99999) | ||||
| 		assert.Error(t, err, "查找不存在的ID应该返回错误") | ||||
| 		assert.ErrorIs(t, err, gorm.ErrRecordNotFound, "错误类型应为 gorm.ErrRecordNotFound") | ||||
| 	}) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user