assert.js.map 17.6 KB
{"version":3,"sources":["assert.js"],"names":[],"mappings":"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","file":"assert.js","sourcesContent":["// Browser assertions convenience.\n\nconst assert        = require('assert');\nconst { isRegExp }  = require('util');\nconst URL           = require('url');\nconst Utils         = require('jsdom/lib/jsdom/utils');\n\n\n// Used to assert that actual matches expected value, where expected may be a function or a string.\nfunction assertMatch(actual, expected, message) {\n  if (isRegExp(expected))\n    assert(expected.test(actual), message || `Expected \"${actual}\" to match \"${expected}\"`);\n  else if (typeof expected === 'function')\n    assert(expected(actual), message);\n  else\n    assert.deepEqual(actual, expected, message);\n}\n\n\nmodule.exports = class Assert {\n\n  constructor(browser) {\n    this.browser = browser;\n  }\n\n\n  // -- Location/response --\n\n  // Asserts that a cookie with the given name has the expected value.\n  //\n  // identifier - Cookie name or name/domain/path (see getCookie)\n  // expected   - Expected value (null to test cookie is not set)\n  // message    - Assert message if cookie does not have expected value\n  cookie(identifier, expected = null, message = null) {\n    const actual = this.browser.getCookie(identifier);\n    assertMatch(actual, expected,\n                message || `Expected cookie ${JSON.stringify(identifier)} to have the value \"${expected}\", found \"${actual}\"`);\n  }\n\n  // Asserts that browser was redirected when retrieving the current page.\n  redirected(message) {\n    assert(this.browser.redirected, message);\n  }\n\n  // Assert that the last page load returned the expected status code.\n  status(code, message) {\n    assert.equal(this.browser.status, code, message);\n  }\n\n  // Assert that the last page load returned status code 200.\n  success(message) {\n    assert(this.browser.success, message);\n  }\n\n  // Asserts that current page has the expected URL.\n  //\n  // Expected value can be a String, RegExp, Function or an object, in which case\n  // object properties are tested against the actual URL (e.g. pathname, host,\n  // query).\n  url(expected, message) {\n    if (typeof expected === 'string') {\n      const absolute = Utils.resolveHref(this.browser.location.href, expected);\n      assertMatch(this.browser.location.href, absolute, message);\n    } else if (isRegExp(expected) || typeof expected === 'function')\n      assertMatch(this.browser.location.href, expected, message);\n    else {\n      const url = URL.parse(this.browser.location.href, true);\n      for (let key in expected) {\n        let value = expected[key];\n        // Gracefully handle default values, e.g. document.location.hash for\n        // \"/foo\" is \"\" not null, not undefined.\n        let defaultValue = (key === 'port') ? 80 : null;\n        assertMatch(url[key] || defaultValue, value || defaultValue, message);\n      }\n    }\n  }\n\n\n  // -- Document contents --\n\n  // Assert the named attribute of the selected element(s) has the expected value.\n  attribute(selector, name, expected = null, message = null) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, `Expected selector \"${selector}\" to return one or more elements`);\n    for (let element of elements) {\n      let actual = element.getAttribute(name);\n      assertMatch(actual, expected, message);\n    }\n  }\n\n  // Assert that element matching selector exists.\n  element(selector, message) {\n    this.elements(selector, { exactly: 1 }, message);\n  }\n\n  // Assert how many elements matching selector exist.\n  //\n  // Count can be an exact number, or an object with the properties:\n  // atLeast - Expect to find at least that many elements\n  // atMost  - Expect to find at most that many elements\n  // exactly - Expect to find exactly that many elements\n  //\n  // If count is unspecified, defaults to at least one.\n  elements(selector, count, message) {\n    const elements = this.browser.queryAll(selector);\n    if (arguments.length === 1)\n      this.elements(selector, { atLeast: 1});\n    else if (Number.isInteger(count))\n      this.elements(selector, { exactly: count }, message);\n    else {\n      if (Number.isInteger(count.exactly))\n        assert.equal(elements.length, count.exactly,\n                     message || `Expected ${count.exactly} elements matching \"${selector}\", found ${elements.length}`);\n      if (Number.isInteger(count.atLeast))\n        assert(elements.length >= count.atLeast,\n               message || `Expected at least ${count.atLeast} elements matching \"${selector}\", found only ${elements.length}`);\n      if (Number.isInteger(count.atMost))\n        assert(elements.length <= count.atMost,\n               message || `Expected at most ${count.atMost} elements matching \"${selector}\", found ${elements.length}`);\n    }\n  }\n\n  // Asserts the selected element(s) has the expected CSS class.\n  hasClass(selector, expected, message) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, `Expected selector \"${selector}\" to return one or more elements`);\n    for (let element of elements) {\n      let classNames = element.className.split(/\\s+/);\n      assert(~classNames.indexOf(expected),\n             message || `Expected element \"${selector}\" to have class \"${expected}\", found \"${classNames.join(', ')}\"`);\n    }\n  }\n\n  // Asserts the selected element(s) doest not have the expected CSS class.\n  hasNoClass(selector, expected, message) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, `Expected selector \"${selector}\" to return one or more elements`);\n    for (let element of elements) {\n      let classNames = element.className.split(/\\s+/);\n      assert(classNames.indexOf(expected) === -1,\n             message || `Expected element \"${selector}\" to not have class \"${expected}\", found \"${classNames.join(', ')}\"`);\n    }\n  }\n\n  // Asserts the selected element(s) has the expected class names.\n  className(selector, expected, message) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, `Expected selector \"${selector}\" to return one or more elements`);\n    const array    = expected.split(/\\s+/).sort().join(' ');\n    for (let element of elements) {\n      let actual = element.className.split(/\\s+/).sort().join(' ');\n      assertMatch(actual, array,\n                  message || `Expected element \"${selector}\" to have class \"${expected}\", found \"${actual}\"`);\n    }\n  }\n\n  // Asserts the selected element(s) has the expected value for the named style\n  // property.\n  style(selector, style, expected = null, message = null) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, `Expected selector \"${selector}\" to return one or more elements`);\n    for (let element of elements) {\n      let actual = element.style.getPropertyValue(style);\n      assertMatch(actual, expected,\n                  message || `Expected element \"${selector}\" to have style ${style} value of \"${expected}\", found \"${actual}\"`);\n    }\n  }\n\n  // Asserts that selected input field (text field, text area, etc) has the expected value.\n  input(selector, expected = null, message = null) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, `Expected selector \"${selector}\" to return one or more elements`);\n    for (let element of elements)\n      assertMatch(element.value, expected, message);\n  }\n\n  // Asserts that a link exists with the given text and URL.\n  link(selector, text, url, message) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, message || `Expected selector \"${selector}\" to return one or more elements`);\n    const matchingText = elements.filter(element => element.textContent.trim() === text);\n    if (isRegExp(url)) {\n      const matchedRegexp = matchingText.filter(element => url.test(element.href));\n      assert(matchedRegexp.length, message || `Expected at least one link matching the given text and URL`);\n    } else {\n      const absolute    = Utils.resolveHref(this.browser.location.href, url);\n      const matchedURL  = matchingText.filter(element => element.href === absolute);\n      assert(matchedURL.length, message || `Expected at least one link matching the given text and URL`);\n    }\n  }\n\n\n  // Assert that text content of selected element(s) matches expected string.\n  //\n  // You can also call this with a regular expression, or a function.\n  text(selector, expected, message) {\n    const elements = this.browser.queryAll(selector);\n    assert(elements.length, `Expected selector \"${selector}\" to return one or more elements`);\n    const actual = elements\n      .map(elem => elem.textContent)\n      .join('')\n      .trim()\n      .replace(/\\s+/g, ' ');\n    assertMatch(actual, expected || '', message);\n  }\n\n\n  // -- Window --\n\n  // Asserts that selected element has the focus.\n  hasFocus(selector, message) {\n    if (selector) {\n      const elements = this.browser.queryAll(selector);\n      assert.equal(elements.length, 1,\n                   message || `Expected selector \"${selector}\" to return one element`);\n      assert.equal(this.browser.activeElement, elements[0],\n                   message || `Expected element \"${selector}\" to have the focus'`);\n    } else\n      assert.equal(this.browser.activeElement, this.browser.body,\n                   message || 'Expected no element to have focus');\n  }\n\n\n  // -- JavaScript --\n\n  // Evaluates Javascript expression and asserts value.  With one argument,\n  // asserts that the expression evaluates to (JS) true.\n  evaluate(expression, expected, message) {\n    const actual = this.browser.evaluate(expression);\n    if (arguments.length === 1)\n      assert(actual);\n    else\n      assertMatch(actual, expected, message);\n  }\n\n  // Asserts that the global (window) property name has the expected value.\n  global(name, expected, message) {\n    const actual = this.browser.window[name];\n    if (arguments.length === 1)\n      assert(actual);\n    else\n      assertMatch(actual, expected,\n                  message || `Expected global ${name} to have the value \"${expected}\", found \"${actual}\"`);\n  }\n\n};\n\n"]}