Added: rave/branches/require/rave-portal-resources/src/test/dependencies/testr.js URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/dependencies/testr.js?rev=1497548&view=auto ============================================================================== --- rave/branches/require/rave-portal-resources/src/test/dependencies/testr.js (added) +++ rave/branches/require/rave-portal-resources/src/test/dependencies/testr.js Thu Jun 27 20:05:28 2013 @@ -0,0 +1,401 @@ +/** + * testr.js 1.3.2 + * https://www.github.com/mattfysh/testr.js + * Distributed under the MIT license + */ + +var testr, define, require; + +(function() { + var version = '1.3.2', + origRequire = require, + origDefine = define, + cjsRequireRegExp = /require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, + noop = function() {}, + moduleMap = {}, + pluginPaths = {}, + config = { + root: './' + }, + running = false, + requireCount = 0, + requireLoadedCount = 0, + lazy, + complete; + + // type detection + function isArray(a) { + return Object.prototype.toString.call(a) == '[object Array]'; + } + function isObject(o) { + return typeof o === 'object' && !isArray(o); + } + + // deep copy + function deepCopy(src) { + var tgt = isObject(src) ? {} : []; + each(src, function(val, key) { + tgt[key] = (isArray(val) || isObject(val)) ? deepCopy(val) : val; + }); + return tgt; + } + + // each + function each(items, callback) { + if (!items) { + return; + } else if (isArray(items)) { + for (var i = 0; i < items.length; i += 1) { + callback(items[i], i); + } + } else { + for (var prop in items) { + if (items.hasOwnProperty(prop)) { + callback(items[prop], prop); + } + } + } + } + + // normalize paths + function normalize(path, contextReq) { + var baseUrl = require.toUrl('.').replace(/\.$/, ''); + if (path.indexOf('!') === -1) { + // regular path + return contextReq(path); + } else { + // plugin + path = path.split('!'); + if (path[1]) { + path[1] = contextReq.toUrl(path[1]).substring(baseUrl.length); + } + return path.join('!'); + } + } + + // override require + require = function(deps, callback) { + if (typeof deps === 'string') { + // requesting internal or plugin module + return origRequire(deps); + } else if (running) { + // lazy loading modules async + setTimeout(function() { + var actuals = []; + each(deps, function(depName) { + actuals.push(lazy(depName)); + }); + callback.apply(null, actuals); + }, 0); + } else { + // calls made to load modules, before tests are executed + var cfg = deps.deps ? deps : {deps: deps}; + if (!cfg.context) { + delete cfg.baseUrl; + } + + requireCount++; + + var thisRequire = origRequire(cfg, cfg.deps, function() { + cfg.callback && cfg.callback(); + if (++requireLoadedCount === requireCount) { + // all requires have finished loading, execute testr callback + complete(); + } + }, function(err) { + // force failures to finish loading, by defining them as empty modules + var failed = err.requireModules[0]; + thisRequire.undef(failed); + origDefine(failed, {}); + thisRequire([failed]); + }); + } + }; + + // override define + define = function() { + var args = [].slice.call(arguments), + factory = args.pop(), + deps = args.pop(), + name = args.pop(), + depPaths = ['require', 'module'], + extractedPaths = [], + pluginLocs = [], + exportsLocs = [], + requireLocs = [], + wrap = !deps && typeof factory === 'function', + defineArgs; + + // account for signature variation + if (typeof deps === 'string') { + name = deps; + deps = []; + } + + // process the dependency ids + each(deps, function(path, index) { + if (path.indexOf('!') > -1) { + pluginPaths[path.split('!')[0]] = true; + pluginLocs.push(index); + } else if (path === 'exports') { + exportsLocs.push(index); + } else if (path === 'require') { + requireLocs.push(index); + } + depPaths.push(path); + }); + + // find cjs wrapped require calls + if (!deps) { + factory.toString().replace(cjsRequireRegExp, function (match, dep) { + extractedPaths.push(dep); + }); + } + + + // rewrite the function that requirejs executes when defining the module + function trojan(contextReq, module) { + var offset = 2, + deps = [].slice.call(arguments, offset), + autoDeps = [], + ignore = false; + + // determine if the module should be ignored + each(config.ignore, function(ignoreMod) { + if (module.id === ignoreMod) { + ignore = true; + } + }); + + if (!module || pluginPaths[module.id] || ignore) { + // jquery or plugin, give requirejs the real module + return (typeof factory === 'function') ? factory.apply(null, deps) : factory; + } + + // find dependencies which are stored in requirejs, replace with path + each(deps, function(dep, i) { + if (typeof dep !== 'string') { + deps[i] = depPaths[i + offset]; + } + }); + + // alter plugin storage + each(pluginLocs, function(loc) { + // normalize path names + var path = depPaths[loc + offset]; + deps[loc] = normalize(path, contextReq); + }); + + // alter exports deps + each(exportsLocs, function(loc) { + deps[loc] = 'exports'; + }); + + // alter require deps + each(requireLocs, function(loc) { + deps[loc] = 'require'; + }); + + // save the module + moduleMap[module.id] = { + factory: factory, + deps: wrap ? ['require', 'exports'] : deps, + require: contextReq + }; + + if (module.uri.indexOf('./' + config.stubUrl) === 0) { + // stub has been saved to module map, no further processing needed + return; + } + + // auto load associated files + if (config.stubUrl) { + autoDeps.push(config.stubUrl + '/' + module.id + '.stub'); + } + if (config.specUrl) { + autoDeps.push(config.specUrl + '/' + module.id + '.spec'); + } + if (autoDeps.length) { + require({ + context: module.id, + baseUrl: config.root, + deps: autoDeps + }); + } + + // define the module as its path name, used by dependants + return module.id; + } + + // hook back into the loader with modified dependancy paths + // to trigger dependency loading, and execute the trojan + defineArgs = [depPaths.concat(extractedPaths), trojan]; + if (name) { defineArgs.unshift(name); } + origDefine.apply(null, defineArgs); + if (name) { require([name]); } // force requirejs to load the module immediately and call the trojan + }; + + // copy original function properties + each(origRequire, function(val, key) { + require[key] = val; + }); + each(origDefine, function(val, key) { + define[key] = val; + }); + + // suppress 404 errors + origRequire.onError = function(err) { + if (err.requireType !== 'scripterror') { + throw err; + } + }; + + // create new modules with the factory + function buildModule(moduleName, stubs, useExternal, subject, whitelistExceptions) { + var depModules = [], + exports = {}, + mustBeStubbed = config.whitelist && config.whitelist.length, + moduleDef, externalStub, factory, deps, contextReq, + getModule = function(depName) { + return stubs && stubs[depName] || buildModule(depName, stubs, useExternal, false, whitelistExceptions); + }; + + // expose getModule method + lazy = getModule; + + // get external stub + externalStub = !subject && useExternal && moduleMap[config.stubUrl + '/' + moduleName + '.stub']; + + // throw error if module must be stubbed + if (mustBeStubbed && !subject && !externalStub) { + each(config.whitelist, function(allowedActual) { + if (moduleName === allowedActual) { + mustBeStubbed = false; + } + }); + if (mustBeStubbed) { + whitelistExceptions.push(moduleName); + return {}; + } + } + + // get module definition from map + moduleDef = externalStub || moduleMap[moduleName]; + if (!moduleDef) { + // module may be stored in requirejs, e.g. plugin-loaded dependencies + try { + return require(moduleName); + } catch(e) { + throw new Error('module has not been loaded: ' + moduleName); + } + } + + // shortcuts + factory = moduleDef.factory; + deps = moduleDef.deps; + contextReq = moduleDef.require; + + // normalize stubs object paths on first call + if (subject) { + each(stubs, function(stub, path) { + var nPath = normalize(path, contextReq); + if (nPath !== path) { + stubs[nPath] = stub; + delete stubs[path]; + } + }); + } + + // load up dependencies + each(deps, function(dep) { + // determine what to pass to the factory + if (dep == 'exports') { + dep = exports; + } else if (dep === 'require') { + dep = function(path) { + var module = contextReq(path); + if (typeof module === 'string' && path.indexOf('!') === -1) { + // module defined by testr.js, normalise path and build it + module = getModule(module); + } + return module; + }; + } else { + dep = getModule(dep); + } + + // add dependency to array + depModules.push(dep); + }); + + if (typeof factory !== 'function') { + // return clean copy of module object + return deepCopy(factory); + } else { + // return clean instance of module + return factory.apply(exports, depModules) || exports; + } + } + + // testr API + testr = function(moduleName, stubs, useExternal) { + var whitelistExceptions = [], + module, plural; + + // first call to set running state + running = true; + + // check module name + if (typeof moduleName !== 'string') { + throw Error('module name must be a string'); + } + + // check stubs + if (!useExternal && typeof stubs === 'boolean') { + useExternal = stubs; + stubs = {}; + } else if (stubs && !isObject(stubs)) { + throw Error('stubs must be given as an object'); + } + + // build the module under test + module = buildModule(moduleName, stubs, useExternal, true, whitelistExceptions); + + // throw error if not all required stubs provided + if (whitelistExceptions.length) { + plural = (whitelistExceptions.length > 1) ? 's' : ''; + throw Error('module' + plural + ' must be stubbed: ' + whitelistExceptions.join(', ')); + } + + // return the module + return module; + }; + + // testr config + testr.config = function(userConfig) { + each(userConfig, function(val, key) { + if (val) { + config[key] = val; + } else { + delete config[key]; + } + }); + }; + + // restore function + testr.restore = function() { + window.define = origDefine; + window.require = origRequire; + } + + // attach version + testr.version = version; + + // kick off + testr.run = function(rconf, callback) { + complete = callback; + origRequire({baseUrl: config.root + config.baseUrl}); + require([rconf]); + }; + +}());
Added: rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_ajax.spec URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_ajax.spec?rev=1497548&view=auto ============================================================================== --- rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_ajax.spec (added) +++ rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_ajax.spec Thu Jun 27 20:05:28 2013 @@ -0,0 +1,7 @@ +ajax = testr('core/rave_ajax'); + +describe('rave_ajax', function(){ + it('pass!', function(){ + expect(ajax).toBeTruthy(); + }) +}) Added: rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_api.spec URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_api.spec?rev=1497548&view=auto ============================================================================== --- rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_api.spec (added) +++ rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_api.spec Thu Jun 27 20:05:28 2013 @@ -0,0 +1,67 @@ +var mock = { + ajax: function(args){ + args.success({}) + } +} + +var eventManager = { + registerOnInitHandler: function(){} +} + +var stateManager = { + getContext: function(){} +} + + + + +describe('rave_api', function(){ + beforeEach(function () { + testScope = { + callback: function () { + } + } + + spyOn(mock, 'ajax').andCallThrough(); + api = testr('core/rave_api', { + './rave_ajax': mock.ajax, + './rave_state_manager': stateManager, + './rave_event_manager': eventManager + }) + spyOn(testScope, 'callback'); + }); + + //test helper function + function expectAjax(type, url, data) { + var args = mock.ajax.mostRecentCall.args[0]; + + expect(mock.ajax).toHaveBeenCalled(); + expect(args.type).toEqual(type); + expect(args.url).toEqual(url); + if (data) { + expect(args.data).toEqual(data); + } + if (args.successCallback) { + expect(testScope.callback).toHaveBeenCalled(); + } + } + + describe('rest', function(){ + describe('saveWidgetPreferences', function () { + it('makes the correct api call', function () { + + api.rest.saveWidgetPreferences({regionWidgetId: 1, userPrefs: {"color": "blue", "speed": "fast"}, + successCallback: testScope.callback}); + + expectAjax( + 'PUT', + 'api/rest/regionWidgets/1/preferences', + JSON.stringify({preferences: [ + {name: 'color', value: 'blue'}, + {name: 'speed', value: 'fast'} + ]}) + ); + }); + }); + }) +}) Added: rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_state_manager.spec URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_state_manager.spec?rev=1497548&view=auto ============================================================================== --- rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_state_manager.spec (added) +++ rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_state_manager.spec Thu Jun 27 20:05:28 2013 @@ -0,0 +1,13 @@ + + stateManager = testr('core/rave_state_manager'); + + describe('state_manager', function(){ + it('pass!', function(){ + expect(stateManager).toBeTruthy(); + }) + }) + + + + + Added: rave/branches/require/rave-portal-resources/src/test/requireConfig.js URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/requireConfig.js?rev=1497548&view=auto ============================================================================== --- rave/branches/require/rave-portal-resources/src/test/requireConfig.js (added) +++ rave/branches/require/rave-portal-resources/src/test/requireConfig.js Thu Jun 27 20:05:28 2013 @@ -0,0 +1,16 @@ +require.config({ + baseUrl:'src/', + paths:{ + "osapi": "/src/test/dependencies/osapi", + "jquery": "/src/test/dependencies/jquery", + "underscore": "/src/test/dependencies/underscore" + }, + shim: { + underscore:{ + exports: '_' + }, + jquery:{ + exports: '$' + } + } +}); Added: rave/branches/require/rave-portal-resources/src/test/testTemplate.htmltemplate URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/testTemplate.htmltemplate?rev=1497548&view=auto ============================================================================== --- rave/branches/require/rave-portal-resources/src/test/testTemplate.htmltemplate (added) +++ rave/branches/require/rave-portal-resources/src/test/testTemplate.htmltemplate Thu Jun 27 20:05:28 2013 @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=$sourceEncoding$"> + <title>Jasmine Spec Runner</title> + $cssDependencies$ + $javascriptDependencies$ + $preloadScriptTags$ +</head> +<body> +<script type="text/javascript"> + if(window.location.href.indexOf("ManualSpecRunner.html") !== -1) { + document.body.appendChild(document.createTextNode("Warning: opening this HTML file directly from the file system is deprecated. You should instead try running `mvn jasmine:bdd` from the command line, and then visit `http://localhost:8234` in your browser. ")) + } + var sources = $sourcesList$; + var specs = $specsList$; + var sourceDir = '$sourceDir$'; + + // remove sourceDir and .js extension from each source + for (var i=0; i < sources.length; i++) { + sources[i] = sources[i].replace(sourceDir+'/','').replace(/\.js\$/,''); + } + + $if(customRunnerConfiguration)$ + $customRunnerConfiguration$ + $else$ + + testr.config({ + baseUrl: 'src', + specUrl: '$specDir$', + root:'/', + ignore: ['jquery', 'rave'], + autoLoad: true + }); + + $endif$ + + + + testr.run('/src/test/requireConfig.js', function(){ + require(sources, function(){ + execJasmine(); + + + + function execJasmine() { + window.reporter = new jasmine.$reporter$(); jasmine.getEnv().addReporter(reporter); + jasmine.getEnv().execute(); + + } + }) + + + }) + + + + + +</script> +</body> +</html>
