import { PASSWORD, USERNAME, createProviders, createRandomString } from './config';
import { describe, expect, it } from 'vitest';

describe('test update', async () => {
  const { dataProvider, authProvider } = createProviders();

  it('should fail when not logged in', async () => {
    expect(dataProvider.update('entities/category', { id: 1, data: {}, previousData: {} })).rejects.toThrow(
      'iam.error.unauthorized'
    );
  });

  it('should fail with validation errors', async () => {
    await authProvider.login({ username: USERNAME, password: PASSWORD });
    const category = {
      description: { it: createRandomString(10) }
    };
    const createRequest = await dataProvider.create('entities/category', { data: category });
    expect(createRequest.data).toBeDefined();
    expect(createRequest.data?.id).toBeDefined();

    expect(
      dataProvider.update('entities/category', {
        id: createRequest.data?.id,
        data: {},
        previousData: {}
      })
    ).rejects.toThrow('error.validation');

    dataProvider
      .update('entities/category', { id: createRequest.data?.id, data: {}, previousData: {} })
      .catch((error: any) => {
        expect(error).toBeDefined();

        const body = error?.body;
        expect(body).toBeDefined();
        expect(body?.errors).toBeDefined();
        expect(body?.errors?.description).toBeDefined();
      });
  });

  it('should success with valid data', async () => {
    await authProvider.login({ username: USERNAME, password: PASSWORD });
    const category = {
      description: { it: createRandomString(10) }
    };
    const { data } = await dataProvider.create('entities/category', {
      data: category
    });
    expect(data).toBeDefined();
    expect(data?.id).toBeDefined();
    expect(data?.description?.it).toBe(category.description?.it);

    const updatedCategory = {
      ...data,
      description: { it: createRandomString(10) }
    };

    const { data: updated } = await dataProvider.update('entities/category', {
      id: data?.id,
      data: updatedCategory,
      previousData: data
    });

    expect(updated).toBeDefined();
    expect(updated?.id).toBeDefined();
    expect(updated?.description?.it).toBe(updatedCategory.description?.it);
  });
});
