diaspora/spec/javascripts/lib/charcounter_spec.js
2016-08-13 03:21:40 +02:00

102 lines
3.6 KiB
JavaScript

describe("$.fn.charCount", function() {
beforeEach(function() {
this.input = $("<textarea></textarea>");
this.counter = $("<div class='charcounter'></div>");
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
this.repeat = function(str, count) {
var rpt = "";
for (;;) {
if ((count & 1) === 1) {
rpt += str;
}
count >>>= 1;
if (count === 0) {
break;
}
str += str;
}
return rpt;
};
});
context("on initialization", function() {
beforeEach(function() {
this.input.val(this.repeat("a", 10));
});
it("shows the correct number of available chars", function() {
this.input.charCount({allowed: 12, warning: 1, counter: this.counter});
expect(this.counter.text()).toEqual("2");
});
it("shows the normal text if there are enough chars left", function() {
this.input.charCount({allowed: 12, warning: 2, counter: this.counter});
expect(this.counter).not.toHaveClass("text-warning");
expect(this.counter).not.toHaveClass("text-danger");
});
it("shows a warning if there almost no chars left", function() {
this.input.charCount({allowed: 12, warning: 3, counter: this.counter});
expect(this.counter).toHaveClass("text-warning");
expect(this.counter).not.toHaveClass("text-danger");
});
it("shows an error if the limit exceeded", function() {
this.input.charCount({allowed: 9, warning: 3, counter: this.counter});
expect(this.counter).not.toHaveClass("text-warning");
expect(this.counter).toHaveClass("text-danger");
});
});
context("on text changes", function() {
it("updates the number of available chars", function() {
this.input.val("a");
this.input.charCount({allowed: 100, warning: 10, counter: this.counter});
expect(this.counter.text()).toEqual("99");
this.input.val(this.repeat("a", 99));
this.input.trigger("textchange");
expect(this.counter.text()).toEqual("1");
this.input.val(this.repeat("a", 102));
this.input.trigger("textchange");
expect(this.counter.text()).toEqual("-2");
this.input.val("");
this.input.trigger("textchange");
expect(this.counter.text()).toEqual("100");
});
it("updates the counter classes", function() {
this.input.val("a");
this.input.charCount({allowed: 100, warning: 10, counter: this.counter});
expect(this.counter).not.toHaveClass("text-warning");
expect(this.counter).not.toHaveClass("text-danger");
this.input.val(this.repeat("a", 90));
this.input.trigger("textchange");
expect(this.counter).not.toHaveClass("text-warning");
expect(this.counter).not.toHaveClass("text-danger");
this.input.val(this.repeat("a", 91));
this.input.trigger("textchange");
expect(this.counter).toHaveClass("text-warning");
expect(this.counter).not.toHaveClass("text-danger");
this.input.val(this.repeat("a", 100));
this.input.trigger("textchange");
expect(this.counter).toHaveClass("text-warning");
expect(this.counter).not.toHaveClass("text-danger");
this.input.val(this.repeat("a", 101));
this.input.trigger("textchange");
expect(this.counter).not.toHaveClass("text-warning");
expect(this.counter).toHaveClass("text-danger");
this.input.val("");
this.input.trigger("textchange");
expect(this.counter).not.toHaveClass("text-warning");
expect(this.counter).not.toHaveClass("text-danger");
});
});
});