From a77e7fe57b4b0f339eafe2cc3319f6299f5839d2 Mon Sep 17 00:00:00 2001 From: Prem Sichanugrist Date: Thu, 5 Jul 2012 23:31:21 -0400 Subject: [PATCH] Update jasmine-jquery for newer features --- cms/static/js/jasmine-jquery.js | 339 ++++++++++++++++++-------------- 1 file changed, 195 insertions(+), 144 deletions(-) diff --git a/cms/static/js/jasmine-jquery.js b/cms/static/js/jasmine-jquery.js index d516eb1080..f1b2c138c6 100644 --- a/cms/static/js/jasmine-jquery.js +++ b/cms/static/js/jasmine-jquery.js @@ -1,315 +1,366 @@ var readFixtures = function() { - return jasmine.getFixtures().proxyCallTo_('read', arguments); -}; + return jasmine.getFixtures().proxyCallTo_('read', arguments) +} var preloadFixtures = function() { - jasmine.getFixtures().proxyCallTo_('preload', arguments); -}; + jasmine.getFixtures().proxyCallTo_('preload', arguments) +} var loadFixtures = function() { - jasmine.getFixtures().proxyCallTo_('load', arguments); -}; + jasmine.getFixtures().proxyCallTo_('load', arguments) +} + +var appendLoadFixtures = function() { + jasmine.getFixtures().proxyCallTo_('appendLoad', arguments) +} var setFixtures = function(html) { - jasmine.getFixtures().set(html); -}; + jasmine.getFixtures().proxyCallTo_('set', arguments) +} + +var appendSetFixtures = function() { + jasmine.getFixtures().proxyCallTo_('appendSet', arguments) +} var sandbox = function(attributes) { - return jasmine.getFixtures().sandbox(attributes); -}; + return jasmine.getFixtures().sandbox(attributes) +} var spyOnEvent = function(selector, eventName) { - jasmine.JQuery.events.spyOn(selector, eventName); -}; + jasmine.JQuery.events.spyOn(selector, eventName) +} jasmine.getFixtures = function() { - return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures(); -}; + return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures() +} jasmine.Fixtures = function() { - this.containerId = 'jasmine-fixtures'; - this.fixturesCache_ = {}; - this.fixturesPath = 'spec/javascripts/fixtures'; -}; + this.containerId = 'jasmine-fixtures' + this.fixturesCache_ = {} + this.fixturesPath = 'spec/javascripts/fixtures' +} jasmine.Fixtures.prototype.set = function(html) { - this.cleanUp(); - this.createContainer_(html); -}; + this.cleanUp() + this.createContainer_(html) +} + +jasmine.Fixtures.prototype.appendSet= function(html) { + this.addToContainer_(html) +} jasmine.Fixtures.prototype.preload = function() { - this.read.apply(this, arguments); -}; + this.read.apply(this, arguments) +} jasmine.Fixtures.prototype.load = function() { - this.cleanUp(); - this.createContainer_(this.read.apply(this, arguments)); -}; + this.cleanUp() + this.createContainer_(this.read.apply(this, arguments)) +} + +jasmine.Fixtures.prototype.appendLoad = function() { + this.addToContainer_(this.read.apply(this, arguments)) +} jasmine.Fixtures.prototype.read = function() { - var htmlChunks = []; + var htmlChunks = [] - var fixtureUrls = arguments; + var fixtureUrls = arguments for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) { - htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex])); + htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex])) } - return htmlChunks.join(''); -}; + return htmlChunks.join('') +} jasmine.Fixtures.prototype.clearCache = function() { - this.fixturesCache_ = {}; -}; + this.fixturesCache_ = {} +} jasmine.Fixtures.prototype.cleanUp = function() { - jQuery('#' + this.containerId).remove(); -}; + jQuery('#' + this.containerId).remove() +} jasmine.Fixtures.prototype.sandbox = function(attributes) { - var attributesToSet = attributes || {}; - return jQuery('
').attr(attributesToSet); -}; + var attributesToSet = attributes || {} + return jQuery('
').attr(attributesToSet) +} jasmine.Fixtures.prototype.createContainer_ = function(html) { - var container; + var container if(html instanceof jQuery) { - container = jQuery('
'); - container.html(html); + container = jQuery('
') + container.html(html) } else { container = '
' + html + '
' } - jQuery('body').append(container); -}; + jQuery('body').append(container) +} + +jasmine.Fixtures.prototype.addToContainer_ = function(html){ + var container = jQuery('body').find('#'+this.containerId).append(html) + if(!container.length){ + this.createContainer_(html) + } +} jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) { - if (typeof this.fixturesCache_[url] == 'undefined') { - this.loadFixtureIntoCache_(url); + if (typeof this.fixturesCache_[url] === 'undefined') { + this.loadFixtureIntoCache_(url) } - return this.fixturesCache_[url]; -}; + return this.fixturesCache_[url] +} jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) { - var url = this.makeFixtureUrl_(relativeUrl); - var request = new XMLHttpRequest(); - request.open("GET", url + "?" + new Date().getTime(), false); - request.send(null); - this.fixturesCache_[relativeUrl] = request.responseText; -}; + var url = this.makeFixtureUrl_(relativeUrl) + var request = new XMLHttpRequest() + request.open("GET", url + "?" + new Date().getTime(), false) + request.send(null) + this.fixturesCache_[relativeUrl] = request.responseText +} jasmine.Fixtures.prototype.makeFixtureUrl_ = function(relativeUrl){ - return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl; -}; + return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl +} jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) { - return this[methodName].apply(this, passedArguments); -}; + return this[methodName].apply(this, passedArguments) +} -jasmine.JQuery = function() {}; +jasmine.JQuery = function() {} jasmine.JQuery.browserTagCaseIndependentHtml = function(html) { - return jQuery('
').append(html).html(); -}; + return jQuery('
').append(html).html() +} jasmine.JQuery.elementToString = function(element) { - var sample = $(element).get()[0] - if (sample == undefined || sample.cloneNode) - return jQuery('
').append($(element).clone()).html(); + var domEl = $(element).get(0) + if (domEl == undefined || domEl.cloneNode) + return jQuery('
').append($(element).clone()).html() else - return element.toString(); -}; + return element.toString() +} jasmine.JQuery.matchersClass = {}; -(function(namespace) { +!function(namespace) { var data = { spiedEvents: {}, handlers: [] - }; + } namespace.events = { spyOn: function(selector, eventName) { var handler = function(e) { - data.spiedEvents[[selector, eventName]] = e; - }; - jQuery(selector).bind(eventName, handler); - data.handlers.push(handler); + data.spiedEvents[[selector, eventName]] = e + } + jQuery(selector).bind(eventName, handler) + data.handlers.push(handler) }, wasTriggered: function(selector, eventName) { - return !!(data.spiedEvents[[selector, eventName]]); + return !!(data.spiedEvents[[selector, eventName]]) }, wasPrevented: function(selector, eventName) { - return data.spiedEvents[[selector, eventName]].isDefaultPrevented(); + return data.spiedEvents[[selector, eventName]].isDefaultPrevented() }, cleanUp: function() { - data.spiedEvents = {}; - data.handlers = []; + data.spiedEvents = {} + data.handlers = [] } } -})(jasmine.JQuery); +}(jasmine.JQuery) -(function(){ +!function(){ var jQueryMatchers = { toHaveClass: function(className) { - return this.actual.hasClass(className); + return this.actual.hasClass(className) + }, + + toHaveCss: function(css){ + for (var prop in css){ + if (this.actual.css(prop) !== css[prop]) return false + } + return true }, toBeVisible: function() { - return this.actual.is(':visible'); + return this.actual.is(':visible') }, toBeHidden: function() { - return this.actual.is(':hidden'); + return this.actual.is(':hidden') }, toBeSelected: function() { - return this.actual.is(':selected'); + return this.actual.is(':selected') }, toBeChecked: function() { - return this.actual.is(':checked'); + return this.actual.is(':checked') }, toBeEmpty: function() { - return this.actual.is(':empty'); + return this.actual.is(':empty') }, toExist: function() { - return $(document).find(this.actual).length; + return $(document).find(this.actual).length }, toHaveAttr: function(attributeName, expectedAttributeValue) { - return hasProperty(this.actual.attr(attributeName), expectedAttributeValue); + return hasProperty(this.actual.attr(attributeName), expectedAttributeValue) }, toHaveProp: function(propertyName, expectedPropertyValue) { - return hasProperty(this.actual.prop(propertyName), expectedPropertyValue); + return hasProperty(this.actual.prop(propertyName), expectedPropertyValue) }, toHaveId: function(id) { - return this.actual.attr('id') == id; + return this.actual.attr('id') == id }, toHaveHtml: function(html) { - return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html); + return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html) + }, + + toContainHtml: function(html){ + var actualHtml = this.actual.html() + var expectedHtml = jasmine.JQuery.browserTagCaseIndependentHtml(html) + return (actualHtml.indexOf(expectedHtml) >= 0) }, toHaveText: function(text) { - var trimmedText = $.trim(this.actual.text()); + var trimmedText = $.trim(this.actual.text()) if (text && jQuery.isFunction(text.test)) { - return text.test(trimmedText); + return text.test(trimmedText) } else { - return trimmedText == text; + return trimmedText == text } }, toHaveValue: function(value) { - return this.actual.val() == value; + return this.actual.val() == value }, toHaveData: function(key, expectedValue) { - return hasProperty(this.actual.data(key), expectedValue); + return hasProperty(this.actual.data(key), expectedValue) }, toBe: function(selector) { - return this.actual.is(selector); + return this.actual.is(selector) }, toContain: function(selector) { - return this.actual.find(selector).length; + return this.actual.find(selector).length }, toBeDisabled: function(selector){ - return this.actual.is(':disabled'); + return this.actual.is(':disabled') }, toBeFocused: function(selector) { - return this.actual.is(':focus'); + return this.actual.is(':focus') }, - // tests the existence of a specific event binding - toHandle: function(eventName) { - var events = this.actual.data("events"); - return events && events[eventName].length > 0; + toHandle: function(event) { + + var events = this.actual.data('events') + + if(!events || !event || typeof event !== "string") { + return false + } + + var namespaces = event.split(".") + var eventType = namespaces.shift() + var sortedNamespaces = namespaces.slice(0).sort() + var 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(namespaceRegExp.test(namespace)) { + return true + } + } + } else { + return events[eventType] && events[eventType].length > 0 + } }, // tests the existence of a specific event binding + handler toHandleWith: function(eventName, eventHandler) { - var stack = this.actual.data("events")[eventName]; - var i; - for (i = 0; i < stack.length; i++) { - if (stack[i].handler == eventHandler) { - return true; - } + var stack = this.actual.data("events")[eventName] + for (var i = 0; i < stack.length; i++) { + if (stack[i].handler == eventHandler) return true } - return false; + return false } - }; + } var hasProperty = function(actualValue, expectedValue) { - if (expectedValue === undefined) { - return actualValue !== undefined; - } - return actualValue == expectedValue; - }; + if (expectedValue === undefined) return actualValue !== undefined + return actualValue == expectedValue + } var bindMatcher = function(methodName) { - var builtInMatcher = jasmine.Matchers.prototype[methodName]; + var builtInMatcher = jasmine.Matchers.prototype[methodName] jasmine.JQuery.matchersClass[methodName] = function() { if (this.actual - && (this.actual instanceof jQuery - || jasmine.isDomNode(this.actual))) { - this.actual = $(this.actual); - var result = jQueryMatchers[methodName].apply(this, arguments) - if (this.actual.get && !$.isWindow(this.actual.get()[0])) - this.actual = jasmine.JQuery.elementToString(this.actual) - return result; - } + && (this.actual instanceof jQuery + || jasmine.isDomNode(this.actual))) { + this.actual = $(this.actual) + var result = jQueryMatchers[methodName].apply(this, arguments) + var element; + if (this.actual.get && (element = this.actual.get()[0]) && !$.isWindow(element) && element.tagName !== "HTML") + this.actual = jasmine.JQuery.elementToString(this.actual) + return result + } - if (builtInMatcher) { - return builtInMatcher.apply(this, arguments); - } + if (builtInMatcher) { + return builtInMatcher.apply(this, arguments) + } - return false; - }; - }; + return false + } + } for(var methodName in jQueryMatchers) { - bindMatcher(methodName); + bindMatcher(methodName) } -})(); +}() beforeEach(function() { - this.addMatchers(jasmine.JQuery.matchersClass); + 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); + ] + } + return jasmine.JQuery.events.wasTriggered($(selector), this.actual) } - }); + }) 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 jasmine.JQuery.events.wasPrevented(selector, this.actual); + ] + } + return jasmine.JQuery.events.wasPrevented(selector, this.actual) } - }); -}); + }) +}) afterEach(function() { - jasmine.getFixtures().cleanUp(); - jasmine.JQuery.events.cleanUp(); -}); + jasmine.getFixtures().cleanUp() + jasmine.JQuery.events.cleanUp() +})