185 lines
5.9 KiB
JavaScript
185 lines
5.9 KiB
JavaScript
const { Project, User, Area } = require('../../../models');
|
|
|
|
describe('Project Model', () => {
|
|
let user, area;
|
|
|
|
beforeEach(async () => {
|
|
const bcrypt = require('bcrypt');
|
|
user = await User.create({
|
|
email: 'test@example.com',
|
|
password_digest: await bcrypt.hash('password123', 10),
|
|
});
|
|
|
|
area = await Area.create({
|
|
name: 'Work',
|
|
user_id: user.id,
|
|
});
|
|
});
|
|
|
|
describe('validation', () => {
|
|
it('should create a project with valid data', async () => {
|
|
const projectData = {
|
|
name: 'Test Project',
|
|
description: 'Test Description',
|
|
active: true,
|
|
pin_to_sidebar: false,
|
|
priority: 1,
|
|
user_id: user.id,
|
|
area_id: area.id,
|
|
};
|
|
|
|
const project = await Project.create(projectData);
|
|
|
|
expect(project.name).toBe(projectData.name);
|
|
expect(project.description).toBe(projectData.description);
|
|
expect(project.active).toBe(projectData.active);
|
|
expect(project.pin_to_sidebar).toBe(projectData.pin_to_sidebar);
|
|
expect(project.priority).toBe(projectData.priority);
|
|
expect(project.user_id).toBe(user.id);
|
|
expect(project.area_id).toBe(area.id);
|
|
});
|
|
|
|
it('should require name', async () => {
|
|
const projectData = {
|
|
description: 'Project without name',
|
|
user_id: user.id,
|
|
};
|
|
|
|
await expect(Project.create(projectData)).rejects.toThrow();
|
|
});
|
|
|
|
it('should require user_id', async () => {
|
|
const projectData = {
|
|
name: 'Test Project',
|
|
};
|
|
|
|
await expect(Project.create(projectData)).rejects.toThrow();
|
|
});
|
|
|
|
it('should validate priority range', async () => {
|
|
const projectData = {
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
priority: 5,
|
|
};
|
|
|
|
await expect(Project.create(projectData)).rejects.toThrow();
|
|
});
|
|
|
|
it('should allow valid priority values', async () => {
|
|
for (let priority of [0, 1, 2]) {
|
|
const project = await Project.create({
|
|
name: `Test Project ${priority}`,
|
|
user_id: user.id,
|
|
priority: priority,
|
|
});
|
|
expect(project.priority).toBe(priority);
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('default values', () => {
|
|
it('should set correct default values', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
});
|
|
|
|
expect(project.active).toBe(true);
|
|
expect(project.pin_to_sidebar).toBe(false);
|
|
expect(project.task_show_completed).toBe(false);
|
|
expect(project.task_sort_order).toBe('created_at:desc');
|
|
});
|
|
});
|
|
|
|
describe('optional fields', () => {
|
|
it('should allow optional fields to be null', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
description: null,
|
|
priority: null,
|
|
due_date_at: null,
|
|
area_id: null,
|
|
});
|
|
|
|
expect(project.description).toBeNull();
|
|
expect(project.priority).toBeNull();
|
|
expect(project.due_date_at).toBeNull();
|
|
expect(project.area_id).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('task sorting columns', () => {
|
|
it('should create project with task_show_completed set to true', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
task_show_completed: true,
|
|
});
|
|
|
|
expect(project.task_show_completed).toBe(true);
|
|
});
|
|
|
|
it('should create project with custom task_sort_order', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
task_sort_order: 'priority:asc',
|
|
});
|
|
|
|
expect(project.task_sort_order).toBe('priority:asc');
|
|
});
|
|
|
|
it('should allow task_show_completed to be null', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
task_show_completed: null,
|
|
});
|
|
|
|
expect(project.task_show_completed).toBeNull();
|
|
});
|
|
|
|
it('should allow task_sort_order to be null', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
task_sort_order: null,
|
|
});
|
|
|
|
expect(project.task_sort_order).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('associations', () => {
|
|
it('should belong to a user', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
});
|
|
|
|
const projectWithUser = await Project.findByPk(project.id, {
|
|
include: [{ model: User }],
|
|
});
|
|
|
|
expect(projectWithUser.User).toBeDefined();
|
|
expect(projectWithUser.User.id).toBe(user.id);
|
|
});
|
|
|
|
it('should belong to an area', async () => {
|
|
const project = await Project.create({
|
|
name: 'Test Project',
|
|
user_id: user.id,
|
|
area_id: area.id,
|
|
});
|
|
|
|
const projectWithArea = await Project.findByPk(project.id, {
|
|
include: [{ model: Area }],
|
|
});
|
|
|
|
expect(projectWithArea.Area).toBeDefined();
|
|
expect(projectWithArea.Area.id).toBe(area.id);
|
|
});
|
|
});
|
|
});
|