From 7b79c7aa7d717962be9ec1a46542fa6fd1413a0e Mon Sep 17 00:00:00 2001 From: Nick Niemeir Date: Sat, 14 Apr 2012 03:43:17 +0000 Subject: [PATCH] Rearranged fetch some more, added tests. --- client/client.js | 140 +++++++++++++++---------------------- client/lib/fetch.coffee | 88 ++++++++++------------- client/lib/legacy.coffee | 12 ++-- client/test/fetch.coffee | 51 ++++++++++++++ client/test/plugin.coffee | 2 +- client/test/testclient.js | 143 +++++++++++++++++++++++++++++++++++++- client/testclient.coffee | 2 +- 7 files changed, 294 insertions(+), 144 deletions(-) create mode 100644 client/test/fetch.coffee diff --git a/client/client.js b/client/client.js index cca3a7b2..65d960d6 100644 --- a/client/client.js +++ b/client/client.js @@ -400,7 +400,6 @@ require.define("/lib/legacy.coffee", function (require, module, exports, __dirna return null; }; wiki.resolutionContext = []; - wiki.fetchContext = []; resolveFrom = wiki.resolveFrom = function(addition, callback) { wiki.resolutionContext.push(addition); try { @@ -656,11 +655,7 @@ require.define("/lib/legacy.coffee", function (require, module, exports, __dirna initDragging(pageElement); return initAddButton(pageElement); }; - return fetch({ - buildPage: buildPage, - putAction: putAction, - pageElement: pageElement - }); + return fetch(pageElement, buildPage); }; LEFTARROW = 37; RIGHTARROW = 39; @@ -708,8 +703,8 @@ require.define("/lib/legacy.coffee", function (require, module, exports, __dirna var name; e.preventDefault(); name = $(e.target).data('pageName'); - wiki.fetchContext = $(e.target).attr('title').split(' => '); - wiki.log('click', name, 'context', wiki.fetchContext); + fetch.context = $(e.target).attr('title').split(' => '); + wiki.log('click', name, 'context', fetch.context); if (!e.shiftKey) $(e.target).parents('.page').nextAll().remove(); createPage(name).appendTo('.main').each(refresh); return active.set($('.page').last()); @@ -789,91 +784,70 @@ require.define("/lib/util.coffee", function (require, module, exports, __dirname require.define("/lib/fetch.coffee", function (require, module, exports, __dirname, __filename) { (function() { - var util; + var probe, util; util = require('./util'); - module.exports = function(params) { - var buildPage, create, json, pageElement, probe, putAction, site, slug; - buildPage = params.buildPage, putAction = params.putAction, pageElement = params.pageElement; - slug = $(pageElement).attr('id'); - site = $(pageElement).data('site'); - probe = function(slug, callback, localContext) { - var i, resource; - if (!(wiki.fetchContext.length > 0)) wiki.fetchContext = ['origin']; - if (localContext == null) { - localContext = (function() { - var _i, _len, _ref, _results; - _ref = wiki.fetchContext; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - i = _ref[_i]; - _results.push(i); - } - return _results; - })(); - } - site = localContext.shift(); - resource = site === 'origin' ? (site = null, slug) : "remote/" + site + "/" + slug; - return $.ajax({ - type: 'GET', - dataType: 'json', - url: "/" + resource + ".json?random=" + (util.randomBytes(4)), - success: function(page) { - wiki.log('fetch success', page, site || 'origin'); - $(pageElement).data('site', site); - return callback(page); - }, - error: function(xhr, type, msg) { - if (localContext.length > 0) { - return probe(slug, callback, localContext); - } else { - site = null; - return callback(null); - } + probe = function(pageElement, callback, localContext) { + var i, json, resource, site, slug; + slug = pageElement.attr('id'); + site = pageElement.data('site'); + if (pageElement.attr('data-server-generated') === 'true') callback(null); + if (wiki.useLocalStorage() && (json = localStorage[slug])) { + pageElement.addClass("local"); + callback(JSON.parse(json)); + } + if (!(probe.context.length > 0)) probe.context = ['origin']; + if (localContext == null) { + localContext = (function() { + var _i, _len, _ref, _results; + _ref = probe.context; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + i = _ref[_i]; + _results.push(i); } - }); - }; - create = function(slug, callback) { - var page, title; - title = $("a[href=\"/" + slug + ".html\"]").html(); - title || (title = slug); - page = { - title: title - }; - putAction($(pageElement), { - type: 'create', - id: util.randomBytes(8), - item: page - }); - return callback(page); - }; - if ($(pageElement).attr('data-server-generated') === 'true') { - return buildPage(null); - } else { - if (wiki.useLocalStorage() && (json = localStorage[pageElement.attr("id")])) { - pageElement.addClass("local"); - return buildPage(JSON.parse(json)); - } else { - if (site != null) { - return $.get("/remote/" + site + "/" + slug + ".json?random=" + (util.randomBytes(4)), "", function(page) { - return buildPage(page); - }); + return _results; + })(); + } + if (typeof site === 'string') localContext = [site]; + site = localContext.shift(); + resource = site === 'origin' ? (site = null, slug) : "remote/" + site + "/" + slug; + return $.ajax({ + type: 'GET', + dataType: 'json', + url: "/" + resource + ".json?random=" + (util.randomBytes(4)), + success: function(page) { + wiki.log('fetch success', page, site || 'origin'); + $(pageElement).data('site', site); + return callback(page); + }, + error: function(xhr, type, msg) { + var page, title; + if (localContext.length > 0) { + return probe(pageElement, callback, localContext); } else { - return probe(slug, function(page) { - if (page != null) { - return buildPage(page); - } else { - return create(slug, function(page) { - return buildPage(page); - }); - } + site = null; + title = $("a[href=\"/" + slug + ".html\"]").html(); + title || (title = slug); + page = { + title: title + }; + wiki.putAction($(pageElement), { + type: 'create', + id: util.randomBytes(8), + item: page }); + return callback(page); } } - } + }); }; + probe.context = []; + + module.exports = probe; + }).call(this); }); diff --git a/client/lib/fetch.coffee b/client/lib/fetch.coffee index 354062a5..57b7b0c7 100644 --- a/client/lib/fetch.coffee +++ b/client/lib/fetch.coffee @@ -1,55 +1,43 @@ util = require('./util') -module.exports = (params) -> - {buildPage, putAction, pageElement} = params - slug = $(pageElement).attr('id') - site = $(pageElement).data('site') +probe = (pageElement, callback, localContext) -> + slug = pageElement.attr('id') + site = pageElement.data('site') + if pageElement.attr('data-server-generated') == 'true' + callback null + if wiki.useLocalStorage() and json = localStorage[slug] + pageElement.addClass("local") + callback JSON.parse(json) + probe.context = ['origin'] unless probe.context.length > 0 + localContext ?= (i for own i in probe.context) + if typeof site is 'string' + localContext = [site] + site = localContext.shift() + resource = if site=='origin' + site = null + slug + else + "remote/#{site}/#{slug}" + $.ajax + type: 'GET' + dataType: 'json' + url: "/#{resource}.json?random=#{util.randomBytes(4)}" + success: (page) -> + wiki.log 'fetch success', page, site || 'origin' + $(pageElement).data('site', site) + callback(page) + error: (xhr, type, msg) -> + if localContext.length > 0 + probe pageElement, callback, localContext + else + site = null + title = $("""a[href="/#{slug}.html"]""").html() + title or= slug + page = {title} + wiki.putAction $(pageElement), {type: 'create', id: util.randomBytes(8), item: page} + callback page - probe = (slug, callback, localContext) -> - wiki.fetchContext = ['origin'] unless wiki.fetchContext.length > 0 - localContext ?= (i for own i in wiki.fetchContext) - site = localContext.shift() - resource = if site=='origin' - site = null - slug - else - "remote/#{site}/#{slug}" - $.ajax - type: 'GET' - dataType: 'json' - url: "/#{resource}.json?random=#{util.randomBytes(4)}" - success: (page) -> - wiki.log 'fetch success', page, site || 'origin' - $(pageElement).data('site', site) - callback(page) - error: (xhr, type, msg) -> - if localContext.length > 0 - probe slug, callback, localContext - else - site = null - callback(null) +probe.context = [] - create = (slug, callback) -> - title = $("""a[href="/#{slug}.html"]""").html() - title or= slug - page = {title} - putAction $(pageElement), {type: 'create', id: util.randomBytes(8), item: page} - callback page +module.exports = probe - if $(pageElement).attr('data-server-generated') == 'true' - buildPage null - else - if wiki.useLocalStorage() and json = localStorage[pageElement.attr("id")] - pageElement.addClass("local") - buildPage JSON.parse(json) - else - if site? - $.get "/remote/#{site}/#{slug}.json?random=#{util.randomBytes(4)}", "", (page) -> - buildPage page - else - probe slug, (page) -> - if page? - buildPage page - else - create slug, (page) -> - buildPage page diff --git a/client/lib/legacy.coffee b/client/lib/legacy.coffee index b0cb0d52..5d4efebd 100644 --- a/client/lib/legacy.coffee +++ b/client/lib/legacy.coffee @@ -31,7 +31,6 @@ $ -> null wiki.resolutionContext = [] - wiki.fetchContext = [] resolveFrom = wiki.resolveFrom = (addition, callback) -> wiki.resolutionContext.push addition try @@ -252,11 +251,8 @@ $ -> initDragging pageElement initAddButton pageElement - fetch({ - buildPage - putAction - pageElement - }) + fetch pageElement, buildPage + LEFTARROW = 37 RIGHTARROW = 39 @@ -303,8 +299,8 @@ $ -> .delegate '.internal', 'click', (e) -> e.preventDefault() name = $(e.target).data 'pageName' - wiki.fetchContext = $(e.target).attr('title').split(' => ') - wiki.log 'click', name, 'context', wiki.fetchContext + fetch.context = $(e.target).attr('title').split(' => ') + wiki.log 'click', name, 'context', fetch.context $(e.target).parents('.page').nextAll().remove() unless e.shiftKey createPage(name).appendTo('.main').each refresh active.set($('.page').last()) diff --git a/client/test/fetch.coffee b/client/test/fetch.coffee new file mode 100644 index 00000000..ef5cd305 --- /dev/null +++ b/client/test/fetch.coffee @@ -0,0 +1,51 @@ +fetch = require '../lib/fetch.coffee' + +#Fakes for things still stuck in legacy.coffee +wiki.useLocalStorage = -> false +wiki.putAction = -> + +describe 'fetch', -> + before -> + $('
').appendTo('body') + + describe 'ajax fails', -> + it 'should have an empty context', -> + expect(fetch.context).to.eql([]) + + it 'should create a page when it can not find it', (done) -> + fetch $('#fetch'), (page) -> + expect(page).to.eql({title: 'fetch'}) + done() + + describe 'ajax, success', -> + before -> + sinon.stub(jQuery, "ajax").yieldsTo('success', 'test') + + it 'should fetch a page from specific site', (done) -> + fetch $('#fetch'), (page) -> + expect(jQuery.ajax.calledOnce).to.be.true + expect(jQuery.ajax.args[0][0]).to.have.property('type', 'GET') + expect(jQuery.ajax.args[0][0].url).to.match(///^/remote/foo/fetch\.json\?random=[a-z0-9]{8}$///) + done() + + after -> + jQuery.ajax.restore() + + describe 'ajax, search', -> + before -> + $('
').appendTo('body') + sinon.stub(jQuery, "ajax").yieldsTo('error') + fetch.context = ['origin', 'example.com', 'asdf.test', 'foo.bar'] + + it 'should search through the context for a page', (done) -> + fetch $('#fetch2'), (page) -> + expect(jQuery.ajax.args[0][0].url).to.match(///^/fetch2\.json\?random=[a-z0-9]{8}$///) + expect(jQuery.ajax.args[1][0].url).to.match(///^/remote/example.com/fetch2\.json\?random=[a-z0-9]{8}$///) + expect(jQuery.ajax.args[2][0].url).to.match(///^/remote/asdf.test/fetch2\.json\?random=[a-z0-9]{8}$///) + expect(jQuery.ajax.args[3][0].url).to.match(///^/remote/foo.bar/fetch2\.json\?random=[a-z0-9]{8}$///) + done() + + after -> + jQuery.ajax.restore() + + diff --git a/client/test/plugin.coffee b/client/test/plugin.coffee index d6c8078a..2f989dc8 100644 --- a/client/test/plugin.coffee +++ b/client/test/plugin.coffee @@ -23,5 +23,5 @@ describe 'plugin', -> .be('

blah Link asdf

') after -> - jQuery.ajax.restore() + jQuery.getScript.restore() diff --git a/client/test/testclient.js b/client/test/testclient.js index 787a28bf..25f88f5d 100644 --- a/client/test/testclient.js +++ b/client/test/testclient.js @@ -536,6 +536,146 @@ require.define("/lib/active.coffee", function (require, module, exports, __dirna }); +require.define("/test/fetch.coffee", function (require, module, exports, __dirname, __filename) { +(function() { + var fetch; + + fetch = require('../lib/fetch.coffee'); + + wiki.useLocalStorage = function() { + return false; + }; + + wiki.putAction = function() {}; + + describe('fetch', function() { + before(function() { + return $('
').appendTo('body'); + }); + describe('ajax fails', function() { + it('should have an empty context', function() { + return expect(fetch.context).to.eql([]); + }); + return it('should create a page when it can not find it', function(done) { + return fetch($('#fetch'), function(page) { + expect(page).to.eql({ + title: 'fetch' + }); + return done(); + }); + }); + }); + describe('ajax, success', function() { + before(function() { + return sinon.stub(jQuery, "ajax").yieldsTo('success', 'test'); + }); + it('should fetch a page from specific site', function(done) { + return fetch($('#fetch'), function(page) { + expect(jQuery.ajax.calledOnce).to.be["true"]; + expect(jQuery.ajax.args[0][0]).to.have.property('type', 'GET'); + expect(jQuery.ajax.args[0][0].url).to.match(/^\/remote\/foo\/fetch\.json\?random=[a-z0-9]{8}$/); + return done(); + }); + }); + return after(function() { + return jQuery.ajax.restore(); + }); + }); + return describe('ajax, search', function() { + before(function() { + $('
').appendTo('body'); + sinon.stub(jQuery, "ajax").yieldsTo('error'); + return fetch.context = ['origin', 'example.com', 'asdf.test', 'foo.bar']; + }); + it('should search through the context for a page', function(done) { + return fetch($('#fetch2'), function(page) { + expect(jQuery.ajax.args[0][0].url).to.match(/^\/fetch2\.json\?random=[a-z0-9]{8}$/); + expect(jQuery.ajax.args[1][0].url).to.match(/^\/remote\/example.com\/fetch2\.json\?random=[a-z0-9]{8}$/); + expect(jQuery.ajax.args[2][0].url).to.match(/^\/remote\/asdf.test\/fetch2\.json\?random=[a-z0-9]{8}$/); + expect(jQuery.ajax.args[3][0].url).to.match(/^\/remote\/foo.bar\/fetch2\.json\?random=[a-z0-9]{8}$/); + return done(); + }); + }); + return after(function() { + return jQuery.ajax.restore(); + }); + }); + }); + +}).call(this); + +}); + +require.define("/lib/fetch.coffee", function (require, module, exports, __dirname, __filename) { +(function() { + var probe, util; + + util = require('./util'); + + probe = function(pageElement, callback, localContext) { + var i, json, resource, site, slug; + slug = pageElement.attr('id'); + site = pageElement.data('site'); + if (pageElement.attr('data-server-generated') === 'true') callback(null); + if (wiki.useLocalStorage() && (json = localStorage[slug])) { + pageElement.addClass("local"); + callback(JSON.parse(json)); + } + if (!(probe.context.length > 0)) probe.context = ['origin']; + if (localContext == null) { + localContext = (function() { + var _i, _len, _ref, _results; + _ref = probe.context; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + i = _ref[_i]; + _results.push(i); + } + return _results; + })(); + } + if (typeof site === 'string') localContext = [site]; + site = localContext.shift(); + resource = site === 'origin' ? (site = null, slug) : "remote/" + site + "/" + slug; + return $.ajax({ + type: 'GET', + dataType: 'json', + url: "/" + resource + ".json?random=" + (util.randomBytes(4)), + success: function(page) { + wiki.log('fetch success', page, site || 'origin'); + $(pageElement).data('site', site); + return callback(page); + }, + error: function(xhr, type, msg) { + var page, title; + if (localContext.length > 0) { + return probe(pageElement, callback, localContext); + } else { + site = null; + title = $("a[href=\"/" + slug + ".html\"]").html(); + title || (title = slug); + page = { + title: title + }; + wiki.putAction($(pageElement), { + type: 'create', + id: util.randomBytes(8), + item: page + }); + return callback(page); + } + } + }); + }; + + probe.context = []; + + module.exports = probe; + +}).call(this); + +}); + require.define("/test/plugin.coffee", function (require, module, exports, __dirname, __filename) { (function() { var plugin; @@ -567,7 +707,7 @@ require.define("/test/plugin.coffee", function (require, module, exports, __dirn return expect($('#plugin').html()).to.be('

blah Link asdf

'); }); return after(function() { - return jQuery.ajax.restore(); + return jQuery.getScript.restore(); }); }); @@ -716,6 +856,7 @@ require.define("/testclient.coffee", function (require, module, exports, __dirna $(function() { require('./test/util.coffee'); require('./test/active.coffee'); + require('./test/fetch.coffee'); require('./test/plugin.coffee'); return mocha.run(); }); diff --git a/client/testclient.coffee b/client/testclient.coffee index ad9a1b70..77e633ce 100644 --- a/client/testclient.coffee +++ b/client/testclient.coffee @@ -5,10 +5,10 @@ window.wiki = {} wiki.log = (things...) -> console.log things if console?.log? - $ -> require('./test/util.coffee') require('./test/active.coffee') + require('./test/fetch.coffee') require('./test/plugin.coffee') mocha.run()