PageRenderTime 25ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/test/AttributesMixinCreator-test.js

https://bitbucket.org/atlassian/backbone-brace
JavaScript | 334 lines | 289 code | 45 blank | 0 comment | 0 complexity | e978b599754d56020fa1c19c4e956aff MD5 | raw file
Possible License(s): Apache-2.0
  1. module("Brace.AttributesMixinCreator");
  2. test("Getter and setter are added to model", function() {
  3. var MaleModel = Brace.Model.extend({
  4. namedAttributes: ["look"]
  5. });
  6. var zoolander = new MaleModel();
  7. ok(zoolander.getLook);
  8. ok(zoolander.setLook);
  9. zoolander.setLook("Blue Steel");
  10. equal(zoolander.get("look"), "Blue Steel");
  11. equal(zoolander.getLook(), "Blue Steel");
  12. });
  13. test("ID attribute is always added to namedAttributes", function() {
  14. var MaleModel = Brace.Model.extend({
  15. namedAttributes: ["look"]
  16. });
  17. var zoolander = new MaleModel();
  18. deepEqual(zoolander.namedAttributes, { "id" : null, "look" : null });
  19. ok(zoolander.getId);
  20. ok(zoolander.setId);
  21. });
  22. test("Does not barf when user specifies id", function() {
  23. var MaleModel = Brace.Model.extend({
  24. namedAttributes: ["id", "look"]
  25. });
  26. var zoolander = new MaleModel();
  27. deepEqual(zoolander.namedAttributes, { "id" : null, "look" : null });
  28. ok(zoolander.getId);
  29. ok(zoolander.setId);
  30. });
  31. test("ID attribute is not added if model does not specify namedAttributes", function() {
  32. var MaleModel = Brace.Model.extend();
  33. var zoolander = new MaleModel();
  34. ok(!zoolander.namedAttributes);
  35. ok(!zoolander.getId);
  36. ok(!zoolander.setId);
  37. });
  38. test("Setting namedAttributes that does not exist fails", function() {
  39. var MaleModel = Brace.Model.extend({
  40. namedAttributes: ["look"]
  41. });
  42. var zoolander = new MaleModel();
  43. raises(function() {
  44. zoolander.set({
  45. mer: "man"
  46. });
  47. });
  48. });
  49. test("Setting attribute that does not exist fails", function() {
  50. var MaleModel = Brace.Model.extend({
  51. namedAttributes: ["look"]
  52. });
  53. var zoolander = new MaleModel();
  54. raises(function() {
  55. zoolander.set("mer", "man");
  56. });
  57. });
  58. test("Getting attribute that does not exist fails", function() {
  59. var MaleModel = Brace.Model.extend({
  60. namedAttributes: ["look"]
  61. });
  62. var zoolander = new MaleModel();
  63. raises(function() {
  64. zoolander.get("eugooglize");
  65. });
  66. });
  67. test("Default set and get work", function() {
  68. var MaleModel = Brace.Model.extend({
  69. namedAttributes: ["look"]
  70. });
  71. var zoolander = new MaleModel();
  72. zoolander.set("look", "Le Tigre");
  73. equal(zoolander.get("look"), "Le Tigre");
  74. });
  75. test("Setting any attribute when no property exists succeeds", function() {
  76. expect(0);
  77. var MaleModel = Brace.Model.extend();
  78. var hansel = new MaleModel();
  79. hansel.set("derelique");
  80. });
  81. test("Getting any attribute when no property exists succeeds", function() {
  82. expect(0);
  83. var MaleModel = Brace.Model.extend();
  84. var hansel = new MaleModel();
  85. hansel.get("derelique");
  86. });
  87. test("Mixin can apply namedAttributes to model with no namedAttributes", function() {
  88. var MyMixin = {
  89. namedAttributes: ["someAttribute"]
  90. };
  91. var MyModel = Brace.Model.extend({
  92. mixins: [MyMixin]
  93. });
  94. var myModel = new MyModel();
  95. deepEqual(myModel.namedAttributes, { "id" : null, "someAttribute" : null });
  96. ok(myModel.getSomeAttribute);
  97. ok(myModel.setSomeAttribute);
  98. });
  99. test("Mixin can apply namedAttributes to model with some namedAttributes", function() {
  100. var MyMixin = {
  101. namedAttributes: ["someAttribute"]
  102. };
  103. var MyModel = Brace.Model.extend({
  104. mixins: [MyMixin],
  105. namedAttributes: ["someOtherAttribute"]
  106. });
  107. var myModel = new MyModel();
  108. deepEqual(myModel.namedAttributes, { "id" : null, "someAttribute" : null, "someOtherAttribute" : null });
  109. ok(myModel.getSomeOtherAttribute);
  110. ok(myModel.setSomeOtherAttribute);
  111. ok(myModel.getSomeAttribute);
  112. ok(myModel.setSomeAttribute);
  113. });
  114. test("Mixin can apply typed namedAttributes to model with some namedAttributes", function() {
  115. var MyMixin = {
  116. namedAttributes: {
  117. "someAttribute" : String
  118. }
  119. };
  120. var MyModel = Brace.Model.extend({
  121. mixins: [MyMixin],
  122. namedAttributes: ["someOtherAttribute"]
  123. });
  124. var myModel = new MyModel();
  125. deepEqual(myModel.namedAttributes, { "id" : null, "someAttribute" : String, "someOtherAttribute" : null });
  126. ok(myModel.getSomeOtherAttribute);
  127. ok(myModel.setSomeOtherAttribute);
  128. ok(myModel.getSomeAttribute);
  129. ok(myModel.setSomeAttribute);
  130. });
  131. test("Mixin can apply namedAttributes to model with some typed namedAttributes", function() {
  132. var MyMixin = {
  133. namedAttributes: ["someAttribute"]
  134. };
  135. var MyModel = Brace.Model.extend({
  136. mixins: [MyMixin],
  137. namedAttributes: {
  138. "someOtherAttribute" : String
  139. }
  140. });
  141. var myModel = new MyModel();
  142. deepEqual(myModel.namedAttributes, { "id" : null, "someAttribute" : null, "someOtherAttribute" : String });
  143. ok(myModel.getSomeOtherAttribute);
  144. ok(myModel.setSomeOtherAttribute);
  145. ok(myModel.getSomeAttribute);
  146. ok(myModel.setSomeAttribute);
  147. });
  148. test("Mixin can apply typed namedAttributes to model with some typed namedAttributes", function() {
  149. var MyMixin = {
  150. namedAttributes: {
  151. "someAttribute" : String
  152. }
  153. };
  154. var MyModel = Brace.Model.extend({
  155. mixins: [MyMixin],
  156. namedAttributes: {
  157. "someOtherAttribute" : String
  158. }
  159. });
  160. var myModel = new MyModel();
  161. deepEqual(myModel.namedAttributes, { "id" : null, "someAttribute" : String, "someOtherAttribute" : String });
  162. ok(myModel.getSomeOtherAttribute);
  163. ok(myModel.setSomeOtherAttribute);
  164. ok(myModel.getSomeAttribute);
  165. ok(myModel.setSomeAttribute);
  166. });
  167. test("Mixin with nonconflicting attributes types will pass", function() {
  168. var mixinAttr5 = Brace.Collection.extend();
  169. var modelAttr5 = mixinAttr5.extend();
  170. var modelAttr6 = Brace.Collection.extend();
  171. var mixinAttr6 = modelAttr6.extend();
  172. var MixinAttr7 = function() {};
  173. var ModelAttr7 = function() {};
  174. ModelAttr7.prototype = new MixinAttr7();
  175. var MyMixin = {
  176. namedAttributes: {
  177. "someAttribute" : String,
  178. "attr2" : [ 'string' ],
  179. "attr3" : Array,
  180. "attr4" : [],
  181. "attr5" : mixinAttr5,
  182. "attr6" : mixinAttr6,
  183. "attr7" : MixinAttr7
  184. }
  185. };
  186. var MyModel = Brace.Model.extend({
  187. mixins: [MyMixin],
  188. namedAttributes: {
  189. "someAttribute" : String,
  190. "attr2" : [],
  191. "attr3" : ['string'],
  192. "attr4" : [],
  193. "attr5" : modelAttr5,
  194. "attr6" : modelAttr6,
  195. "attr7" : ModelAttr7
  196. }
  197. });
  198. var myModel = new MyModel();
  199. deepEqual(myModel.namedAttributes, {
  200. "id" : null,
  201. "someAttribute" : String,
  202. "attr2" : [ 'string' ],
  203. "attr3" : [ 'string' ],
  204. "attr4" : [],
  205. "attr5" : modelAttr5,
  206. "attr6" : mixinAttr6,
  207. "attr7" : ModelAttr7
  208. });
  209. ok(myModel.getSomeAttribute);
  210. ok(myModel.setSomeAttribute);
  211. });
  212. (function() {
  213. function conflictedTypesTest(mixinType, modelType) {
  214. var MyMixin = {
  215. namedAttributes: {
  216. "someAttribute" : mixinType
  217. }
  218. };
  219. raises(function() {
  220. Brace.Model.extend({
  221. mixins: [MyMixin],
  222. namedAttributes: {
  223. "someAttribute" : modelType
  224. }
  225. });
  226. });
  227. }
  228. test("Mixin with conflicting namedAttributes types will throw", function() {
  229. conflictedTypesTest(Date, String);
  230. conflictedTypesTest('number', Number);
  231. conflictedTypesTest(Backbone.Collection.extend(), Backbone.Collection.extend());
  232. conflictedTypesTest(Array, Backbone.Collection.extend());
  233. conflictedTypesTest(['string'], ['number']);
  234. });
  235. }());
  236. test("Children inherit their parents namedAttributes", function() {
  237. var MyParentModel = Brace.Model.extend({
  238. namedAttributes: ["someAttribute"]
  239. });
  240. var MyModel = MyParentModel.extend({
  241. namedAttributes: ["someOtherAttribute"]
  242. });
  243. var myModel = new MyModel();
  244. var actual = myModel.namedAttributes;
  245. var expected = { "id": null, "someOtherAttribute": null, "someAttribute": null};
  246. deepEqual(actual, expected);
  247. ok(myModel.getSomeOtherAttribute);
  248. ok(myModel.setSomeOtherAttribute);
  249. ok(myModel.getSomeAttribute);
  250. ok(myModel.setSomeAttribute);
  251. });
  252. test("Children inherit their ancestors namedAttributes", function() {
  253. var MyParentParentModel = Brace.Model.extend({
  254. namedAttributes: ["someAttribute"]
  255. });
  256. var MyParentModel = MyParentParentModel.extend();
  257. var MyModel = MyParentModel.extend({
  258. namedAttributes: ["someOtherAttribute"]
  259. });
  260. var myModel = new MyModel();
  261. var actual = myModel.namedAttributes;
  262. var expected = { "id": null, "someOtherAttribute": null, "someAttribute": null};
  263. deepEqual(actual, expected);
  264. ok(myModel.getSomeOtherAttribute);
  265. ok(myModel.setSomeOtherAttribute);
  266. ok(myModel.getSomeAttribute);
  267. ok(myModel.setSomeAttribute);
  268. });
  269. test("Children inherit their parents and ancestors namedAttributes", function() {
  270. var MyParentParentModel = Brace.Model.extend({
  271. namedAttributes: ["someAttribute"]
  272. });
  273. var MyParentModel = MyParentParentModel.extend({
  274. namedAttributes: ["someKindOfAttribute"]
  275. });
  276. var MyModel = MyParentModel.extend({
  277. namedAttributes: ["someOtherAttribute"]
  278. });
  279. var myModel = new MyModel();
  280. var actual = myModel.namedAttributes;
  281. var expected = { "id": null, "someKindOfAttribute": null, "someOtherAttribute": null, "someAttribute": null};
  282. deepEqual(actual, expected);
  283. ok(myModel.getSomeOtherAttribute);
  284. ok(myModel.setSomeOtherAttribute);
  285. ok(myModel.getSomeKindOfAttribute);
  286. ok(myModel.setSomeKindOfAttribute);
  287. ok(myModel.getSomeAttribute);
  288. ok(myModel.setSomeAttribute);
  289. });