Skip to content

Commit fb3f23d

Browse files
committed
Add unit tests and configuration for Gantt, Map, and Timeline components
1 parent 3a1a8d2 commit fb3f23d

File tree

9 files changed

+264
-0
lines changed

9 files changed

+264
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import React from 'react';
2+
import { render, screen, waitFor } from '@testing-library/react';
3+
import { describe, it, expect, vi } from 'vitest';
4+
import { ObjectGantt } from './ObjectGantt';
5+
import { DataSource } from '@object-ui/types';
6+
7+
// Mock GanttView to avoid complex rendering in tests
8+
vi.mock('./GanttView', () => ({
9+
GanttView: ({ tasks }: any) => (
10+
<div data-testid="gantt-view">
11+
{tasks.map((t: any) => (
12+
<div key={t.id} data-testid="gantt-task">{t.title}</div>
13+
))}
14+
</div>
15+
),
16+
}));
17+
18+
const mockData = [
19+
{ id: '1', name: 'Task 1', start_date: '2024-01-01', end_date: '2024-01-05', progress: 50 },
20+
{ id: '2', name: 'Task 2', start_date: '2024-01-06', end_date: '2024-01-10', progress: 0 },
21+
];
22+
23+
const mockDataSource: DataSource = {
24+
find: vi.fn(),
25+
findOne: vi.fn(),
26+
create: vi.fn(),
27+
update: vi.fn(),
28+
delete: vi.fn(),
29+
getObjectSchema: vi.fn().mockResolvedValue({
30+
fields: {
31+
name: { type: 'text' },
32+
start_date: { type: 'date' },
33+
end_date: { type: 'date' }
34+
}
35+
}),
36+
};
37+
38+
describe('ObjectGantt', () => {
39+
it('renders with static value provider', async () => {
40+
const schema: any = {
41+
type: 'gantt',
42+
gantt: {
43+
titleField: 'name',
44+
startDateField: 'start_date',
45+
endDateField: 'end_date',
46+
},
47+
data: {
48+
provider: 'value',
49+
items: mockData,
50+
},
51+
};
52+
53+
render(<ObjectGantt schema={schema} />);
54+
55+
// Check loading first if needed, or wait for tasks
56+
await waitFor(() => {
57+
expect(screen.getByTestId('gantt-view')).toBeDefined();
58+
});
59+
60+
expect(screen.getAllByTestId('gantt-task')).toHaveLength(2);
61+
expect(screen.getByText('Task 1')).toBeDefined();
62+
});
63+
64+
it('renders with object provider', async () => {
65+
(mockDataSource.find as any).mockResolvedValue({ data: mockData });
66+
67+
const schema: any = {
68+
type: 'gantt',
69+
gantt: {
70+
titleField: 'name',
71+
startDateField: 'start_date',
72+
endDateField: 'end_date',
73+
},
74+
data: {
75+
provider: 'object',
76+
object: 'tasks',
77+
},
78+
};
79+
80+
render(<ObjectGantt schema={schema} dataSource={mockDataSource} />);
81+
82+
await waitFor(() => {
83+
expect(mockDataSource.find).toHaveBeenCalledWith('tasks', expect.any(Object));
84+
});
85+
86+
expect(screen.getAllByTestId('gantt-task')).toHaveLength(2);
87+
});
88+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// <reference types="vitest" />
2+
import { defineConfig } from 'vite';
3+
import react from '@vitejs/plugin-react';
4+
import path from 'path';
5+
6+
export default defineConfig({
7+
plugins: [react()],
8+
test: {
9+
environment: 'happy-dom',
10+
globals: true,
11+
setupFiles: ['./vitest.setup.ts'],
12+
},
13+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import '@testing-library/jest-dom';
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React from 'react';
2+
import { render, screen, waitFor } from '@testing-library/react';
3+
import { describe, it, expect, vi } from 'vitest';
4+
import { ObjectMap } from './ObjectMap';
5+
import { DataSource } from '@object-ui/types';
6+
7+
const mockData = [
8+
{ id: '1', name: 'Loc 1', latitude: 40, longitude: -74 },
9+
{ id: '2', name: 'Loc 2', latitude: 41, longitude: -75 },
10+
];
11+
12+
const mockDataSource: DataSource = {
13+
find: vi.fn(),
14+
findOne: vi.fn(),
15+
create: vi.fn(),
16+
update: vi.fn(),
17+
delete: vi.fn(),
18+
getObjectSchema: vi.fn(),
19+
};
20+
21+
describe('ObjectMap', () => {
22+
it('renders with static value provider', async () => {
23+
const schema: any = {
24+
type: 'map',
25+
map: {
26+
latitudeField: 'latitude',
27+
longitudeField: 'longitude',
28+
titleField: 'name'
29+
},
30+
data: {
31+
provider: 'value',
32+
items: mockData
33+
}
34+
};
35+
36+
render(<ObjectMap schema={schema} />);
37+
await waitFor(() => {
38+
expect(screen.getByText(/Locations \(2\)/)).toBeDefined();
39+
});
40+
expect(screen.getByText('Loc 1')).toBeDefined();
41+
});
42+
43+
it('fetches data with object provider', async () => {
44+
(mockDataSource.find as any).mockResolvedValue({ data: mockData });
45+
46+
const schema: any = {
47+
type: 'map',
48+
map: {
49+
latitudeField: 'latitude',
50+
longitudeField: 'longitude',
51+
titleField: 'name'
52+
},
53+
data: {
54+
provider: 'object',
55+
object: 'locations'
56+
}
57+
};
58+
59+
render(<ObjectMap schema={schema} dataSource={mockDataSource} />);
60+
61+
await waitFor(() => {
62+
expect(mockDataSource.find).toHaveBeenCalled();
63+
});
64+
65+
expect(screen.getByText(/Locations \(2\)/)).toBeDefined();
66+
});
67+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// <reference types="vitest" />
2+
import { defineConfig } from 'vite';
3+
import react from '@vitejs/plugin-react';
4+
import path from 'path';
5+
6+
export default defineConfig({
7+
plugins: [react()],
8+
test: {
9+
environment: 'happy-dom',
10+
globals: true,
11+
setupFiles: ['./vitest.setup.ts'],
12+
},
13+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import '@testing-library/jest-dom';
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React from 'react';
2+
import { render, screen, waitFor } from '@testing-library/react';
3+
import { describe, it, expect, vi } from 'vitest';
4+
import { ObjectTimeline } from './ObjectTimeline';
5+
import { DataSource } from '@object-ui/types';
6+
7+
// Mock useDataScope
8+
vi.mock('@object-ui/react', () => ({
9+
useDataScope: () => undefined,
10+
}));
11+
12+
vi.mock('./renderer', () => ({
13+
TimelineRenderer: ({ schema }: any) => (
14+
<div data-testid="timeline-view">
15+
{schema.items?.map((t: any, idx: number) => (
16+
<div key={idx} data-testid="timeline-item">{t.title}</div>
17+
))}
18+
</div>
19+
),
20+
}));
21+
22+
const mockData = [
23+
{ id: '1', name: 'Event 1', date: '2024-01-01', description: 'Desc 1' },
24+
];
25+
26+
const mockDataSource: DataSource = {
27+
find: vi.fn(),
28+
findOne: vi.fn(),
29+
create: vi.fn(),
30+
update: vi.fn(),
31+
delete: vi.fn(),
32+
getObjectSchema: vi.fn(),
33+
};
34+
35+
describe('ObjectTimeline', () => {
36+
it('renders with static items', async () => {
37+
const schema: any = {
38+
type: 'timeline',
39+
items: [
40+
{ title: 'Static Event', date: '2024-01-01' }
41+
]
42+
};
43+
render(<ObjectTimeline schema={schema} />);
44+
await waitFor(() => {
45+
expect(screen.getByText('Static Event')).toBeDefined();
46+
});
47+
});
48+
49+
it('fetches data when objectName is provided', async () => {
50+
(mockDataSource.find as any).mockResolvedValue({ value: mockData });
51+
52+
const schema: any = {
53+
type: 'timeline',
54+
objectName: 'events',
55+
titleField: 'name',
56+
dateField: 'date' // Mapping needs to be correct in logic
57+
};
58+
59+
render(<ObjectTimeline schema={schema} dataSource={mockDataSource} />);
60+
61+
await waitFor(() => {
62+
expect(mockDataSource.find).toHaveBeenCalled();
63+
});
64+
65+
expect(screen.getByText('Event 1')).toBeDefined();
66+
});
67+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// <reference types="vitest" />
2+
import { defineConfig } from 'vite';
3+
import react from '@vitejs/plugin-react';
4+
import path from 'path';
5+
6+
export default defineConfig({
7+
plugins: [react()],
8+
test: {
9+
environment: 'happy-dom',
10+
globals: true,
11+
setupFiles: ['./vitest.setup.ts'],
12+
},
13+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import '@testing-library/jest-dom';

0 commit comments

Comments
 (0)