diff --git a/package.json b/package.json
index e7bee5930..be41133c7 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
"mocha": "^5.2.0"
},
"scripts": {
- "test": "mocha -R spec src",
+ "test": "mocha -R spec ./test",
"lint": "eslint src",
"lint:fix": "eslint src --fix"
}
diff --git a/src/wappalyzer.js b/src/wappalyzer.js
index a50ddb913..7a2c3e368 100644
--- a/src/wappalyzer.js
+++ b/src/wappalyzer.js
@@ -370,7 +370,7 @@ class Wappalyzer {
attrs.string = attr;
try {
- attrs.regex = new RegExp(attr.replace('/', '\\/'), 'i'); // Escape slashes in regular expression
+ attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression
} catch (error) {
attrs.regex = new RegExp();
diff --git a/test/analyze.spec.js b/test/analyze.spec.js
new file mode 100644
index 000000000..99cf6a516
--- /dev/null
+++ b/test/analyze.spec.js
@@ -0,0 +1,144 @@
+/* eslint-env mocha */
+
+'use strict';
+
+const assert = require('chai').assert;
+const Wappalyzer = require('../src/wappalyzer');
+
+describe('should analyze website elements properly', function () {
+
+ it('should analyze html', async () => {
+ const html = `
+
+
+
+ Page title | Html detection
+
+
+
+ Technologies Test Page | Html detection
+
+
+
+
+
+ `;
+ const wappalyzer = new Wappalyzer();
+ wappalyzer.apps = {
+ "Google Tag Manager": {
+ "html": [
+ "googletagmanager\\.com/ns\\.html[^>]+>",
+ ""
+ ]
+ }
+ };
+ var applications = null;
+ wappalyzer.driver = {
+ log () {},
+ displayApps (detectedMap) {
+ applications = detectedMap;
+ }
+ };
+
+ await wappalyzer.analyze({ canonical: 'example.com' }, { html });
+ assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager');
+ });
+
+ it('should analyze scripts', async () => {
+ const scripts = [
+ 'http://www.google-analytics.com/analytics.js',
+ 'http://example.com/assets/js/jquery.min.js'
+ ];
+ const wappalyzer = new Wappalyzer();
+ wappalyzer.apps = {
+ "Google Analytics": {
+ "cats": [
+ 10
+ ],
+ "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:"
+ },
+ "jQuery": {
+ "script": [
+ "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1",
+ "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1",
+ "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1"
+ ]
+ }
+ };
+ var applications = null;
+ wappalyzer.driver = {
+ log () {},
+ displayApps (detectedMap) {
+ applications = detectedMap;
+ }
+ };
+
+ await wappalyzer.analyze({ canonical: 'example.com' }, { scripts });
+ assert.equal(applications['Google Analytics'].name, 'Google Analytics');
+ assert.equal(applications['jQuery'].name, 'jQuery');
+ });
+
+ it('should analyze headers', async () => {
+ const headers = {
+ 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ],
+ 'connection': [ 'keep-alive' ],
+ 'x-powered-by': [ 'Express'],
+ 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ],
+ 'content-length': [ '293' ],
+ 'content-type': [ 'text/html; charset=utf-8' ]
+ };
+ const wappalyzer = new Wappalyzer();
+ wappalyzer.apps = {
+ "Express": {
+ "headers": {
+ "X-Powered-By": "^Express$"
+ }
+ }
+ };
+ var applications = null;
+ wappalyzer.driver = {
+ log () {},
+ displayApps (detectedMap) {
+ applications = detectedMap;
+ }
+ };
+
+ await wappalyzer.analyze({ canonical: 'example.com' }, { headers });
+ assert.equal(applications['Express'].name, 'Express');
+ });
+
+ it('should analyze js globals', async () => {
+ const js = {
+ 'Moment.js': { 'moment': { '0': true } },
+ 'Google Font API': { 'WebFonts': { '0': true } }
+ };
+ const wappalyzer = new Wappalyzer();
+ wappalyzer.apps = {
+ "Moment.js": {
+ "js": {
+ "moment": "",
+ "moment.version": "(.*)\\;version:\\1"
+ }
+ },
+ "Google Font API": {
+ "js": {
+ "WebFonts": ""
+ }
+ }
+ };
+ var applications = null;
+ wappalyzer.driver = {
+ log () {},
+ displayApps (detectedMap) {
+ applications = detectedMap;
+ }
+ };
+
+ wappalyzer.parseJsPatterns();
+ await wappalyzer.analyze({ canonical: 'example.com' }, { js });
+
+ assert.equal(applications['Google Font API'].name, 'Google Font API');
+ assert.equal(applications['Moment.js'].name, 'Moment.js');
+ });
+});
diff --git a/src/wappalyzer.spec.js b/test/wappalyzer.spec.js
similarity index 100%
rename from src/wappalyzer.spec.js
rename to test/wappalyzer.spec.js