diff --git a/Gemfile b/Gemfile index 937d1bdbb..5d55ecc6f 100644 --- a/Gemfile +++ b/Gemfile @@ -51,7 +51,6 @@ end group :test, :development do gem 'jasmine' - gem 'jasmine-phantom' gem 'sqlite3' gem 'rspec-rails' gem 'awesome_print' diff --git a/Gemfile.lock b/Gemfile.lock index 4891d0e9f..918ad4a96 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -54,8 +54,6 @@ GEM capybara-screenshot (0.3.14) capybara (>= 1.0, < 3) launchy - childprocess (0.3.9) - ffi (~> 1.0, >= 1.0.11) chunky_png (1.2.8) cliver (0.3.2) coderay (1.0.9) @@ -80,7 +78,7 @@ GEM orm_adapter (~> 0.1) railties (>= 3.2.6, < 5) warden (~> 1.2.3) - diff-lcs (1.2.4) + diff-lcs (1.2.5) eco (1.0.0) coffee-script eco-source @@ -100,7 +98,7 @@ GEM i18n (~> 0.5) faraday (0.8.8) multipart-post (~> 1.2.0) - ffi (1.9.0) + ffi (1.9.3) font-awesome-rails (3.2.1.3) railties (>= 3.2, < 5.0) formatador (0.2.4) @@ -131,15 +129,12 @@ GEM httpauth (0.2.0) i18n (0.6.5) icalendar (1.5.0) - jasmine (1.3.2) - jasmine-core (~> 1.3.1) - rack (~> 1.0) - rspec (>= 1.3.1) - selenium-webdriver (>= 0.1.3) - jasmine-core (1.3.1) - jasmine-phantom (0.0.9) - jasmine (>= 1.2.0) - posix-spawn + jasmine (2.0.0) + jasmine-core (~> 2.0.0) + phantomjs + rack (>= 1.2.1) + rake + jasmine-core (2.0.0) journey (1.0.4) jquery-datatables-rails (1.11.2) jquery-rails @@ -164,7 +159,7 @@ GEM method_source (0.8.2) mime-types (1.25.1) mini_portile (0.5.2) - multi_json (1.8.2) + multi_json (1.8.4) multipart-post (1.2.0) nested_form (0.3.2) nokogiri (1.6.0) @@ -186,13 +181,13 @@ GEM omniauth (~> 1.0) orm_adapter (0.4.0) pg (0.17.0) + phantomjs (1.9.2.1) poltergeist (1.5.0) capybara (~> 2.1) cliver (~> 0.3.1) multi_json (~> 1.0) websocket-driver (>= 0.2.0) polyglot (0.3.3) - posix-spawn (0.3.6) pry (0.9.12.2) coderay (~> 1.0.5) method_source (~> 0.8) @@ -241,10 +236,10 @@ GEM rspec-core (~> 2.14.0) rspec-expectations (~> 2.14.0) rspec-mocks (~> 2.14.0) - rspec-core (2.14.5) - rspec-expectations (2.14.2) + rspec-core (2.14.7) + rspec-expectations (2.14.4) diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.14.3) + rspec-mocks (2.14.4) rspec-rails (2.14.0) actionpack (>= 3.0) activesupport (>= 3.0) @@ -252,7 +247,6 @@ GEM rspec-core (~> 2.14.0) rspec-expectations (~> 2.14.0) rspec-mocks (~> 2.14.0) - rubyzip (0.9.9) safe_yaml (0.9.7) sanitize (2.0.6) nokogiri (>= 1.4.4) @@ -266,11 +260,6 @@ GEM select2-rails (3.4.9) sass-rails thor (~> 0.14) - selenium-webdriver (2.35.1) - childprocess (>= 0.2.5) - multi_json (~> 1.0) - rubyzip (< 1.0.0) - websocket (~> 1.0.4) sentry-raven (0.6.0) faraday (>= 0.7.6) hashie (>= 1.1.0) @@ -313,7 +302,6 @@ GEM webmock (1.13.0) addressable (>= 2.2.7) crack (>= 0.3.2) - websocket (1.0.7) websocket-driver (0.3.1) xpath (2.0.0) nokogiri (~> 1.3) @@ -342,7 +330,6 @@ DEPENDENCIES heroku_san icalendar jasmine - jasmine-phantom jquery-datatables-rails jquery-rails jquery-ui-rails diff --git a/spec/javascripts/vendor/jasmine-jquery.js b/spec/javascripts/vendor/jasmine-jquery.js index d73b412be..7b2a1b2cb 100644 --- a/spec/javascripts/vendor/jasmine-jquery.js +++ b/spec/javascripts/vendor/jasmine-jquery.js @@ -1,11 +1,11 @@ /*! Jasmine-jQuery: a set of jQuery helpers for Jasmine tests. - Version 1.5.91 + Version 2.0.2 https://github.com/velesin/jasmine-jquery - Copyright (c) 2010-2013 Wojciech Zawistowski, Travis Jeffery + Copyright (c) 2010-2014 Wojciech Zawistowski, Travis Jeffery Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -27,7 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -+function (jasmine, $) { "use strict"; ++function (window, jasmine, $) { "use strict"; jasmine.spiedEventsKey = function (selector, eventName) { return [$(selector).selector, eventName].toString() @@ -71,7 +71,7 @@ jasmine.Fixtures.prototype.read = function () { var htmlChunks = [] - , fixtureUrls = arguments + , fixtureUrls = arguments for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) { htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex])) @@ -95,8 +95,8 @@ jasmine.Fixtures.prototype.createContainer_ = function (html) { var container = $('
') - .attr('id', this.containerId) - .html(html) + .attr('id', this.containerId) + .html(html) $(document.body).append(container) return container @@ -104,7 +104,8 @@ jasmine.Fixtures.prototype.addToContainer_ = function (html){ var container = $(document.body).find('#'+this.containerId).append(html) - if(!container.length){ + + if (!container.length) { this.createContainer_(html) } } @@ -118,18 +119,37 @@ jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function (relativeUrl) { var self = this - , url = this.makeFixtureUrl_(relativeUrl) - , request = $.ajax({ + , url = this.makeFixtureUrl_(relativeUrl) + , htmlText = '' + , request = $.ajax({ + async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded + cache: false, + url: url, + success: function (data, status, $xhr) { + htmlText = $xhr.responseText + } + }).fail(function () { + throw new Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')') + }) + + var scripts = $($.parseHTML(htmlText, true)).find('script[src]') || []; + + scripts.each(function(){ + $.ajax({ async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded cache: false, - url: url, + dataType: 'script', + url: $(this).attr('src'), success: function (data, status, $xhr) { - self.fixturesCache_[relativeUrl] = $xhr.responseText + htmlText += '' }, error: function (jqXHR, status, errorThrown) { - throw new Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')') + throw new Error('Script could not be loaded: ' + scriptSrc + ' (status: ' + status + ', message: ' + errorThrown.message + ')') } - }) + }); + }) + + self.fixturesCache_[relativeUrl] = htmlText; } jasmine.Fixtures.prototype.makeFixtureUrl_ = function (relativeUrl){ @@ -177,7 +197,7 @@ jasmine.StyleFixtures.prototype.createStyle_ = function (html) { var styleText = $('
').html(html).text() - , style = $('') + , style = $('') this.fixturesNodes_.push(style) $('head').append(style) @@ -225,7 +245,7 @@ jasmine.JSONFixtures.prototype.loadFixtureIntoCache_ = function (relativeUrl) { var self = this - , url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl + , url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl $.ajax({ async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded @@ -245,461 +265,548 @@ return this[methodName].apply(this, passedArguments) } - jasmine.JQuery = function () {} + jasmine.jQuery = function () {} - jasmine.JQuery.browserTagCaseIndependentHtml = function (html) { + jasmine.jQuery.browserTagCaseIndependentHtml = function (html) { return $('
').append(html).html() } - jasmine.JQuery.elementToString = function (element) { - var domEl = $(element).get(0) + jasmine.jQuery.elementToString = function (element) { + return $(element).map(function () { return this.outerHTML; }).toArray().join(', ') + } - if (domEl === undefined || domEl.cloneNode) - return $('
').append($(element).clone()).html() - else - return element.toString() + var data = { + spiedEvents: {} + , handlers: [] } - jasmine.JQuery.matchersClass = {} + jasmine.jQuery.events = { + spyOn: function (selector, eventName) { + var handler = function (e) { + data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = jasmine.util.argsToArray(arguments) + } - !function (namespace) { - var data = { - spiedEvents: {} - , handlers: [] - } + $(selector).on(eventName, handler) + data.handlers.push(handler) - namespace.events = { - spyOn: function (selector, eventName) { - var handler = function (e) { - data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = jasmine.util.argsToArray(arguments) + return { + selector: selector, + eventName: eventName, + handler: handler, + reset: function (){ + delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] } + } + }, - $(selector).on(eventName, handler) - data.handlers.push(handler) + args: function (selector, eventName) { + var actualArgs = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] - return { - selector: selector, - eventName: eventName, - handler: handler, - reset: function (){ - delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] - } - } - }, + if (!actualArgs) { + throw "There is no spy for " + eventName + " on " + selector.toString() + ". Make sure to create a spy using spyOnEvent." + } - args: function (selector, eventName) { - var actualArgs = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] + return actualArgs + }, - if (!actualArgs) { - throw "There is no spy for " + eventName + " on " + selector.toString() + ". Make sure to create a spy using spyOnEvent." - } + wasTriggered: function (selector, eventName) { + return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]) + }, - return actualArgs - }, + wasTriggeredWith: function (selector, eventName, expectedArgs, util, customEqualityTesters) { + var actualArgs = jasmine.jQuery.events.args(selector, eventName).slice(1) - wasTriggered: function (selector, eventName) { - return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]) - }, + if (Object.prototype.toString.call(expectedArgs) !== '[object Array]') + actualArgs = actualArgs[0] - wasTriggeredWith: function (selector, eventName, expectedArgs, env) { - var actualArgs = jasmine.JQuery.events.args(selector, eventName).slice(1) - if (Object.prototype.toString.call(expectedArgs) !== '[object Array]') { - actualArgs = actualArgs[0] - } - return env.equals_(expectedArgs, actualArgs) - }, + return util.equals(expectedArgs, actualArgs, customEqualityTesters) + }, - wasPrevented: function (selector, eventName) { - var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] - , e = args ? args[0] : undefined + wasPrevented: function (selector, eventName) { + var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] + , e = args ? args[0] : undefined - return e && e.isDefaultPrevented() - }, + return e && e.isDefaultPrevented() + }, - wasStopped: function (selector, eventName) { - var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] - , e = args ? args[0] : undefined - return e && e.isPropagationStopped() - }, + wasStopped: function (selector, eventName) { + var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] + , e = args ? args[0] : undefined + return e && e.isPropagationStopped() + }, - cleanUp: function () { - data.spiedEvents = {} - data.handlers = [] - } + cleanUp: function () { + data.spiedEvents = {} + data.handlers = [] } - }(jasmine.JQuery) + } + + var hasProperty = function (actualValue, expectedValue) { + if (expectedValue === undefined) + return actualValue !== undefined - !function (){ - var jQueryMatchers = { - toHaveClass: function (className) { - return this.actual.hasClass(className) + return actualValue === expectedValue + } + + beforeEach(function () { + jasmine.addMatchers({ + toHaveClass: function () { + return { + compare: function (actual, className) { + return { pass: $(actual).hasClass(className) } + } + } }, - toHaveCss: function (css){ - for (var prop in css){ - var value = css[prop] - // see issue #147 on gh - ;if (value === 'auto' && this.actual.get(0).style[prop] === 'auto') continue - if (this.actual.css(prop) !== value) return false + toHaveCss: function () { + return { + compare: function (actual, css) { + for (var prop in css){ + var value = css[prop] + // see issue #147 on gh + ;if (value === 'auto' && $(actual).get(0).style[prop] === 'auto') continue + if ($(actual).css(prop) !== value) return { pass: false } + } + return { pass: true } + } } - return true }, toBeVisible: function () { - return this.actual.is(':visible') + return { + compare: function (actual) { + return { pass: $(actual).is(':visible') } + } + } }, toBeHidden: function () { - return this.actual.is(':hidden') + return { + compare: function (actual) { + return { pass: $(actual).is(':hidden') } + } + } }, toBeSelected: function () { - return this.actual.is(':selected') + return { + compare: function (actual) { + return { pass: $(actual).is(':selected') } + } + } }, toBeChecked: function () { - return this.actual.is(':checked') + return { + compare: function (actual) { + return { pass: $(actual).is(':checked') } + } + } }, toBeEmpty: function () { - return this.actual.is(':empty') + return { + compare: function (actual) { + return { pass: $(actual).is(':empty') } + } + } }, - toExist: function () { - return this.actual.length + toBeInDOM: function () { + return { + compare: function (actual) { + return { pass: $.contains(document.documentElement, $(actual)[0]) } + } + } }, - toHaveLength: function (length) { - return this.actual.length === length + toExist: function () { + return { + compare: function (actual) { + return { pass: $(actual).length } + } + } }, - toHaveAttr: function (attributeName, expectedAttributeValue) { - return hasProperty(this.actual.attr(attributeName), expectedAttributeValue) + toHaveLength: function () { + return { + compare: function (actual, length) { + return { pass: $(actual).length === length } + } + } }, - toHaveProp: function (propertyName, expectedPropertyValue) { - return hasProperty(this.actual.prop(propertyName), expectedPropertyValue) + toHaveAttr: function () { + return { + compare: function (actual, attributeName, expectedAttributeValue) { + return { pass: hasProperty($(actual).attr(attributeName), expectedAttributeValue) } + } + } }, - toHaveId: function (id) { - return this.actual.attr('id') == id + toHaveProp: function () { + return { + compare: function (actual, propertyName, expectedPropertyValue) { + return { pass: hasProperty($(actual).prop(propertyName), expectedPropertyValue) } + } + } }, - toHaveHtml: function (html) { - return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html) + toHaveId: function () { + return { + compare: function (actual, id) { + return { pass: $(actual).attr('id') == id } + } + } }, - toContainHtml: function (html){ - var actualHtml = this.actual.html() - , expectedHtml = jasmine.JQuery.browserTagCaseIndependentHtml(html) - - return (actualHtml.indexOf(expectedHtml) >= 0) + toHaveHtml: function () { + return { + compare: function (actual, html) { + return { pass: $(actual).html() == jasmine.jQuery.browserTagCaseIndependentHtml(html) } + } + } }, - toHaveText: function (text) { - var trimmedText = $.trim(this.actual.text()) + toContainHtml: function () { + return { + compare: function (actual, html) { + var actualHtml = $(actual).html() + , expectedHtml = jasmine.jQuery.browserTagCaseIndependentHtml(html) - if (text && $.isFunction(text.test)) { - return text.test(trimmedText) - } else { - return trimmedText == text + return { pass: (actualHtml.indexOf(expectedHtml) >= 0) } + } } }, - toContainText: function (text) { - var trimmedText = $.trim(this.actual.text()) + toHaveText: function () { + return { + compare: function (actual, text) { + var trimmedText = $.trim($(actual).text()) - if (text && $.isFunction(text.test)) { - return text.test(trimmedText) - } else { - return trimmedText.indexOf(text) != -1 + if (text && $.isFunction(text.test)) { + return { pass: text.test(trimmedText) } + } else { + return { pass: trimmedText == text } + } + } } }, - toHaveValue: function (value) { - return this.actual.val() === value + toContainText: function () { + return { + compare: function (actual, text) { + var trimmedText = $.trim($(actual).text()) + + if (text && $.isFunction(text.test)) { + return { pass: text.test(trimmedText) } + } else { + return { pass: trimmedText.indexOf(text) != -1 } + } + } + } }, - toHaveData: function (key, expectedValue) { - return hasProperty(this.actual.data(key), expectedValue) + toHaveValue: function () { + return { + compare: function (actual, value) { + return { pass: $(actual).val() === value } + } + } }, - toBe: function (selector) { - return this.actual.is(selector) + toHaveData: function () { + return { + compare: function (actual, key, expectedValue) { + return { pass: hasProperty($(actual).data(key), expectedValue) } + } + } }, - toContain: function (selector) { - return this.actual.find(selector).length + toContainElement: function () { + return { + compare: function (actual, selector) { + if (window.debug) debugger + return { pass: $(actual).find(selector).length } + } + } }, - toBeMatchedBy: function (selector) { - return this.actual.filter(selector).length + toBeMatchedBy: function () { + return { + compare: function (actual, selector) { + return { pass: $(actual).filter(selector).length } + } + } }, - toBeDisabled: function (selector){ - return this.actual.is(':disabled') + toBeDisabled: function () { + return { + compare: function (actual, selector) { + return { pass: $(actual).is(':disabled') } + } + } }, toBeFocused: function (selector) { - return this.actual[0] === this.actual[0].ownerDocument.activeElement + return { + compare: function (actual, selector) { + return { pass: $(actual)[0] === $(actual)[0].ownerDocument.activeElement } + } + } }, - toHandle: function (event) { - var events = $._data(this.actual.get(0), "events") + toHandle: function () { + return { + compare: function (actual, event) { + var events = $._data($(actual).get(0), "events") - if(!events || !event || typeof event !== "string") { - return false - } + if (!events || !event || typeof event !== "string") { + return { pass: false } + } - var namespaces = event.split(".") - , eventType = namespaces.shift() - , sortedNamespaces = namespaces.slice(0).sort() - , namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") + var namespaces = event.split(".") + , eventType = namespaces.shift() + , sortedNamespaces = namespaces.slice(0).sort() + , namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") - if(events[eventType] && namespaces.length) { - for(var i = 0; i < events[eventType].length; i++) { - var namespace = events[eventType][i].namespace + if (events[eventType] && namespaces.length) { + for (var i = 0; i < events[eventType].length; i++) { + var namespace = events[eventType][i].namespace - if(namespaceRegExp.test(namespace)) { - return true + if (namespaceRegExp.test(namespace)) + return { pass: true } + } + } else { + return { pass: (events[eventType] && events[eventType].length > 0) } } + + return { pass: false } } - } else { - return events[eventType] && events[eventType].length > 0 } }, - toHandleWith: function (eventName, eventHandler) { - var normalizedEventName = eventName.split('.')[0] - , stack = $._data(this.actual.get(0), "events")[normalizedEventName] - - for (var i = 0; i < stack.length; i++) { - if (stack[i].handler == eventHandler) return true - } + toHandleWith: function () { + return { + compare: function (actual, eventName, eventHandler) { + var normalizedEventName = eventName.split('.')[0] + , stack = $._data($(actual).get(0), "events")[normalizedEventName] - return false - } - } + for (var i = 0; i < stack.length; i++) { + if (stack[i].handler == eventHandler) return { pass: true } + } - var hasProperty = function (actualValue, expectedValue) { - if (expectedValue === undefined) return actualValue !== undefined + return { pass: false } + } + } + }, - return actualValue == expectedValue - } + toHaveBeenTriggeredOn: function () { + return { + compare: function (actual, selector) { + var result = { pass: jasmine.jQuery.events.wasTriggered(selector, actual) } - var bindMatcher = function (methodName) { - var builtInMatcher = jasmine.Matchers.prototype[methodName] + result.message = result.pass ? + "Expected event " + $(actual) + " not to have been triggered on " + selector : + "Expected event " + $(actual) + " to have been triggered on " + selector - jasmine.JQuery.matchersClass[methodName] = function () { - if (this.actual - && (this.actual instanceof $ - || jasmine.isDomNode(this.actual))) { - this.actual = $(this.actual) - var result = jQueryMatchers[methodName].apply(this, arguments) - , element + return result; + } + } + }, - if (this.actual.get && (element = this.actual.get()[0]) && !$.isWindow(element) && element.tagName !== "HTML") - this.actual = jasmine.JQuery.elementToString(this.actual) + toHaveBeenTriggered: function (){ + return { + compare: function (actual) { + var eventName = actual.eventName + , selector = actual.selector + , result = { pass: jasmine.jQuery.events.wasTriggered(selector, eventName) } - return result - } + result.message = result.pass ? + "Expected event " + eventName + " not to have been triggered on " + selector : + "Expected event " + eventName + " to have been triggered on " + selector - if (builtInMatcher) { - return builtInMatcher.apply(this, arguments) + return result + } } + }, - return false - } - } + toHaveBeenTriggeredOnAndWith: function (j$, customEqualityTesters) { + return { + compare: function (actual, selector, expectedArgs) { + var wasTriggered = jasmine.jQuery.events.wasTriggered(selector, actual) + , result = { pass: wasTriggered && jasmine.jQuery.events.wasTriggeredWith(selector, actual, expectedArgs, j$, customEqualityTesters) } + + if (wasTriggered) { + var actualArgs = jasmine.jQuery.events.args(selector, actual, expectedArgs)[1] + result.message = result.pass ? + "Expected event " + actual + " not to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs) : + "Expected event " + actual + " to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs) + + } else { + // todo check on this + result.message = result.pass ? + "Expected event " + actual + " not to have been triggered on " + selector : + "Expected event " + actual + " to have been triggered on " + selector + } - for(var methodName in jQueryMatchers) { - bindMatcher(methodName) - } - }() + return result + } + } + }, - beforeEach(function () { - this.addMatchers(jasmine.JQuery.matchersClass) - this.addMatchers({ - toHaveBeenTriggeredOn: function (selector) { - this.message = function () { - return [ - "Expected event " + this.actual + " to have been triggered on " + selector, - "Expected event " + this.actual + " not to have been triggered on " + selector - ] - } - return jasmine.JQuery.events.wasTriggered(selector, this.actual) - } - }) - this.addMatchers({ - toHaveBeenTriggered: function (){ - var eventName = this.actual.eventName - , selector = this.actual.selector + toHaveBeenPreventedOn: function () { + return { + compare: function (actual, selector) { + var result = { pass: jasmine.jQuery.events.wasPrevented(selector, actual) } - this.message = function () { - return [ - "Expected event " + eventName + " to have been triggered on " + selector, - "Expected event " + eventName + " not to have been triggered on " + selector - ] - } + result.message = result.pass ? + "Expected event " + actual + " not to have been prevented on " + selector : + "Expected event " + actual + " to have been prevented on " + selector - return jasmine.JQuery.events.wasTriggered(selector, eventName) - } - }) - this.addMatchers({ - toHaveBeenTriggeredOnAndWith: function () { - var selector = arguments[0] - , expectedArgs = arguments[1] - , wasTriggered = jasmine.JQuery.events.wasTriggered(selector, this.actual) - - this.message = function () { - if (wasTriggered) { - var actualArgs = jasmine.JQuery.events.args(selector, this.actual, expectedArgs)[1] - return [ - "Expected event " + this.actual + " to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs), - "Expected event " + this.actual + " not to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs) - ] - } else { - return [ - "Expected event " + this.actual + " to have been triggered on " + selector, - "Expected event " + this.actual + " not to have been triggered on " + selector - ] - } - } - - return wasTriggered && jasmine.JQuery.events.wasTriggeredWith(selector, this.actual, expectedArgs, this.env) - } - }) - this.addMatchers({ - toHaveBeenPreventedOn: function (selector) { - this.message = function () { - return [ - "Expected event " + this.actual + " to have been prevented on " + selector, - "Expected event " + this.actual + " not to have been prevented on " + selector - ] + return result + } } + }, - return jasmine.JQuery.events.wasPrevented(selector, this.actual) - } - }) - this.addMatchers({ toHaveBeenPrevented: function () { - var eventName = this.actual.eventName - , selector = this.actual.selector - this.message = function () { - return [ - "Expected event " + eventName + " to have been prevented on " + selector, - "Expected event " + eventName + " not to have been prevented on " + selector - ] + return { + compare: function (actual) { + var eventName = actual.eventName + , selector = actual.selector + , result = { pass: jasmine.jQuery.events.wasPrevented(selector, eventName) } + + result.message = result.pass ? + "Expected event " + eventName + " not to have been prevented on " + selector : + "Expected event " + eventName + " to have been prevented on " + selector + + return result + } } + }, - return jasmine.JQuery.events.wasPrevented(selector, eventName) - } - }) - this.addMatchers({ - toHaveBeenStoppedOn: function (selector) { - this.message = function () { - return [ - "Expected event " + this.actual + " to have been stopped on " + selector, - "Expected event " + this.actual + " not to have been stopped on " + selector - ] + toHaveBeenStoppedOn: function () { + return { + compare: function (actual, selector) { + var result = { pass: jasmine.jQuery.events.wasStopped(selector, actual) } + + result.message = result.pass ? + "Expected event " + actual + " not to have been stopped on " + selector : + "Expected event " + actual + " to have been stopped on " + selector + + return result; + } } + }, - return jasmine.JQuery.events.wasStopped(selector, this.actual) - } - }) - this.addMatchers({ toHaveBeenStopped: function () { - var eventName = this.actual.eventName - , selector = this.actual.selector - this.message = function () { - return [ - "Expected event " + eventName + " to have been stopped on " + selector, - "Expected event " + eventName + " not to have been stopped on " + selector - ] - } - return jasmine.JQuery.events.wasStopped(selector, eventName) + return { + compare: function (actual) { + var eventName = actual.eventName + , selector = actual.selector + , result = { pass: jasmine.jQuery.events.wasStopped(selector, eventName) } + + result.message = result.pass ? + "Expected event " + eventName + " not to have been stopped on " + selector : + "Expected event " + eventName + " to have been stopped on " + selector + + return result + } + } } }) - jasmine.getEnv().addEqualityTester(function (a, b) { - if(a instanceof jQuery && b instanceof jQuery) { - if(a.size() != b.size()) { - return jasmine.undefined + + jasmine.getEnv().addCustomEqualityTester(function(a, b) { + if (a && b) { + if (a instanceof $ || jasmine.isDomNode(a)) { + var $a = $(a) + + if (b instanceof $) + return $a.length == b.length && a.is(b) + + return $a.is(b); } - else if(a.is(b)) { - return true + + if (b instanceof $ || jasmine.isDomNode(b)) { + var $b = $(b) + + if (a instanceof jQuery) + return a.length == $b.length && $b.is(a) + + return $(b).is(a); } } + }) - return jasmine.undefined + jasmine.getEnv().addCustomEqualityTester(function (a, b) { + if (a instanceof jQuery && b instanceof jQuery && a.size() == b.size()) + return a.is(b) }) }) afterEach(function () { jasmine.getFixtures().cleanUp() jasmine.getStyleFixtures().cleanUp() - jasmine.JQuery.events.cleanUp() + jasmine.jQuery.events.cleanUp() }) -}(window.jasmine, window.jQuery) - -+function (jasmine, global) { "use strict"; - global.readFixtures = function () { + window.readFixtures = function () { return jasmine.getFixtures().proxyCallTo_('read', arguments) } - global.preloadFixtures = function () { + window.preloadFixtures = function () { jasmine.getFixtures().proxyCallTo_('preload', arguments) } - global.loadFixtures = function () { + window.loadFixtures = function () { jasmine.getFixtures().proxyCallTo_('load', arguments) } - global.appendLoadFixtures = function () { + window.appendLoadFixtures = function () { jasmine.getFixtures().proxyCallTo_('appendLoad', arguments) } - global.setFixtures = function (html) { + window.setFixtures = function (html) { return jasmine.getFixtures().proxyCallTo_('set', arguments) } - global.appendSetFixtures = function () { + window.appendSetFixtures = function () { jasmine.getFixtures().proxyCallTo_('appendSet', arguments) } - global.sandbox = function (attributes) { + window.sandbox = function (attributes) { return jasmine.getFixtures().sandbox(attributes) } - global.spyOnEvent = function (selector, eventName) { - return jasmine.JQuery.events.spyOn(selector, eventName) + window.spyOnEvent = function (selector, eventName) { + return jasmine.jQuery.events.spyOn(selector, eventName) } - global.preloadStyleFixtures = function () { + window.preloadStyleFixtures = function () { jasmine.getStyleFixtures().proxyCallTo_('preload', arguments) } - global.loadStyleFixtures = function () { + window.loadStyleFixtures = function () { jasmine.getStyleFixtures().proxyCallTo_('load', arguments) } - global.appendLoadStyleFixtures = function () { + window.appendLoadStyleFixtures = function () { jasmine.getStyleFixtures().proxyCallTo_('appendLoad', arguments) } - global.setStyleFixtures = function (html) { + window.setStyleFixtures = function (html) { jasmine.getStyleFixtures().proxyCallTo_('set', arguments) } - global.appendSetStyleFixtures = function (html) { + window.appendSetStyleFixtures = function (html) { jasmine.getStyleFixtures().proxyCallTo_('appendSet', arguments) } - global.loadJSONFixtures = function () { + window.loadJSONFixtures = function () { return jasmine.getJSONFixtures().proxyCallTo_('load', arguments) } - global.getJSONFixture = function (url) { + window.getJSONFixture = function (url) { return jasmine.getJSONFixtures().proxyCallTo_('read', arguments)[url] } -}(jasmine, window); \ No newline at end of file +}(window, window.jasmine, window.jQuery); diff --git a/spec/javascripts/views/section_organizer_view_spec.js b/spec/javascripts/views/section_organizer_view_spec.js index b8a00f0d3..81f4988e6 100644 --- a/spec/javascripts/views/section_organizer_view_spec.js +++ b/spec/javascripts/views/section_organizer_view_spec.js @@ -26,10 +26,10 @@ describe("Bridgetroll.Views.SectionOrganizer", function () { name: 'Spaceship #491' } ]); - sessions = [{ + sessions = new Bridgetroll.Collections.Session([{ id: 1, name: 'Workshop' - }]; + }]); sectionOrganizer = new Bridgetroll.Views.SectionOrganizer({ event_id: 191, sections: sections, diff --git a/spec/javascripts/views/section_view_spec.js b/spec/javascripts/views/section_view_spec.js index 19898156f..0baf7b547 100644 --- a/spec/javascripts/views/section_view_spec.js +++ b/spec/javascripts/views/section_view_spec.js @@ -19,7 +19,8 @@ describe("Bridgetroll.Views.Section", function () { }); view = new Bridgetroll.Views.Section({ section: model, - attendees: attendees + attendees: attendees, + selectedSession: new Bridgetroll.Models.Section({id: 2, name: 'Cool Section'}) }); }); @@ -57,7 +58,7 @@ describe("Bridgetroll.Views.Section", function () { describe("onDestroyClick", function () { beforeEach(function () { - spyOn(window, 'confirm').andReturn(true); + spyOn(window, 'confirm').and.returnValue(true); view.onDestroyClick(); }); @@ -111,8 +112,6 @@ describe("Bridgetroll.Views.Section", function () { it("applies changes to the model", function () { expect(model.get('name')).toEqual("Pirate's Bay"); }); - - it("closes the modal"); }); }); });