import * as Lib from "../main/Utils";
import Reporter from "../main/Reporter";
import Signature from "../main/Signature";
const makeNode = (node_map, elmt) => {
return {
"0": {
"name": elmt,
},
"attr": (attr_id) => {
return node_map[attr_id];
},
"children": () => {
return {
"each": () => {},
};
},
} as unknown as Cheerio;
};
test("all signature", () => {
const node1 = {
"data-title": "Test Title",
"data-hide": "false",
"class": "l-test-main some-optional?"
};
const rep = new Reporter();
const new_sig = Signature.createFromCheerioNode("test", "l-test-main", makeNode(node1, "div"));
expect(new_sig.getId()).toBe("l-test-main");
expect(new_sig.getTitle()).toBe("Test Title");
expect(new_sig.getType()).toBe("l");
expect(new_sig.toString()).toBe("[l-test-main] Test Title");
expect(new_sig.getRootNode().toString()).toBe("
");
new_sig.validate(rep);
expect(rep.count()).toEqual(1);
expect(rep.get(0, "WARN")).toEqual(
{ level: "warn", msg: "l-test-main/0: class name is not valid: some-optional" },
);
rep.reset();
new_sig.testMarkup(makeNode({ // successful - optional class not present
"class": "l-test-main"
}, "div"), rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
new_sig.testMarkup(makeNode({ // successful - optional class present
"class": "l-test-main some-optional"
}, "div"), rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
new_sig.testMarkup(makeNode({ // failure - wrong class
"class": "blah"
}, "div"), rep);
expect(rep.count(">DEBUG")).toEqual(2);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "l-test-main/0: class not allowed: blah", },
);
expect(rep.get(1, "ERROR")).toEqual(
{ level: "error", msg: "l-test-main/0: required class(es) not present: l-test-main", },
);
rep.reset();
new_sig.testMarkup(makeNode({ // failure - no class
}, "div"), rep);
expect(rep.count(">DEBUG")).toEqual(1);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "l-test-main/0: required class(es) not present: l-test-main", },
);
rep.reset();
new_sig.testMarkup(makeNode({ // failure - optional class only
"class": "some-optional"
}, "div"), rep);
expect(rep.count(">DEBUG")).toEqual(1);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "l-test-main/0: required class(es) not present: l-test-main", },
);
rep.reset();
new_sig.testMarkup(makeNode({ // failure - unrecognized class
"class": "l-test-main blah"
}, "div"), rep);
expect(rep.count(">DEBUG")).toEqual(1);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "l-test-main/0: class not allowed: blah", },
);
rep.reset();
new_sig.validateSCSS(".l-test-main { border: 1px solid blue; }", rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
new_sig.validateSCSS(".l-blah { border: 1px solid blue; }", rep);
expect(rep.count(">DEBUG")).toEqual(1);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "unrecognized class for signature: l-blah", },
);
rep.reset();
new_sig.validateSCSS(".some-optional { text-decoration: underline; }", rep);
expect(rep.count(">DEBUG")).toEqual(1);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "invalid CSS declaration for layout: text-decoration", },
);
});
test("deep signature", () => {
const div = Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/scss/demo/l-demo-main.ejs")));
const sig = Signature.createFromCheerioNode("demo", "l-demo-main", div);
expect(sig.getId()).toBe("l-demo-main");
expect(sig.getTitle()).toBe("Main Demo Layout");
expect(sig.getType()).toBe("l");
expect(sig.toString()).toBe("[l-demo-main] Main Demo Layout");
expect(sig.getRootNode().toString()).toBe(
"");
const node1 = {
"data-title": "Test Title",
"data-hide": "false",
"class": "l-test-main some-optional? some-pat*"
};
expect(sig.includeElement(makeNode(node1, "div" ))).toBe(true);
expect(sig.includeElement(makeNode(node1, "span"))).toBe(false);
});
test("class patterns", () => {
let div = Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/scss/demo/w-demo-pattern.ejs")));
let sig = Signature.createFromCheerioNode("demo", "w-demo-pattern", div);
const rep = new Reporter();
sig.validate(rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_1.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_2.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_3.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(2);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "w-demo-pattern/0.0: class not allowed: fb-bobbins", },
);
expect(rep.get(1, "ERROR")).toEqual(
{ level: "error", msg: "w-demo-pattern/0.0: required class(es) not present: fa-*" },
);
// two classes in the markup that match the same pattern
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_4.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(0);
// pattern class is optional
div = Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/scss/demo/w-demo-pattern-2.ejs")));
sig = Signature.createFromCheerioNode("demo", "w-demo-pattern", div);
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_1.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_2.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(0);
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_3.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(1);
expect(rep.get(0, "ERROR")).toEqual(
{ level: "error", msg: "w-demo-pattern/0.0: class not allowed: fb-bobbins", },
);
rep.reset();
sig.testMarkup(Lib.getRootElement(Lib.getCheerio(Lib.loadFile("src/__tests__/examples/class_pattern_4.html"))), rep);
expect(rep.count(">DEBUG")).toEqual(0);
});