@sketch-hq/sketch-assistant-utils
Version:
Utility functions and types for Sketch Assistants.
228 lines (227 loc) • 11.3 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const sketch_assistant_types_1 = require("@sketch-hq/sketch-assistant-types");
const sketch_file_1 = require("@sketch-hq/sketch-file");
const path_1 = require("path");
const __1 = require("..");
const get_image_metadata_1 = require("../../../get-image-metadata");
const process_1 = require("../../../process");
const test_helpers_1 = require("../../../test-helpers");
const testRunAssistant = (config, rule, ignoreConfig = { pages: [], assistants: {} }, ruleTimeout = Infinity) => __awaiter(void 0, void 0, void 0, function* () {
const op = { cancelled: false };
const file = yield sketch_file_1.fromFile(path_1.resolve(__dirname, './empty.sketch'));
const processedFile = yield process_1.process(file, op);
const assistant = test_helpers_1.createAssistantDefinition({ rules: rule ? [rule] : [], config });
const env = { locale: '', runtime: sketch_assistant_types_1.AssistantRuntime.Node };
return yield __1.runAssistant(processedFile, assistant, env, op, get_image_metadata_1.getImageMetadata, ignoreConfig, ruleTimeout);
});
describe('runAssistant', () => {
test('skips unconfigured rules', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig(), test_helpers_1.createRule());
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(0);
}));
test('can produce violations', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true },
},
}), test_helpers_1.createRule({
name: 'rule',
rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () {
ruleContext.utils.report('Something went wrong');
}),
}));
expect(violations).toHaveLength(1);
expect(ruleErrors).toHaveLength(0);
}));
test('skips rules that dont match the current platform', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true },
},
}), test_helpers_1.createRule({
name: 'rule',
runtime: sketch_assistant_types_1.AssistantRuntime.Sketch,
rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () {
ruleContext.utils.report('Something went wrong');
}),
}));
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(0);
}));
test('includes metadata in the result', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(3);
const { ruleErrors, metadata } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true },
},
}), test_helpers_1.createRule({ name: 'rule' }));
expect(metadata.assistant.name).toMatchInlineSnapshot(`"dummy-assistant"`);
expect(Object.keys(metadata.rules)).toMatchInlineSnapshot(`
Array [
"rule",
]
`);
expect(ruleErrors).toHaveLength(0);
}));
test('config values can be interpolated into rule metadata', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, metadata } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true, subspaceFrequency: 12 },
},
}), test_helpers_1.createRule({
name: 'rule',
title: (ruleConfig) => `Subspace frequency should be ${ruleConfig.subspaceFrequency}Hz`,
}));
expect(ruleErrors).toHaveLength(0);
expect(metadata.rules['rule'].title).toMatchInlineSnapshot(`"Subspace frequency should be 12Hz"`);
}));
test('configs can set a custom title', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, metadata } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true, ruleTitle: 'Warp speed should not exceed 9.9' },
},
}), test_helpers_1.createRule({
name: 'rule',
}));
expect(ruleErrors).toHaveLength(0);
expect(metadata.rules['rule'].title).toMatchInlineSnapshot(`"Warp speed should not exceed 9.9"`);
}));
test('skips inactive rules', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: false },
},
}), test_helpers_1.createRule({
name: 'rule',
rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () {
ruleContext.utils.report('Something went wrong');
}),
}));
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(0);
}));
test('skips full ignored rules', () => __awaiter(void 0, void 0, void 0, function* () {
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true },
},
}), test_helpers_1.createRule({
name: 'rule',
rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () {
ruleContext.utils.report('Something went wrong');
}),
}), { pages: [], assistants: { 'dummy-assistant': { rules: { rule: { allObjects: true } } } } });
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(0);
}));
test('object and rule combinations can be ignored', () => __awaiter(void 0, void 0, void 0, function* () {
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true },
},
}), test_helpers_1.createRule({
name: 'rule',
rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () {
for (const page of ruleContext.utils.objects.page) {
ruleContext.utils.report('Something went wrong', page);
}
}),
}), {
pages: [],
assistants: {
'dummy-assistant': {
rules: { rule: { objects: ['9AD22B94-A05B-4F49-8EDD-A38D62BD6181'] } },
},
},
});
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(0);
}));
test('isObjectIgnoredForRule works', () => __awaiter(void 0, void 0, void 0, function* () {
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({
rules: {
rule: { active: true },
},
}), test_helpers_1.createRule({
name: 'rule',
rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () {
const page = ruleContext.file.original.contents.document.pages[0];
if (!ruleContext.utils.isObjectIgnored(page)) {
ruleContext.utils.report('Something went wrong', page);
}
}),
}), {
pages: [],
assistants: {
'dummy-assistant': {
rules: { rule: { objects: ['9AD22B94-A05B-4F49-8EDD-A38D62BD6181'] } },
},
},
});
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(0);
}));
test('can produce rule errors', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.createRule({
name: 'rule',
rule: () => __awaiter(void 0, void 0, void 0, function* () {
throw new Error('Bang!');
}),
}));
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(1);
}));
test('can produce rule errors during iteration', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.createRule({
name: 'rule',
rule: (context) => __awaiter(void 0, void 0, void 0, function* () {
for (const page of context.utils.objects.page) {
throw Error(`Page ${page.name} looks wonky`);
}
}),
}));
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(1);
}));
test('can produce rule errors for bad config', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.createRule({
name: 'rule',
rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () {
ruleContext.utils.getOption('warpFieldIntegrity');
}),
}));
expect(violations).toHaveLength(0);
expect(ruleErrors).toHaveLength(1);
}));
test('can produce rule errors from rule timeouts', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const { ruleErrors, violations } = yield testRunAssistant(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.createRule({
name: 'rule',
rule: () => __awaiter(void 0, void 0, void 0, function* () {
yield new Promise((resolve) => setTimeout(resolve, 10));
}),
}), { pages: [], assistants: {} }, 0);
expect(violations).toHaveLength(0);
expect(ruleErrors[0]).toHaveProperty('code', 'timeout');
}));
});