// Copyright (C) 2020-2022 Intel Corporation
// Copyright (C) 2022 CVAT.ai Corporation
//
// SPDX-License-Identifier: MIT
// Setup mock for a server
jest.mock('../../src/server-proxy', () => {
return {
__esModule: true,
default: require('../mocks/server-proxy.mock'),
};
});
// Initialize api
window.cvat = require('../../src/api');
const { Task } = require('../../src/session');
// Test cases
describe('Feature: get a list of tasks', () => {
test('get all tasks', async () => {
const result = await window.cvat.tasks.get();
expect(Array.isArray(result)).toBeTruthy();
expect(result).toHaveLength(7);
for (const el of result) {
expect(el).toBeInstanceOf(Task);
}
});
test('get a task by an id', async () => {
const result = await window.cvat.tasks.get({
id: 3,
});
expect(Array.isArray(result)).toBeTruthy();
expect(result).toHaveLength(1);
expect(result[0]).toBeInstanceOf(Task);
expect(result[0].id).toBe(3);
});
test('get a task with skeletons by an id', async () => {
const result = await window.cvat.tasks.get({
id: 40,
});
expect(Array.isArray(result)).toBeTruthy();
expect(result).toHaveLength(1);
expect(result[0]).toBeInstanceOf(Task);
expect(result[0].id).toBe(40);
expect(result[0].labels).toBeInstanceOf(Array);
for (const label of result[0].labels) {
expect(label).toBeInstanceOf(window.cvat.classes.Label);
if (label.type === 'skeleton') {
expect(label.hasParent).toBe(false);
expect(label.structure.sublabels).toBeInstanceOf(Array);
expect(typeof label.structure.svg).toBe('string');
expect(label.structure.svg.length).not.toBe(0);
for (const sublabel of label.structure.sublabels) {
expect(sublabel).toBeInstanceOf(window.cvat.classes.Label);
expect(sublabel.hasParent).toBe(true);
}
}
}
});
test('get a task by an unknown id', async () => {
const result = await window.cvat.tasks.get({
id: 50,
});
expect(Array.isArray(result)).toBeTruthy();
expect(result).toHaveLength(0);
});
test('get a task by an invalid id', async () => {
expect(
window.cvat.tasks.get({
id: '50',
}),
).rejects.toThrow(window.cvat.exceptions.ArgumentError);
});
test('get tasks by filters', async () => {
const result = await window.cvat.tasks.get({
filter: '{"and":[{"==":[{"var":"filter"},"interpolation"]}]}',
});
expect(result).toBeInstanceOf(Array);
});
test('get tasks by invalid query', async () => {
expect(
window.cvat.tasks.get({
unknown: '5',
}),
).rejects.toThrow(window.cvat.exceptions.ArgumentError);
});
});
describe('Feature: save a task', () => {
test('save some changed fields in a task', async () => {
let result = await window.cvat.tasks.get({
id: 2,
});
result[0].bugTracker = 'newBugTracker';
result[0].name = 'New Task Name';
result[0].projectId = 6;
result[0].save();
result = await window.cvat.tasks.get({
id: 2,
});
expect(result[0].bugTracker).toBe('newBugTracker');
expect(result[0].name).toBe('New Task Name');
expect(result[0].projectId).toBe(6);
});
test('save some new labels in a task', async () => {
let result = await window.cvat.tasks.get({
id: 2,
});
const labelsLength = result[0].labels.length;
const newLabel = new window.cvat.classes.Label({
name: 'My boss\'s car',
attributes: [
{
default_value: 'false',
input_type: 'checkbox',
mutable: true,
name: 'parked',
values: ['false'],
},
],
});
result[0].labels = [...result[0].labels, newLabel];
result[0].save();
result = await window.cvat.tasks.get({
id: 2,
});
expect(result[0].labels).toHaveLength(labelsLength + 1);
const appendedLabel = result[0].labels.filter((el) => el.name === 'My boss\'s car');
expect(appendedLabel).toHaveLength(1);
expect(appendedLabel[0].attributes).toHaveLength(1);
expect(appendedLabel[0].attributes[0].name).toBe('parked');
expect(appendedLabel[0].attributes[0].defaultValue).toBe('false');
expect(appendedLabel[0].attributes[0].mutable).toBe(true);
expect(appendedLabel[0].attributes[0].inputType).toBe('checkbox');
});
test('save new task without an id', async () => {
const task = new window.cvat.classes.Task({
name: 'New Task',
labels: [
{
name: 'My boss\'s car',
attributes: [
{
default_value: 'false',
input_type: 'checkbox',
mutable: true,
name: 'parked',
values: ['false'],
},
],
},
],
bug_tracker: 'bug tracker value',
image_quality: 50,
});
const result = await task.save();
expect(typeof result.id).toBe('number');
});
test('save new task in project', async () => {
const task = new window.cvat.classes.Task({
name: 'New Task',
project_id: 2,
bug_tracker: 'bug tracker value',
image_quality: 50,
});
const result = await task.save();
expect(result.projectId).toBe(2);
});
test('create a new task with skeletons', async () => {
const svgSpec = `
`;
const task = new window.cvat.classes.Task({
name: 'task with skeletons',
labels: [{
name: 'star skeleton',
type: 'skeleton',
attributes: [],
svg: svgSpec,
sublabels: [{
name: '1',
type: 'points',
attributes: []
}, {
name: '2',
type: 'points',
attributes: []
}, {
name: '3',
type: 'points',
attributes: []
}, {
name: '4',
type: 'points',
attributes: []
}, {
name: '5',
type: 'points',
attributes: []
}]
}],
project_id: null,
});
const result = await task.save();
expect(typeof result.id).toBe('number');
});
});
describe('Feature: delete a task', () => {
test('delete a task', async () => {
let result = await window.cvat.tasks.get({
id: 3,
});
await result[0].delete();
result = await window.cvat.tasks.get({
id: 3,
});
expect(Array.isArray(result)).toBeTruthy();
expect(result).toHaveLength(0);
});
});
describe('Feature: delete a label', () => {
test('delete a label', async () => {
let result = await window.cvat.tasks.get({
id: 100,
});
const labelsLength = result[0].labels.length;
const deletedLabels = result[0].labels.filter((el) => el.name !== 'person');
result[0].labels = deletedLabels;
result[0].save();
result = await window.cvat.tasks.get({
id: 100,
});
expect(result[0].labels).toHaveLength(labelsLength - 1);
});
});