Skip to content

Commit

Permalink
Merge pull request #61 from mkslanc/acceptance-tests
Browse files Browse the repository at this point in the history
Acceptance tests
  • Loading branch information
mkslanc authored May 31, 2023
2 parents 2bedc56 + a272e21 commit 74a0325
Show file tree
Hide file tree
Showing 15 changed files with 1,456 additions and 267 deletions.
1,238 changes: 1,232 additions & 6 deletions package-lock.json

Large diffs are not rendered by default.

7 changes: 0 additions & 7 deletions packages/ace-linters/.mocharc.yaml

This file was deleted.

7 changes: 7 additions & 0 deletions packages/ace-linters/mocha.ui.config.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions packages/ace-linters/mocha.unit.config.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 9 additions & 2 deletions packages/ace-linters/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@
"build:dependencies": "npm run build:yaml-language-server && npm run build:eslint-linter-bundle",
"build": "npm run clean && npm run build:dependencies && webpack --mode=production",
"build-dev": "npm run clean && npm run build:dependencies && webpack --mode=development",
"test": "mocha --timeout 5000 --exit",

"build-test": "npm run build:dependencies && webpack --name=test",
"start-test-server": "npm run build-test && http-server --cors='*' tests/ui/dist",
"test:unit": "mocha --config mocha.unit.config.js",
"test:ui": "mocha --config mocha.ui.config.js",
"test": "npm run test:unit && npm run test:ui",
"test:coverage": "nyc npm run test",
"start-server": "http-server build --cors=\"*\""
},
Expand Down Expand Up @@ -37,7 +42,9 @@
"chai": "^4.3.7",
"mocha": "^10.2.0",
"nyc": "^15.1.0",
"ts-node": "^10.9.1"
"ts-node": "^10.9.1",
"puppeteer": "^19.9.1",
"http-server": "^14.1.1"
},
"main": "build/ace-linters.js",
"types": "types/index.d.ts",
Expand Down
105 changes: 105 additions & 0 deletions packages/ace-linters/tests/ui/dist/test.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example with using fetch and inline worker </title>

</head>
<body>
<div id='example' style="height: 300px"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.16.0/ace.js"
></script>
<script>
ace.require("ace/ext/language_tools");

let editor = ace.edit("example", {
theme: "ace/theme/textmate",
mode: "ace/mode/typescript",
value: "console.log('Hello world' ;"
});
// enable autocompletion and snippets
editor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: true,
enableLiveAutocompletion: true
});


async function fetchScript(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Error fetching script: ${response.statusText}`);
}
const scriptContent = await response.text();
return scriptContent;
}

function createScriptBlob(scriptContent) {
const scriptBlob = new Blob([scriptContent], { type: 'application/javascript' });
return scriptBlob;
}

function createBlobURL(scriptBlob) {
const blobURL = URL.createObjectURL(scriptBlob);
return blobURL;
}

async function importScriptFromNetwork(url) {
const text= await fetchScript(url);

// Create a Blob with the text content and MIME type "text/javascript".
const blob = createScriptBlob(text);

// Create an object URL from the Blob.
return createBlobURL(blob);
}

async function importJavaScriptFile(url) {
const text= await fetchScript(url);

// Create a Blob with the text content and MIME type "text/javascript".
const blob = createScriptBlob(text);

// Create an object URL from the Blob.
const objectURL = createBlobURL(blob);

// Create a new script element and set its src attribute to the object URL.
const scriptElement = document.createElement("script");
scriptElement.src = objectURL;

// Add a listener to revoke the object URL when the script has loaded.
scriptElement.addEventListener("load", () => {
URL.revokeObjectURL(objectURL);
});

// Append the script element to the document to execute the JavaScript code.
document.body.appendChild(scriptElement);
}

const baseLink = "http://127.0.0.1:8080/build";

importJavaScriptFile( baseLink + "/ace-linters.js").then(async () => {
let workerString = `
!function () {
importScripts("${await importScriptFromNetwork(baseLink + "/service-manager.js")}");
let manager = new ServiceManager(self);
manager.registerService("typescript", {
module: () => {
importScripts("${await importScriptFromNetwork(baseLink + "/typescript-service.js")}");
return {TypescriptService};
},
className: "TypescriptService",
modes: "typescript|tsx|javascript",
});}()`;
let worker = new Worker(createBlobURL(createScriptBlob(workerString)));
let provider = LanguageProvider.create(worker);
provider.registerEditor(editor);
});


</script>


</body>
</html>
37 changes: 37 additions & 0 deletions packages/ace-linters/tests/ui/general-ui.tests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import {expect} from "chai";
import * as puppeteer from 'puppeteer';

const opts = {
headless: true,
slowMo: 0,
devtools: false
};

describe("General ui tests", function () {
let browser: puppeteer.Browser;
let page: puppeteer.Page;
let errors = [];

before(async function () {
this.timeout(10000);
browser = await puppeteer.launch(opts);
page = (await browser.pages())[0];
page.on("console", function(err) {
if (err.type() == "error" && err.location().url != "http://localhost:8080/favicon.ico")
errors.push(err.text());
}).on('pageerror', ({message}) => errors.push(message));
await page.goto("http://localhost:8080/test.html", {
timeout: 10000,
waitUntil: 'domcontentloaded',
});
});

it('should not have errors', async function () {
await page.waitForSelector("#example");
expect(errors.length).to.eql(0);
})

after(async function () {
await browser.close();
});
});
Original file line number Diff line number Diff line change
@@ -1,29 +1,12 @@
import {expect} from "chai";
import {Range as AceRange} from "ace-code/src/range";
import {
CompletionItemKind,
} from "vscode-languageserver-protocol";
import {CommonConverter} from "../type-converters/common-converters";
import {Editor} from "ace-code/src/editor";
import {MockRenderer} from "ace-code/src/test/mockrenderer";
import {CommonConverter} from "../../type-converters/common-converters";

describe('General Converters', () => {
let editor = new Editor(new MockRenderer());
const Range = editor.getSelectionRange().constructor;

describe('normalizeRanges', () => {
it('should correctly normalize the ranges of an array of completions', () => {
const completions = [
{value: 'value1', range: {start: {row: 0, column: 0}, end: {row: 1, column: 0}}},
{value: 'value2', range: {start: {row: 2, column: 0}, end: {row: 3, column: 0}}}
];
const expected = [
{value: 'value1', range: Range.fromPoints({row: 0, column: 0}, {row: 1, column: 0})},
{value: 'value2', range: Range.fromPoints({row: 2, column: 0}, {row: 3, column: 0})}
];
expect(CommonConverter.normalizeRanges(completions, editor)).to.deep.equal(expected);
});
});

describe('General Converters', () => {
describe('cleanHtml', () => {
it('should clean the HTML string by replacing <a> tags', () => {
const html = "<a href='www.example.com'>link</a>";
Expand All @@ -35,13 +18,13 @@ describe('General Converters', () => {
describe('toRange', () => {
it('should correctly convert a range object to an Ace range', () => {
const range = {start: {row: 0, column: 0}, end: {row: 1, column: 0}};
const expected = Range.fromPoints({row: 0, column: 0}, {row: 1, column: 0});
expect(CommonConverter.toRange(range, Range)).to.deep.equal(expected);
const expected = AceRange.fromPoints({row: 0, column: 0}, {row: 1, column: 0});
expect(CommonConverter.toRange(range, AceRange)).to.deep.equal(expected);
});

it('should return undefined if the range object is missing start or end properties', () => {
const range = {start: {row: 0, column: 0}};
expect(CommonConverter.toRange(range as any, Range)).to.undefined;
expect(CommonConverter.toRange(range as any, AceRange)).to.undefined;
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import "ace-code/src/test/mockdom";
//@ts-ignore
window["self"] = {};

import {LanguageProvider} from "../language-provider";
import {LanguageProvider} from "../../language-provider";
import {Mode as JSONMode} from "ace-code/src/mode/json";
import {Mode as HtmlMode} from "ace-code/src/mode/html";
import {assert, expect} from "chai";
import {MockWorker} from "./mock-worker";
import {ServiceManager} from "../services/service-manager";
import {ServiceManager} from "../../services/service-manager";
import {Done} from "mocha";
import Completion = Ace.Completion;

Expand Down Expand Up @@ -64,7 +64,7 @@ describe('LanguageProvider tests', () => {
manager = new ServiceManager(ctx);
manager.registerService("html", {
features: {completion: true, completionResolve: true, diagnostics: true, format: true, hover: true},
module: () => import("../services/html/html-service"),
module: () => import("../../services/html/html-service"),
className: "HtmlService",
modes: "html"
});
Expand Down Expand Up @@ -161,7 +161,7 @@ describe('LanguageProvider tests', () => {

manager.registerService("json", {
features: {completion: true, completionResolve: true, diagnostics: true, format: true, hover: true},
module: () => import("../services/json/json-service"),
module: () => import("../../services/json/json-service"),
className: "JsonService",
modes: "json"
});
Expand Down
Loading

0 comments on commit 74a0325

Please sign in to comment.