From 73931eaf97b6a8f09a4ab1e1445cf9c133bcb4a1 Mon Sep 17 00:00:00 2001
From: diosmosis <benaka@piwik.pro>
Date: Sun, 21 Sep 2014 12:15:22 -0700
Subject: [PATCH] Allow .contains assertion to be used in screenshot tests as
 first assertion and allow .contains to be chained w/ .not property.

---
 .../screenshot-testing/support/chai-extras.js | 21 ++++++++++++-------
 .../support/page-renderer.js                  |  2 +-
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/tests/lib/screenshot-testing/support/chai-extras.js b/tests/lib/screenshot-testing/support/chai-extras.js
index 5c24340d1a..ec2d37296d 100644
--- a/tests/lib/screenshot-testing/support/chai-extras.js
+++ b/tests/lib/screenshot-testing/support/chai-extras.js
@@ -187,7 +187,8 @@ chai.Assertion.addChainableMethod('capture', function () {
 
 // add `contains` assertion
 chai.Assertion.addChainableMethod('contains', function () {
-    var url = this.__flags['object'],
+    var self = this,
+        url = this.__flags['object'],
         elementSelector = arguments[0],
         pageSetupFn = arguments[1],
         done = arguments[2];
@@ -205,21 +206,27 @@ chai.Assertion.addChainableMethod('contains', function () {
     }
 
     pageRenderer.capture(null, function (err) {
+        var obj = self._obj,
+            indent = "     ";
+
         if (err) {
-            var indent = "     ";
             err.stack = err.message + "\n" + indent + getPageLogsString(pageRenderer.pageLogs, indent);
 
             done(err);
             return;
         }
 
-        if (!pageRenderer.contains(elementSelector)) {
-            var error = new AssertionError("Page does not contain element '" + elementSelector + "'.");
-            error.stack = getPageLogsString(pageRenderer.pageLogs, indent);
+        try {
+            self.assert(
+                pageRenderer.contains(elementSelector),
+                "Expected page to contain element '" + elementSelector + "', but could not find it in page.",
+                "Expected page to not contain element '" + elementSelector + "', but found it in page."
+            );
 
-            done(error);
-        } else {
             done();
+        } catch (error) {
+            error.stack = getPageLogsString(pageRenderer.pageLogs, indent);
+            done(error);
         }
     });
 });
\ No newline at end of file
diff --git a/tests/lib/screenshot-testing/support/page-renderer.js b/tests/lib/screenshot-testing/support/page-renderer.js
index aa0fb12f87..de3819a4d3 100644
--- a/tests/lib/screenshot-testing/support/page-renderer.js
+++ b/tests/lib/screenshot-testing/support/page-renderer.js
@@ -38,7 +38,7 @@ PageRenderer.prototype.setViewportSize = function (w, h) {
 };
 
 PageRenderer.prototype.getCurrentUrl = function () {
-    return this.webpage.url;
+    return this.webpage ? this.webpage.url : null;
 };
 
 // event queueing functions
-- 
GitLab