@expressen/tallahassee
Advanced tools
Comparing version 0.3.0 to 0.4.0
52
index.js
"use strict"; | ||
const supertest = require("supertest"); | ||
const url = require("url"); | ||
const {Document, Fetch, Window, Compiler} = require("./lib"); | ||
@@ -12,3 +13,3 @@ const {compile} = Compiler; | ||
navigateTo, | ||
load | ||
load, | ||
}; | ||
@@ -28,2 +29,4 @@ | ||
function load(resp) { | ||
let pending; | ||
compile(); | ||
@@ -39,10 +42,55 @@ | ||
document, | ||
$: document.$ | ||
$: document.$, | ||
}; | ||
Object.defineProperty(browserContext, "_pending", { | ||
get: () => pending | ||
}); | ||
global.window = window; | ||
global.document = document; | ||
document.addEventListener("submit", onDocumentSubmit); | ||
return browserContext; | ||
function onDocumentSubmit(event) { | ||
if (event.target.tagName === "FORM") { | ||
pending = new Promise((resolve) => { | ||
process.nextTick(navigate, resolve); | ||
}); | ||
} | ||
function navigate(resolve) { | ||
if (event.defaultPrevented) return resolve(); | ||
const form = event.target; | ||
const qs = getFormInputAsQs(form); | ||
const p = url.parse(form.getAttribute("action"), true); | ||
Object.assign(p.query, qs); | ||
const navigation = navigateTo(url.format(p), { | ||
cookie: document.cookie | ||
}); | ||
resolve(navigation); | ||
} | ||
} | ||
} | ||
} | ||
function getFormInputAsQs(form) { | ||
const inputs = form.getElementsByTagName("input"); | ||
return inputs.reduce((acc, input) => { | ||
if (input.name && input.value) { | ||
if (input.type === "radio") { | ||
if (input.checked) { | ||
acc[input.name] = input.value; | ||
} | ||
} else { | ||
acc[input.name] = input.value; | ||
} | ||
} | ||
return acc; | ||
}, {}); | ||
} |
@@ -14,3 +14,3 @@ "use strict"; | ||
const location = getLocation(resp.request); | ||
let cookieHeader = getHeaders(resp).cookie || ""; | ||
let cookieHeader = getHeaders(resp.request).cookie || ""; | ||
const setCookies = {}; | ||
@@ -20,4 +20,11 @@ | ||
const loaded = []; | ||
const document = Object.assign(new EventEmitter(), { | ||
const emitter = new EventEmitter(); | ||
const document = { | ||
_getElement: getElement, | ||
_emitter: emitter, | ||
addEventListener, | ||
createElement, | ||
dispatchEvent, | ||
getElementById, | ||
@@ -27,7 +34,9 @@ getElementsByTagName, | ||
location, | ||
removeEventListener, | ||
textContent: null, | ||
$, | ||
_getElement: getElement, | ||
}); | ||
}; | ||
preloadForms(); | ||
Object.defineProperty(document, "head", { | ||
@@ -41,2 +50,6 @@ get: getHead | ||
Object.defineProperty(document, "documentElement", { | ||
get: () => getElement($("html")) | ||
}); | ||
Object.defineProperty(document, "firstElementChild", { | ||
@@ -79,2 +92,3 @@ get: () => getElement($("html")) | ||
if ($elm === $) return document; | ||
if (!$elm.length) return; | ||
@@ -87,2 +101,3 @@ let mockElement = loaded.find((mockedElm) => mockedElm.$elm[0] === $elm[0]); | ||
mockElement = Element(document, $elm); | ||
loaded.push(mockElement); | ||
@@ -112,2 +127,25 @@ return mockElement; | ||
function preloadForms() { | ||
const forms = getElementsByTagName("form"); | ||
for (let i = 0; i < forms.length; i++) { | ||
forms[i].addEventListener("submit", onFormSubmit); | ||
} | ||
} | ||
function addEventListener(...args) { | ||
emitter.on(...args); | ||
} | ||
function removeEventListener(...args) { | ||
emitter.removeListener(...args); | ||
} | ||
function dispatchEvent(...args) { | ||
emitter.emit(...args); | ||
} | ||
function onFormSubmit(event) { | ||
emitter.emit("submit", event); | ||
} | ||
function parseSetCookie(cookie) { | ||
@@ -114,0 +152,0 @@ const setCookiePattern = /^(\w+)=(.*?)(;(.*?))?$/g; |
@@ -23,2 +23,3 @@ "use strict"; | ||
_listenEvents: listenEvents, | ||
_setBoundingClientRect: setBoundingClientRect, | ||
addEventListener, | ||
@@ -35,2 +36,3 @@ appendChild, | ||
insertAdjacentHTML, | ||
remove, | ||
removeAttribute, | ||
@@ -41,3 +43,2 @@ removeChild, | ||
setAttribute, | ||
setBoundingClientRect, | ||
style: getStyle(), | ||
@@ -118,3 +119,3 @@ }; | ||
return Url.format(Object.assign({}, location, {path: rel})); | ||
return Url.format(Object.assign({}, location, {pathname: rel, path: rel})); | ||
}, | ||
@@ -147,3 +148,3 @@ set: (value) => { | ||
if (value === undefined) { | ||
if (tagName !== "input") return value; | ||
if (!["input", "button"].includes(tagName)) return; | ||
} | ||
@@ -158,2 +159,10 @@ return value === "disabled"; | ||
Object.defineProperty(element, "form", { | ||
get: () => _getElement($elm.closest("form")) | ||
}); | ||
if (tagName === "form") { | ||
element.submit = submit; | ||
} | ||
return element; | ||
@@ -217,6 +226,8 @@ | ||
function click() { | ||
emitter.emit("click", { | ||
preventDefault: () => {}, | ||
stopPropagation: () => {} | ||
}); | ||
const clickEvent = emptyEvent(); | ||
emitter.emit("click", clickEvent); | ||
if (!clickEvent.defaultPrevented && element.form) { | ||
if (element.type === "submit") element.form.submit(); | ||
} | ||
} | ||
@@ -240,2 +251,6 @@ | ||
function remove() { | ||
$elm.remove(); | ||
} | ||
function find(selector) { | ||
@@ -316,5 +331,11 @@ return $elm.find(selector); | ||
function submit() { | ||
const submitEvent = emptyEvent(); | ||
emitter.emit("submit", submitEvent); | ||
} | ||
function emptyEvent() { | ||
let defaultPrevented; | ||
const event = { | ||
target: element, | ||
preventDefault, | ||
@@ -321,0 +342,0 @@ stopPropagation: () => {} |
@@ -24,3 +24,3 @@ "use strict"; | ||
const {top} = elm.getBoundingClientRect(); | ||
elm.setBoundingClientRect(top + diff); | ||
elm._setBoundingClientRect(top + diff); | ||
} | ||
@@ -27,0 +27,0 @@ |
@@ -10,3 +10,3 @@ "use strict"; | ||
const {cookie} = getHeaders(resp); | ||
const {cookie} = getHeaders(resp.request); | ||
@@ -13,0 +13,0 @@ fetching._pendingRequests = stack; |
"use strict"; | ||
module.exports = function getHeaders(resp) { | ||
if (!resp || !resp.request || !resp.request.header) return {}; | ||
module.exports = function getHeaders(request) { | ||
if (!request || !request.header) return {}; | ||
const reqHeader = resp.request.header; | ||
const reqHeader = request.header; | ||
@@ -8,0 +8,0 @@ const headers = {}; |
"use strict"; | ||
const getHeaders = require("./getHeaders"); | ||
const Url = require("url"); | ||
@@ -8,12 +9,18 @@ | ||
const {header, url} = request; | ||
const {host, Host} = header; | ||
const {host, proto} = getHeaders(request); | ||
const {url} = request; | ||
let location = Url.parse(url); | ||
if (host || Host) { | ||
location.host = host || Host; | ||
if (host) { | ||
location.port = undefined; | ||
location.host = undefined; | ||
location.hostname = host; | ||
location = Url.parse(Url.format(location)); | ||
} | ||
if (proto) { | ||
location.protocol = `${proto}:`; | ||
location = Url.parse(Url.format(location)); | ||
} | ||
return location; | ||
}; |
{ | ||
"name": "@expressen/tallahassee", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"description": "Expressen client testing framework", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
29606
828
1