diff --git a/node/package.json b/node/package.json index 1d42279..bd2a5a5 100644 --- a/node/package.json +++ b/node/package.json @@ -1,5 +1,5 @@ { "name": "vanity", - "version": "0.2.2", + "version": "0.3.0", "description": "Vanity Node.js client", "author": "Assaf Arkin (http://labnotes.org/)", "main": "vanity", diff --git a/node/test/split_test.coffee b/node/test/split_test.coffee index 7df7bd0..83dd202 100644 --- a/node/test/split_test.coffee +++ b/node/test/split_test.coffee @@ -95,6 +95,94 @@ describe "split", -> done() + # -- Completing split test -- + + describe "add participant and complete", -> + outcome = null + + describe "no value", -> + before (done)-> + split.show("79d778d8") + split.completed "79d778d8", (error, result)-> + outcome = result + done() + + it "should set outcome to zero", -> + assert.equal outcome, 0 + + it "should store alternative", (done)-> + split.get "79d778d8", (error, { joined, alternative })-> + assert.equal alternative, 0 + assert joined - Date.now() < 1000 + done() + + it "should store outcome", (done)-> + split.get "79d778d8", (error, { completed, outcome })-> + assert.equal outcome, 0 + assert completed - Date.now() < 1000 + done() + + + describe "with value", -> + before (done)-> + split.show("23c5b1da") + split.completed "23c5b1da", 5, (error, result)-> + outcome = result + done() + + it "should set outcome to five", -> + assert.equal outcome, 5 + + it "should store outcome", (done)-> + split.get "23c5b1da", (error, { completed, outcome })-> + assert.equal outcome, 5 + assert completed - Date.now() < 1000 + done() + + + describe "just complete", -> + outcome = null + + before (done)-> + split.completed "163b06c0", (error, result)-> + outcome = result + done() + + it "should set outcome to zero", -> + assert.equal outcome, 0 + + it "should store alternative", (done)-> + split.get "163b06c0", (error, { joined, alternative })-> + assert.equal alternative, 1 + assert joined - Date.now() < 1000 + done() + + it "should store outcome", (done)-> + split.get "163b06c0", (error, { completed, outcome })-> + assert.equal outcome, 0 + assert completed - Date.now() < 1000 + done() + + + describe "two completions", -> + outcome = null + + before (done)-> + split.completed "3f8aab31", 7, (error, result)-> + split.completed "3f8aab31", 9, (error, result)-> + outcome = result + done() + + it "should set outcome to first value", -> + assert.equal outcome, 7 + + it "should store first value", (done)-> + split.get "3f8aab31", (error, { completed, outcome })-> + assert.equal outcome, 7 + assert completed - Date.now() < 1000 + done() + + # -- Error handling -- describe "invalid test name", -> diff --git a/node/vanity.js b/node/vanity.js index ddc08ee..a8bad2c 100644 --- a/node/vanity.js +++ b/node/vanity.js @@ -265,7 +265,10 @@ SplitTest.prototype.get = function(participant, callback) { var result; if (body) { result = JSON.parse(body); - result.joined = new Date(result.joined); + if (result.joined) + result.joined = new Date(result.joined); + if (result.completed) + result.completed = new Date(result.completed); } callback(error, result); }) @@ -286,21 +289,29 @@ SplitTest.hash = function(identifier) { } -/* -SplitTest.prototype.completed = function(participant, outcome) { - var params = { - alernative: alernative; - outcome: outcome; +SplitTest.prototype.completed = function(participant, outcome, callback) { + if (typeof(outcome) == "function") { + callback = outcome; + outcome = 0; } - Request.put({ url: this.baseUrl + participant }, json: params, function(error, response, body) { - if (error) - self.emit("error", error) - else if (response.statusCode >= 400) - self.emit("error", new Error("Server returned " + response.statusCode + ": " + body)); + + var cached = this._cache[participant], + params = { + alternative: (cached == undefined ? (SplitTest.hash(participant) % this.alternatives) : cached), + outcome: outcome + }; + Request.put({ url: this.baseUrl + participant, json: params }, function(error, response, body) { + // There are protocol errors (error) and server reported errors (4xx and + // 5xx). + if (!error && response.statusCode >= 400) + error = new Error("Server returned " + response.statusCode + ": " + body); + if (callback) + callback(error, body && body.outcome) + else if (error) + vanity.emit("error", error) }) } -*/ module.exports = Vanity