const { InboxItem, User } = require('../../../models');

describe('InboxItem Model', () => {
    let user;

    beforeEach(async () => {
        const bcrypt = require('bcrypt');
        user = await User.create({
            email: 'test@example.com',
            password_digest: await bcrypt.hash('password123', 10),
        });
    });

    describe('validation', () => {
        it('should create an inbox item with valid data', async () => {
            const inboxData = {
                content: 'Remember to buy groceries',
                status: 'added',
                source: 'web',
                user_id: user.id,
            };

            const inboxItem = await InboxItem.create(inboxData);

            expect(inboxItem.content).toBe(inboxData.content);
            expect(inboxItem.status).toBe(inboxData.status);
            expect(inboxItem.source).toBe(inboxData.source);
            expect(inboxItem.user_id).toBe(user.id);
        });

        it('should require content', async () => {
            const inboxData = {
                user_id: user.id,
            };

            await expect(InboxItem.create(inboxData)).rejects.toThrow();
        });

        it('should require user_id', async () => {
            const inboxData = {
                content: 'Test content',
            };

            await expect(InboxItem.create(inboxData)).rejects.toThrow();
        });

        it('should require status', async () => {
            const inboxData = {
                content: 'Test content',
                user_id: user.id,
                status: null,
            };

            await expect(InboxItem.create(inboxData)).rejects.toThrow();
        });

        it('should require source', async () => {
            const inboxData = {
                content: 'Test content',
                user_id: user.id,
                source: null,
            };

            await expect(InboxItem.create(inboxData)).rejects.toThrow();
        });
    });

    describe('default values', () => {
        it('should set correct default values', async () => {
            const inboxItem = await InboxItem.create({
                content: 'Test content',
                source: 'test',
                user_id: user.id,
            });

            expect(inboxItem.status).toBe('added');
        });
    });

    describe('associations', () => {
        it('should belong to a user', async () => {
            const inboxItem = await InboxItem.create({
                content: 'Test content',
                source: 'test',
                user_id: user.id,
            });

            const inboxItemWithUser = await InboxItem.findByPk(inboxItem.id, {
                include: [{ model: User }],
            });

            expect(inboxItemWithUser.User).toBeDefined();
            expect(inboxItemWithUser.User.id).toBe(user.id);
            expect(inboxItemWithUser.User.email).toBe(user.email);
        });
    });
});
