konacha-chai-matchers 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f6b60b89f98ae533e719ffcab08c0b3e87b8799e
4
- data.tar.gz: 191e69e079fa781a2e451fae095d89336f88d26b
3
+ metadata.gz: 626fca41336d274fa07caf9b97b4b859e33ba5d8
4
+ data.tar.gz: 8465e7f3959300e06e6458cd9be4cd3b4d5f9610
5
5
  SHA512:
6
- metadata.gz: 5ecfef8e457cdbe3ee1fca5c66d222284f91c25ef913261f3c3f9931d1db9121b766f4009b77e042676b779824fee78163d2aae93596498e0668079ac2629a99
7
- data.tar.gz: 8de203d47ce991198b08732835a37176d46ee9ff713b98956186dfb4ee731d252fbb441ffe83710a442387c2d205e00d8b974fd5533f27ad5a6f826254fa78ad
6
+ metadata.gz: 6d89068bc4e0b130b9c1aeaae79e2d95015f66dc2223cf858b38cbafa113036b05a27f4d22b1b39cdae119eb2aab871cd7c1d26b552e3a5fedf35a1ff7ee1430
7
+ data.tar.gz: 09d37ab3972082b1e7c771ac49102084eb55e2075305d058d0bd54119fabe14e6c7cbf71e4e8c12752fbc4d7c976bde0f2f9cfd95acddb3ae2171add79476e17
data/.gitmodules CHANGED
@@ -61,3 +61,21 @@
61
61
  [submodule "chai-change"]
62
62
  path = chai-change
63
63
  url = https://github.com/timruffles/chai-change.git
64
+ [submodule "chai-colors"]
65
+ path = chai-colors
66
+ url = git@github.com:hurrymaplelad/chai-colors.git
67
+ [submodule "chai-shallow-deep-equal"]
68
+ path = chai-shallow-deep-equal
69
+ url = git@github.com:michelsalib/chai-shallow-deep-equal.git
70
+ [submodule "chai-subset"]
71
+ path = chai-subset
72
+ url = git@github.com:e-conomic/chai-subset.git
73
+ [submodule "chai-string"]
74
+ path = chai-string
75
+ url = git@github.com:onechiporenko/chai-string.git
76
+ [submodule "chai-param"]
77
+ path = chai-param
78
+ url = git@github.com:theblacksmith/chai-param.git
79
+ [submodule "chai-xml"]
80
+ path = chai-xml
81
+ url = git@github.com:krampstudio/chai-xml.git
data/README.md CHANGED
@@ -4,6 +4,7 @@ Konacha Chai Matchers
4
4
  [![Gem Version](https://fury-badge.herokuapp.com/rb/konacha-chai-matchers.png)](http://badge.fury.io/rb/konacha-chai-matchers)
5
5
 
6
6
  This library contains all [Chai.js plugins](http://chaijs.com/plugins)
7
+ that have browser support.
7
8
 
8
9
  Not all plugins are tested!
9
10
 
@@ -29,6 +30,11 @@ Example:
29
30
  #= require chai-backbone
30
31
  #= require chai-jquery
31
32
 
33
+ Included versions
34
+ -----------------
35
+
36
+ See `VERSIONS` for info
37
+
32
38
  Contribution
33
39
  ------------
34
40
 
data/VERSIONS CHANGED
@@ -1,7 +1,7 @@
1
1
  chai-spies: 0.5.1
2
- sinon-chai: 2.5.0
2
+ sinon-chai: 2.6.0
3
3
  chai-as-promised: 4.1.1
4
- chai-jquery: 1.2.3
4
+ chai-jquery: 2.0.0
5
5
  chai-timers: 0.2.0
6
6
  chai-stats: 0.3.0
7
7
  chai-null: 0.1.0
@@ -12,10 +12,16 @@ js-factories: 1.1.1
12
12
  mocha-as-promised: 2.0.0
13
13
  chai-things: 0.2.0
14
14
  chai-fuzzy: 1.4.0
15
- sinon: 1.10.3
15
+ sinon: 1.12.2
16
16
  memo-is: 0.0.2
17
- chai-jq: 0.0.7
17
+ chai-jq: 0.0.8
18
18
  chai-js-factories: 0.1.3
19
19
  chai-json-schema: 1.1.0
20
- chai-datetime: 1.3.0
20
+ chai-datetime: 1.3.1
21
21
  chai-change: 1.0.0
22
+ chai-colors: 1.0.0
23
+ chai-shallow-deep-equal: 1.0.0
24
+ chai-subset: 0.3.0
25
+ chai-string: 1.1.0
26
+ chai-param: 0.1.0
27
+ chai-xml: 0.2.0
@@ -1,7 +1,7 @@
1
1
  module Konacha
2
2
  module Chai
3
3
  module Matchers
4
- VERSION = "0.3.0"
4
+ VERSION = "1.0.0"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,16 @@
1
+ var color = require('onecolor');
2
+
3
+ module.exports = function (chai, utils) {
4
+ chai.Assertion.addMethod('colored', function (colorString) {
5
+ var expected = color(colorString),
6
+ actual = color(this._obj);
7
+
8
+ this.assert(
9
+ actual.equals(expected),
10
+ 'expected #{act} to be the same color as #{exp}',
11
+ 'expected #{act} to be a different color than #{exp}',
12
+ expected.hex(),
13
+ actual.hex()
14
+ );
15
+ });
16
+ };
@@ -37,12 +37,16 @@
37
37
  return actual.toDateString() === expected.toDateString();
38
38
  };
39
39
 
40
+ var dateWithoutTime = function(date) {
41
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
42
+ }
43
+
40
44
  chai.datetime.beforeDate = function(actual, expected) {
41
- return actual.getUTCFullYear() < expected.getUTCFullYear() || actual.getUTCMonth() < expected.getUTCMonth() || actual.getUTCDate() < expected.getUTCDate();
45
+ return chai.datetime.beforeTime(dateWithoutTime(actual), dateWithoutTime(expected));
42
46
  };
43
47
 
44
48
  chai.datetime.afterDate = function(actual, expected) {
45
- return actual.getUTCFullYear() > expected.getUTCFullYear() || actual.getUTCMonth() > expected.getUTCMonth() || actual.getUTCDate() > expected.getUTCDate();
49
+ return chai.datetime.afterTime(dateWithoutTime(actual), dateWithoutTime(expected));
46
50
  };
47
51
 
48
52
  chai.datetime.beforeTime = function(actual, expected) {
@@ -25,6 +25,11 @@
25
25
  * Give a more useful element name.
26
26
  */
27
27
  var _elName = function ($el) {
28
+ // Detect if completely empty.
29
+ if (!$el || $el.length === 0) {
30
+ return "<EMPTY OBJECT>";
31
+ }
32
+
28
33
  var name = "",
29
34
  id = $el.attr("id"),
30
35
  cls = $el.attr("class") || "";
@@ -128,7 +133,7 @@
128
133
  */
129
134
  var _containMethod = function (jqMeth, opts) {
130
135
  // Unpack options.
131
- opts || (opts = {});
136
+ opts = opts || /* istanbul ignore next */ {};
132
137
  opts.hasArg = !!opts.hasArg;
133
138
  opts.isProperty = !!opts.isProperty;
134
139
  opts.hasContains = !!opts.hasContains;
@@ -246,7 +251,9 @@
246
251
  * @api public
247
252
  */
248
253
  var $val = _jqAssert(function (exp) {
249
- var act = this._$el.val(),
254
+ // Manually check empty elements for `.val` call b/c ie9 can otherwise
255
+ // report `Unspecified error.` at least in Sauce Labs.
256
+ var act = this._$el && this._$el.length > 0 ? this._$el.val() : undefined,
250
257
  comp = _isRegExp(exp) ? _regExpMatch : _equals;
251
258
 
252
259
  this.assert(
@@ -327,8 +334,8 @@
327
334
  chai.Assertion.addMethod("$attr", $attr);
328
335
 
329
336
  /**
330
- * Asserts that the target has exactly the given named
331
- * data-attribute, or asserts the target contains a subset
337
+ * Asserts that the target has exactly the given named
338
+ * data-attribute, or asserts the target contains a subset
332
339
  * of the data-attribute when using the
333
340
  * `include` or `contain` modifiers.
334
341
  *
@@ -338,7 +345,7 @@
338
345
  * .to.contain.$data("foo", "bar");
339
346
  * ```
340
347
  *
341
- * Changes context to data-attribute string *value* when no
348
+ * Changes context to data-attribute string *value* when no
342
349
  * expected value is provided:
343
350
  *
344
351
  * ```js
@@ -486,6 +493,7 @@
486
493
  chai.Assertion.addMethod("$css", $css);
487
494
  }
488
495
 
496
+ /* istanbul ignore next */
489
497
  /*!
490
498
  * Wrap AMD, etc. using boilerplate.
491
499
  */
@@ -145,6 +145,15 @@
145
145
  );
146
146
  });
147
147
 
148
+ chai.Assertion.addMethod('descendants', function (selector) {
149
+ this.assert(
150
+ flag(this, 'object').has(selector).length > 0
151
+ , 'expected #{this} to have #{exp}'
152
+ , 'expected #{this} not to have #{exp}'
153
+ , selector
154
+ );
155
+ });
156
+
148
157
  $.each(['visible', 'hidden', 'selected', 'checked', 'enabled', 'disabled'], function (i, attr) {
149
158
  chai.Assertion.addProperty(attr, function () {
150
159
  this.assert(
@@ -182,27 +191,6 @@
182
191
  };
183
192
  });
184
193
 
185
- chai.Assertion.overwriteProperty('be', function (_super) {
186
- return function () {
187
- var obj = flag(this, 'object');
188
- if (obj instanceof $) {
189
- var be = function (selector) {
190
- this.assert(
191
- obj.is(selector)
192
- , 'expected #{this} to be #{exp}'
193
- , 'expected #{this} not to be #{exp}'
194
- , selector
195
- );
196
- };
197
- setPrototypeOf(be, this);
198
- return be;
199
- }
200
- else {
201
- _super.call(this);
202
- }
203
- }
204
- });
205
-
206
194
  chai.Assertion.overwriteMethod('match', function (_super) {
207
195
  return function (selector) {
208
196
  var obj = flag(this, 'object');
@@ -219,46 +207,25 @@
219
207
  }
220
208
  });
221
209
 
222
- chai.Assertion.overwriteProperty('contain', function (_super) {
223
- return function () {
224
- _super.call(this);
225
- var contain = function (text) {
210
+ chai.Assertion.overwriteChainableMethod('contain',
211
+ function (_super) {
212
+ return function (text) {
226
213
  var obj = flag(this, 'object');
227
214
  if (obj instanceof $) {
228
215
  this.assert(
229
216
  obj.is(':contains(\'' + text + '\')')
230
217
  , 'expected #{this} to contain #{exp}'
231
218
  , 'expected #{this} not to contain #{exp}'
232
- , text
233
- );
219
+ , text);
234
220
  } else {
235
- return Function.prototype.apply.call(_super.call(this), this, arguments);
221
+ _super.apply(this, arguments);
236
222
  }
237
- };
238
- setPrototypeOf(contain, this);
239
- return contain;
240
- }
241
- });
242
-
243
- chai.Assertion.overwriteProperty('have', function (_super) {
244
- return function () {
245
- var obj = flag(this, 'object');
246
- if (obj instanceof $) {
247
- var have = function (selector) {
248
- this.assert(
249
- // Using find() rather than has() to work around a jQuery bug:
250
- // http://bugs.jquery.com/ticket/11706
251
- obj.find(selector).length > 0
252
- , 'expected #{this} to have #{exp}'
253
- , 'expected #{this} not to have #{exp}'
254
- , selector
255
- );
256
- };
257
- setPrototypeOf(have, this);
258
- return have;
259
- } else {
260
- _super.call(this);
261
223
  }
224
+ },
225
+ function(_super) {
226
+ return function() {
227
+ _super.call(this);
228
+ };
262
229
  }
263
- });
230
+ );
264
231
  }));
@@ -0,0 +1,161 @@
1
+ /*!
2
+ * chai-param
3
+ * Copyright(c) 2014 The Blacksmith (a.k.a. Saulo Vallory) <jake@alogicalparadox.com>
4
+ * MIT Licensed
5
+ */
6
+
7
+ var path = require('path'),
8
+ chalk = require('chalk'),
9
+ stackTrace = require('stack-trace'),
10
+ chai = require('chai'),
11
+ utils = require('chai/lib/chai/utils');
12
+
13
+ var exports = module.exports = chaiParam;
14
+
15
+ chaiParam.config = require('./config');
16
+
17
+ // chalk wrapper for easy enabling and disabling colors
18
+ function c(color, text) {
19
+ if(chaiParam.config.disableColors)
20
+ return text;
21
+
22
+ return chalk[color](text);
23
+ }
24
+
25
+ function chaiParam(chai, utils) {
26
+
27
+ if(chaiParam._param)
28
+ // already initialized
29
+ return;
30
+
31
+ var flag = utils.flag
32
+ , objDisplay = utils.objDisplay;
33
+
34
+ chaiParam._param = function param(val, paramName, functionName, topic) {
35
+ var assertion = new chai.Assertion(val, functionName);
36
+
37
+ utils.flag(assertion, 'paramName', paramName);
38
+
39
+ if(functionName && functionName.trim && functionName.trim() != '')
40
+ utils.flag(assertion, 'functionName', functionName);
41
+
42
+ if(topic && topic.trim && topic.trim() != '')
43
+ utils.flag(assertion, 'message', topic);
44
+
45
+ return { should: assertion };
46
+ }
47
+
48
+ /**
49
+ * ### .param(paramName, functionName)
50
+ *
51
+ * The `param` chain allows you provide metadata about
52
+ * the parameter being validated.
53
+ *
54
+ * // examples
55
+ * expect(text).param('text', 'log').to.be.a('string');
56
+ * expect(user).param('user', 'register').to.have.length.below(16);
57
+ *
58
+ * @name param
59
+ * @param {String} paramName
60
+ * @param {String} functionName _optional_ Adding this allows chai-param to look for the caller
61
+ * @api public
62
+ */
63
+ utils.addMethod(chai.Assertion.prototype, 'param', function(paramName, functionName) {
64
+ utils.flag(this, 'paramName', paramName);
65
+
66
+ if(functionName && functionName.trim && functionName.trim() != '')
67
+ utils.flag(this, 'functionName', functionName);
68
+ });
69
+
70
+ if(chaiParam.config.improveMessages) {
71
+
72
+ // Overwriting getMessages
73
+ var oldGetMessage = utils.getMessage;
74
+ utils.getMessage = getMessage;
75
+
76
+ function getMessage (obj, args) {
77
+
78
+ if(!chaiParam.config.improveMessages)
79
+ {
80
+ return oldGetMessage(obj, args);
81
+ }
82
+
83
+ var negate = utils.flag(obj, 'negate')
84
+ , val = utils.flag(obj, 'object')
85
+ , expected = args[3]
86
+ , actual = utils.getActual(obj, args)
87
+ , msg = negate ? args[2] : args[1]
88
+ , flagMsg = utils.flag(obj, 'message')
89
+ , flagParam = utils.flag(obj, 'paramName')
90
+ , fnTarget = utils.flag(obj, 'functionName');
91
+
92
+ msg = msg || '';
93
+
94
+ var hasActToken = msg.indexOf('#{act}') >= 0;
95
+
96
+ msg = msg
97
+ .replace(/#{this}/g, flagParam ? 'parameter ' + c('yellow', flagParam) + ' ('+objDisplay(val)+')': objDisplay(val))
98
+ .replace(/#{act}/g, c('red', objDisplay(actual)))
99
+ .replace(/#{exp}/g, c('green', objDisplay(expected)))
100
+ .replace(/(not) to/, c('green', 'not') + ' to').replace(/to not/, 'to ' + c('green', 'not'))
101
+ .replace(/(length )?(below|at least|above|at most|within)(\s*)([0-9]*)/, c('green', '$1$2$3$4'))
102
+ .replace(/(include|truthy|falsy|true|false|undefined|match|satisfy|same members as)/, c('green', '$1'))
103
+ .replace(/(exist|empty|arguments|equal|deeply equal|instance of|be a superset)/, c('green', '$1'));
104
+
105
+ if(flagParam && !hasActToken)
106
+ msg += ' but got ' + c('red', objDisplay(val)) + ' instead';
107
+
108
+ var isNode = (typeof window == 'undefined');
109
+
110
+ if(chaiParam.config.showCaller && isNode && fnTarget) // show Caller
111
+ {
112
+ var trace = stackTrace.get();
113
+
114
+ var i = 0;
115
+
116
+ if(fnTarget) {
117
+ while(i < trace.length && trace[i].getFunctionName() != fnTarget) {
118
+ i++;
119
+ }
120
+
121
+ if(++i < trace.length) {
122
+ var file = trace[i].getFileName();
123
+ var filePath = path.dirname(file) + path.sep + c('blue', path.basename(file));
124
+
125
+ var spaces = flagMsg ? flagMsg.replace(/./g, ' ') : '';
126
+
127
+ msg += '\n' + spaces + ' - Called at: ' + filePath + ':' + c('blue', trace[i].getLineNumber());
128
+ }
129
+ }
130
+ }
131
+
132
+ return flagMsg ? flagMsg + ': ' + msg : msg;
133
+ };
134
+ }
135
+ }
136
+
137
+ /**
138
+ * ### param(value, name, function)
139
+ *
140
+ * The `param` method allows you to use the should syntax
141
+ * and still provide metadata about the parameter being validated.
142
+ *
143
+ * // examples
144
+ * param(text, 'text', 'log').should.be.a('string');
145
+ * param(user, 'user', 'register').should.have.length.below(16);
146
+ *
147
+ * @name param
148
+ * @param {Mixed} value
149
+ * @param {String} paramName
150
+ * @param {String} functionName _optional_ Adding this allows chai-param to look for the caller
151
+ * @param {String} topic _optional_ A prefix for the message
152
+ * @api public
153
+ */
154
+ chaiParam.param = function param(val, paramName, functionName, topic) {
155
+
156
+ if(!chaiParam._param) {
157
+ throw new Error("You need to add chai-param to chai through `chai.use()` method before using it")
158
+ }
159
+
160
+ return chaiParam._param(val, paramName, functionName, topic);
161
+ };