You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
8.3 KiB
258 lines
8.3 KiB
import { expect } from 'chai'
|
|
import { UserModel } from '../../src/db/models/UserModel.js'
|
|
import db from '../../src/db/index.js'
|
|
|
|
describe('UserModel', () => {
|
|
before(async () => {
|
|
// 确保users表存在
|
|
const exists = await db.schema.hasTable('users')
|
|
if (!exists) {
|
|
await db.schema.createTable('users', (table) => {
|
|
table.increments('id').primary()
|
|
table.string('username').unique()
|
|
table.string('email').unique()
|
|
table.string('password')
|
|
table.string('role').defaultTo('user')
|
|
table.string('status').defaultTo('active')
|
|
table.string('phone')
|
|
table.integer('age')
|
|
table.string('name')
|
|
table.text('bio')
|
|
table.string('avatar')
|
|
table.timestamp('created_at').defaultTo(db.fn.now())
|
|
table.timestamp('updated_at').defaultTo(db.fn.now())
|
|
})
|
|
}
|
|
})
|
|
|
|
after(async () => {
|
|
// 清理测试数据
|
|
await db('users').del()
|
|
})
|
|
|
|
beforeEach(async () => {
|
|
// 清空用户数据
|
|
await db('users').del()
|
|
})
|
|
|
|
describe('User Creation', () => {
|
|
it('应该正确创建用户', async () => {
|
|
const userData = {
|
|
username: 'testuser',
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
name: 'Test User'
|
|
}
|
|
|
|
const user = await UserModel.create(userData)
|
|
|
|
expect(user).to.have.property('id')
|
|
expect(user.username).to.equal('testuser')
|
|
expect(user.email).to.equal('test@example.com')
|
|
expect(user.name).to.equal('Test User')
|
|
expect(user.role).to.equal('user')
|
|
expect(user.status).to.equal('active')
|
|
})
|
|
|
|
it('应该防止重复用户名', async () => {
|
|
const userData1 = {
|
|
username: 'duplicateuser',
|
|
email: 'test1@example.com',
|
|
password: 'password123'
|
|
}
|
|
|
|
const userData2 = {
|
|
username: 'duplicateuser',
|
|
email: 'test2@example.com',
|
|
password: 'password123'
|
|
}
|
|
|
|
await UserModel.create(userData1)
|
|
|
|
try {
|
|
await UserModel.create(userData2)
|
|
expect.fail('应该抛出错误')
|
|
} catch (error) {
|
|
expect(error.message).to.include('用户名已存在')
|
|
}
|
|
})
|
|
|
|
it('应该防止重复邮箱', async () => {
|
|
const userData1 = {
|
|
username: 'user1',
|
|
email: 'duplicate@example.com',
|
|
password: 'password123'
|
|
}
|
|
|
|
const userData2 = {
|
|
username: 'user2',
|
|
email: 'duplicate@example.com',
|
|
password: 'password123'
|
|
}
|
|
|
|
await UserModel.create(userData1)
|
|
|
|
try {
|
|
await UserModel.create(userData2)
|
|
expect.fail('应该抛出错误')
|
|
} catch (error) {
|
|
expect(error.message).to.include('邮箱已存在')
|
|
}
|
|
})
|
|
})
|
|
|
|
describe('User Queries', () => {
|
|
let testUser
|
|
|
|
beforeEach(async () => {
|
|
testUser = await UserModel.create({
|
|
username: 'testuser',
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
name: 'Test User'
|
|
})
|
|
})
|
|
|
|
it('应该按ID查找用户', async () => {
|
|
const user = await UserModel.findById(testUser.id)
|
|
expect(user).to.deep.equal(testUser)
|
|
})
|
|
|
|
it('应该按用户名查找用户', async () => {
|
|
const user = await UserModel.findByUsername('testuser')
|
|
expect(user).to.deep.equal(testUser)
|
|
})
|
|
|
|
it('应该按邮箱查找用户', async () => {
|
|
const user = await UserModel.findByEmail('test@example.com')
|
|
expect(user).to.deep.equal(testUser)
|
|
})
|
|
|
|
it('应该查找所有用户', async () => {
|
|
await UserModel.create({
|
|
username: 'anotheruser',
|
|
email: 'another@example.com',
|
|
password: 'password123'
|
|
})
|
|
|
|
const users = await UserModel.findAll()
|
|
expect(users).to.have.length(2)
|
|
})
|
|
})
|
|
|
|
describe('User Updates', () => {
|
|
let testUser
|
|
|
|
beforeEach(async () => {
|
|
testUser = await UserModel.create({
|
|
username: 'testuser',
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
name: 'Test User'
|
|
})
|
|
})
|
|
|
|
it('应该正确更新用户', async () => {
|
|
const updated = await UserModel.update(testUser.id, {
|
|
name: 'Updated Name',
|
|
phone: '123456789'
|
|
})
|
|
|
|
expect(updated.name).to.equal('Updated Name')
|
|
expect(updated.phone).to.equal('123456789')
|
|
expect(updated.email).to.equal('test@example.com') // 未更新的字段保持不变
|
|
})
|
|
|
|
it('应该防止更新为重复的用户名', async () => {
|
|
await UserModel.create({
|
|
username: 'anotheruser',
|
|
email: 'another@example.com',
|
|
password: 'password123'
|
|
})
|
|
|
|
try {
|
|
await UserModel.update(testUser.id, { username: 'anotheruser' })
|
|
expect.fail('应该抛出错误')
|
|
} catch (error) {
|
|
expect(error.message).to.include('用户名已存在')
|
|
}
|
|
})
|
|
|
|
it('应该防止更新为重复的邮箱', async () => {
|
|
await UserModel.create({
|
|
username: 'anotheruser',
|
|
email: 'another@example.com',
|
|
password: 'password123'
|
|
})
|
|
|
|
try {
|
|
await UserModel.update(testUser.id, { email: 'another@example.com' })
|
|
expect.fail('应该抛出错误')
|
|
} catch (error) {
|
|
expect(error.message).to.include('邮箱已存在')
|
|
}
|
|
})
|
|
})
|
|
|
|
describe('User Status Management', () => {
|
|
let testUser
|
|
|
|
beforeEach(async () => {
|
|
testUser = await UserModel.create({
|
|
username: 'testuser',
|
|
email: 'test@example.com',
|
|
password: 'password123'
|
|
})
|
|
})
|
|
|
|
it('应该激活用户', async () => {
|
|
await UserModel.deactivate(testUser.id)
|
|
let user = await UserModel.findById(testUser.id)
|
|
expect(user.status).to.equal('inactive')
|
|
|
|
await UserModel.activate(testUser.id)
|
|
user = await UserModel.findById(testUser.id)
|
|
expect(user.status).to.equal('active')
|
|
})
|
|
|
|
it('应该停用用户', async () => {
|
|
await UserModel.deactivate(testUser.id)
|
|
const user = await UserModel.findById(testUser.id)
|
|
expect(user.status).to.equal('inactive')
|
|
})
|
|
})
|
|
|
|
describe('User Statistics', () => {
|
|
beforeEach(async () => {
|
|
await db('users').del()
|
|
|
|
await UserModel.create({
|
|
username: 'activeuser1',
|
|
email: 'active1@example.com',
|
|
password: 'password123',
|
|
status: 'active'
|
|
})
|
|
|
|
await UserModel.create({
|
|
username: 'activeuser2',
|
|
email: 'active2@example.com',
|
|
password: 'password123',
|
|
status: 'active'
|
|
})
|
|
|
|
await UserModel.create({
|
|
username: 'inactiveuser',
|
|
email: 'inactive@example.com',
|
|
password: 'password123',
|
|
status: 'inactive'
|
|
})
|
|
})
|
|
|
|
it('应该正确获取用户统计', async () => {
|
|
const stats = await UserModel.getUserStats()
|
|
expect(stats.total).to.equal(3)
|
|
expect(stats.active).to.equal(2)
|
|
expect(stats.inactive).to.equal(1)
|
|
})
|
|
})
|
|
})
|