|
|
@@ -0,0 +1,208 @@
|
|
|
+(function() {
|
|
|
+ var SandboxedModule, chai, expect, modulePath, sinon;
|
|
|
+
|
|
|
+ sinon = require('sinon');
|
|
|
+
|
|
|
+ chai = require('chai');
|
|
|
+
|
|
|
+ expect = chai.expect;
|
|
|
+
|
|
|
+ chai.should();
|
|
|
+
|
|
|
+ SandboxedModule = require('sandboxed-module');
|
|
|
+
|
|
|
+ modulePath = require('path').join(__dirname, '../../../app/js/SpellingAPIManager');
|
|
|
+
|
|
|
+ describe("SpellingAPIManager", function() {
|
|
|
+ beforeEach(function() {
|
|
|
+ this.token = "user-id-123";
|
|
|
+ this.ASpell = {};
|
|
|
+ this.learnedWords = ["lerned"];
|
|
|
+ this.LearnedWordsManager = {
|
|
|
+ getLearnedWords: sinon.stub().callsArgWith(1, null, this.learnedWords),
|
|
|
+ learnWord: sinon.stub().callsArg(2)
|
|
|
+ };
|
|
|
+ return this.SpellingAPIManager = SandboxedModule.require(modulePath, {
|
|
|
+ requires: {
|
|
|
+ "./ASpell": this.ASpell,
|
|
|
+ "./LearnedWordsManager": this.LearnedWordsManager
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe("runRequest", function() {
|
|
|
+ beforeEach(function() {
|
|
|
+ this.nonLearnedWords = ["some", "words", "htat", "are", "speled", "rong", "lerned"];
|
|
|
+ this.allWords = this.nonLearnedWords.concat(this.learnedWords);
|
|
|
+ this.misspellings = [
|
|
|
+ {
|
|
|
+ index: 2,
|
|
|
+ suggestions: ["that"]
|
|
|
+ }, {
|
|
|
+ index: 4,
|
|
|
+ suggestions: ["spelled"]
|
|
|
+ }, {
|
|
|
+ index: 5,
|
|
|
+ suggestions: ["wrong", "ring"]
|
|
|
+ }, {
|
|
|
+ index: 6,
|
|
|
+ suggestions: ["learned"]
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ this.misspellingsWithoutLearnedWords = this.misspellings.slice(0, 3);
|
|
|
+ this.ASpell.checkWords = (function(_this) {
|
|
|
+ return function(lang, word, callback) {
|
|
|
+ return callback(null, _this.misspellings);
|
|
|
+ };
|
|
|
+ })(this);
|
|
|
+ return sinon.spy(this.ASpell, "checkWords");
|
|
|
+ });
|
|
|
+ describe("with sensible JSON", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ return this.SpellingAPIManager.runRequest(this.token, {
|
|
|
+ words: this.allWords
|
|
|
+ }, (function(_this) {
|
|
|
+ return function(error, result) {
|
|
|
+ _this.result = result;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should return the words that are spelled incorrectly and not learned", function() {
|
|
|
+ return expect(this.result.misspellings).to.deep.equal(this.misspellingsWithoutLearnedWords);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe("with a missing words array", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ return this.SpellingAPIManager.runRequest(this.token, {}, (function(_this) {
|
|
|
+ return function(error, result) {
|
|
|
+ _this.error = error;
|
|
|
+ _this.result = result;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should return an error", function() {
|
|
|
+ return expect(this.error).to.deep.equal(new Error("malformed JSON"));
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe("with a missing token", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ return this.SpellingAPIManager.runRequest(null, {
|
|
|
+ words: this.allWords
|
|
|
+ }, (function(_this) {
|
|
|
+ return function(error, result) {
|
|
|
+ _this.error = error;
|
|
|
+ _this.result = result;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should spell check without using any learned words", function() {
|
|
|
+ return this.LearnedWordsManager.getLearnedWords.called.should.equal(false);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe("without a language", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ return this.SpellingAPIManager.runRequest(this.token, {
|
|
|
+ words: this.allWords
|
|
|
+ }, (function(_this) {
|
|
|
+ return function(error, result) {
|
|
|
+ _this.result = result;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should use en as the default", function() {
|
|
|
+ return this.ASpell.checkWords.calledWith("en").should.equal(true);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe("with a language", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ return this.SpellingAPIManager.runRequest(this.token, {
|
|
|
+ words: this.allWords,
|
|
|
+ language: this.language = "fr"
|
|
|
+ }, (function(_this) {
|
|
|
+ return function(error, result) {
|
|
|
+ _this.result = result;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should use the language", function() {
|
|
|
+ return this.ASpell.checkWords.calledWith(this.language).should.equal(true);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return describe("with a very large collection of words", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ var i;
|
|
|
+ this.manyWords = (function() {
|
|
|
+ var _i, _results;
|
|
|
+ _results = [];
|
|
|
+ for (i = _i = 1; _i <= 100000; i = ++_i) {
|
|
|
+ _results.push("word");
|
|
|
+ }
|
|
|
+ return _results;
|
|
|
+ })();
|
|
|
+ return this.SpellingAPIManager.runRequest(this.token, {
|
|
|
+ words: this.manyWords
|
|
|
+ }, (function(_this) {
|
|
|
+ return function(error, result) {
|
|
|
+ _this.result = result;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should truncate to 10,000 words", function() {
|
|
|
+ return this.ASpell.checkWords.calledWith(sinon.match.any, this.manyWords.slice(0, 10000)).should.equal(true);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return describe("learnWord", function() {
|
|
|
+ describe("without a token", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ return this.SpellingAPIManager.learnWord(null, {
|
|
|
+ word: "banana"
|
|
|
+ }, (function(_this) {
|
|
|
+ return function(error) {
|
|
|
+ _this.error = error;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should return an error", function() {
|
|
|
+ return expect(this.error).to.deep.equal(new Error("malformed JSON"));
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe("without a word", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ return this.SpellingAPIManager.learnWord(this.token, {}, (function(_this) {
|
|
|
+ return function(error) {
|
|
|
+ _this.error = error;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should return an error", function() {
|
|
|
+ return expect(this.error).to.deep.equal(new Error("no token provided"));
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return describe("with a word and a token", function() {
|
|
|
+ beforeEach(function(done) {
|
|
|
+ this.word = "banana";
|
|
|
+ return this.SpellingAPIManager.learnWord(this.token, {
|
|
|
+ word: this.word
|
|
|
+ }, (function(_this) {
|
|
|
+ return function(error) {
|
|
|
+ _this.error = error;
|
|
|
+ return done();
|
|
|
+ };
|
|
|
+ })(this));
|
|
|
+ });
|
|
|
+ return it("should call LearnedWordsManager.learnWord", function() {
|
|
|
+ return this.LearnedWordsManager.learnWord.calledWith(this.token, this.word).should.equal(true);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+}).call(this);
|