ende 0.5.20 → 0.5.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/component.json +1 -1
  3. data/components/indefinido/indemma/master/.gitignore +17 -0
  4. data/components/indefinido/indemma/master/.ruby-gemset +1 -0
  5. data/components/indefinido/indemma/master/.ruby-version +1 -0
  6. data/components/indefinido/indemma/master/Gemfile +12 -0
  7. data/components/indefinido/indemma/master/Guardfile +39 -0
  8. data/components/indefinido/indemma/master/History.md +0 -0
  9. data/components/indefinido/indemma/master/Readme.md +445 -0
  10. data/components/indefinido/indemma/master/build/development.js +26123 -0
  11. data/components/indefinido/indemma/master/build/release.js +16741 -0
  12. data/components/indefinido/indemma/master/build/test.js +26123 -0
  13. data/components/indefinido/indemma/master/component.json +1 -1
  14. data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/component.json +18 -0
  15. data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/index.js +110 -0
  16. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.gitignore +22 -0
  17. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.mailmap +1 -0
  18. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.npmignore +14 -0
  19. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.travis.yml +14 -0
  20. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/CONTRIBUTING.md +173 -0
  21. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/History.md +895 -0
  22. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/Makefile +93 -0
  23. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/README.md +99 -0
  24. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/ReleaseNotes.md +482 -0
  25. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/bower.json +27 -0
  26. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/chai.js +4782 -0
  27. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/component.json +50 -0
  28. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/index.js +1 -0
  29. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.conf.js +28 -0
  30. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.sauce.js +41 -0
  31. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/assertion.js +130 -0
  32. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/config.js +50 -0
  33. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/core/assertions.js +1314 -0
  34. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/assert.js +1056 -0
  35. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/expect.js +12 -0
  36. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/should.js +78 -0
  37. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addChainableMethod.js +111 -0
  38. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addMethod.js +43 -0
  39. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addProperty.js +40 -0
  40. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/flag.js +32 -0
  41. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getActual.js +18 -0
  42. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getEnumerableProperties.js +25 -0
  43. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getMessage.js +49 -0
  44. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getName.js +20 -0
  45. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getPathValue.js +102 -0
  46. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getProperties.js +35 -0
  47. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/index.js +114 -0
  48. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/inspect.js +320 -0
  49. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/objDisplay.js +49 -0
  50. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteChainableMethod.js +53 -0
  51. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteMethod.js +51 -0
  52. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteProperty.js +54 -0
  53. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/test.js +26 -0
  54. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/transferFlags.js +44 -0
  55. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/type.js +45 -0
  56. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai.js +87 -0
  57. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/package.json +42 -0
  58. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/sauce.browsers.js +128 -0
  59. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_block.sh +7 -0
  60. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_setup.sh +53 -0
  61. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/assert.js +638 -0
  62. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/auth/.gitkeep +0 -0
  63. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/index.js +22 -0
  64. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/karma.js +22 -0
  65. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/configuration.js +133 -0
  66. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/errors.js +14 -0
  67. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/message.js +47 -0
  68. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/expect.js +814 -0
  69. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/globalShould.js +15 -0
  70. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/plugins.js +24 -0
  71. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/should.js +744 -0
  72. data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/utilities.js +309 -0
  73. data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/component.json +20 -0
  74. data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/lib/eql.js +257 -0
  75. data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/component.json +18 -0
  76. data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/lib/type.js +142 -0
  77. data/components/indefinido/indemma/master/components/component/bind/1.0.0/component.json +14 -0
  78. data/components/indefinido/indemma/master/components/component/bind/1.0.0/index.js +23 -0
  79. data/components/indefinido/indemma/master/components/component/jquery/1.0.0/component.json +10 -0
  80. data/components/indefinido/indemma/master/components/component/jquery/1.0.0/index.js +10308 -0
  81. data/components/indefinido/indemma/master/components/component/type/1.0.0/component.json +20 -0
  82. data/components/indefinido/indemma/master/components/component/type/1.0.0/index.js +32 -0
  83. data/components/indefinido/indemma/master/components/indefinido/advisable/master/component.json +21 -0
  84. data/components/indefinido/indemma/master/components/indefinido/advisable/master/index.js +1 -0
  85. data/components/indefinido/indemma/master/components/indefinido/advisable/master/lib/advisable.js +60 -0
  86. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/component.json +39 -0
  87. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/index.js +1 -0
  88. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/adapters/rivets.js +40 -0
  89. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/notifierable.js +145 -0
  90. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/schedulerable.js +147 -0
  91. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/lookup.js +38 -0
  92. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/keypath_observer.js +38 -0
  93. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/observation.js +45 -0
  94. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/selection.js +57 -0
  95. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/self_observer.js +38 -0
  96. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable.js +97 -0
  97. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/platform.js +12 -0
  98. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/observe-js/observe.js +1631 -0
  99. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors-legacy.js +92 -0
  100. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors.js +248 -0
  101. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/array.indexOf.js +8 -0
  102. data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/object.create.js +77 -0
  103. data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/component.json +25 -0
  104. data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/dist/assimilate.js +127 -0
  105. data/components/indefinido/indemma/master/karma.conf.js +75 -0
  106. data/components/indefinido/indemma/master/lib/record/associable.js +4 -2
  107. data/components/indefinido/indemma/master/lib/record/dirtyable.js +1 -1
  108. data/components/indefinido/indemma/master/package.json +9 -0
  109. data/components/indefinido/indemma/master/spec/record/associable_spec.js +211 -0
  110. data/components/indefinido/indemma/master/spec/record/dirtyable_spec.js +57 -0
  111. data/components/indefinido/indemma/master/spec/record/maid_spec.js +40 -0
  112. data/components/indefinido/indemma/master/spec/record/persistable_spec.js +46 -0
  113. data/components/indefinido/indemma/master/spec/record/queryable_spec.js +39 -0
  114. data/components/indefinido/indemma/master/spec/record/resource_spec.js +93 -0
  115. data/components/indefinido/indemma/master/spec/record/rest_spec.js +32 -0
  116. data/components/indefinido/indemma/master/spec/record/restfulable_spec.js +346 -0
  117. data/components/indefinido/indemma/master/spec/record/scopable_spec.js +242 -0
  118. data/components/indefinido/indemma/master/spec/record/storable_spec.js +44 -0
  119. data/components/indefinido/indemma/master/spec/record/translationable.js +28 -0
  120. data/components/indefinido/indemma/master/spec/record/validatable_spec.js +142 -0
  121. data/components/indefinido/indemma/master/spec/record/validations/associated_spec.js +43 -0
  122. data/components/indefinido/indemma/master/spec/record/validations/confirmation_spec.js +36 -0
  123. data/components/indefinido/indemma/master/spec/record/validations/cpf_spec.js +34 -0
  124. data/components/indefinido/indemma/master/spec/record/validations/presence_spec.js +28 -0
  125. data/components/indefinido/indemma/master/spec/record/validations/remote_spec.js +87 -0
  126. data/components/indefinido/indemma/master/spec/record/validations/type_spec.js +48 -0
  127. data/components/indefinido/indemma/master/spec/record_spec.js +49 -0
  128. data/components/indefinido/indemma/master/spec/spec_helper.js +15 -0
  129. data/components/indefinido/indemma/master/spec/support/value_objects/phone.js +45 -0
  130. data/components/indefinido/indemma/master/src/lib/extensions/rivets.coffee +17 -0
  131. data/components/indefinido/indemma/master/src/lib/record/associable.coffee +419 -0
  132. data/components/indefinido/indemma/master/src/lib/record/dirtyable.coffee +47 -0
  133. data/components/indefinido/indemma/master/src/lib/record/errors.coffee +20 -0
  134. data/components/indefinido/indemma/master/src/lib/record/maid.coffee +16 -0
  135. data/components/indefinido/indemma/master/src/lib/record/persistable.coffee +34 -0
  136. data/components/indefinido/indemma/master/src/lib/record/queryable.coffee +29 -0
  137. data/components/indefinido/indemma/master/src/lib/record/resource.coffee +107 -0
  138. data/components/indefinido/indemma/master/src/lib/record/rest.coffee +34 -0
  139. data/components/indefinido/indemma/master/src/lib/record/restfulable.coffee +487 -0
  140. data/components/indefinido/indemma/master/src/lib/record/scopable.coffee +279 -0
  141. data/components/indefinido/indemma/master/src/lib/record/storable.coffee +49 -0
  142. data/components/indefinido/indemma/master/src/lib/record/translationable.coffee +18 -0
  143. data/components/indefinido/indemma/master/src/lib/record/validatable.coffee +241 -0
  144. data/components/indefinido/indemma/master/src/lib/record/validations/associated.coffee +34 -0
  145. data/components/indefinido/indemma/master/src/lib/record/validations/confirmation.coffee +17 -0
  146. data/components/indefinido/indemma/master/src/lib/record/validations/cpf.coffee +57 -0
  147. data/components/indefinido/indemma/master/src/lib/record/validations/presence.coffee +16 -0
  148. data/components/indefinido/indemma/master/src/lib/record/validations/remote.coffee +61 -0
  149. data/components/indefinido/indemma/master/src/lib/record/validations/type.coffee +31 -0
  150. data/components/indefinido/indemma/master/src/lib/record/validations/validatorable.coffee +5 -0
  151. data/components/indefinido/indemma/master/src/lib/record.coffee +143 -0
  152. data/components/indefinido/indemma/master/src/spec/record/associable_spec.coffee +205 -0
  153. data/components/indefinido/indemma/master/src/spec/record/dirtyable_spec.coffee +47 -0
  154. data/components/indefinido/indemma/master/src/spec/record/maid_spec.coffee +34 -0
  155. data/components/indefinido/indemma/master/src/spec/record/persistable_spec.coffee +39 -0
  156. data/components/indefinido/indemma/master/src/spec/record/queryable_spec.coffee +33 -0
  157. data/components/indefinido/indemma/master/src/spec/record/resource_spec.coffee +69 -0
  158. data/components/indefinido/indemma/master/src/spec/record/rest_spec.coffee +22 -0
  159. data/components/indefinido/indemma/master/src/spec/record/restfulable_spec.coffee +257 -0
  160. data/components/indefinido/indemma/master/src/spec/record/scopable_spec.coffee +227 -0
  161. data/components/indefinido/indemma/master/src/spec/record/storable_spec.coffee +39 -0
  162. data/components/indefinido/indemma/master/src/spec/record/translationable.coffee +19 -0
  163. data/components/indefinido/indemma/master/src/spec/record/validatable_spec.coffee +127 -0
  164. data/components/indefinido/indemma/master/src/spec/record/validations/associated_spec.coffee +35 -0
  165. data/components/indefinido/indemma/master/src/spec/record/validations/confirmation_spec.coffee +25 -0
  166. data/components/indefinido/indemma/master/src/spec/record/validations/cpf_spec.coffee +27 -0
  167. data/components/indefinido/indemma/master/src/spec/record/validations/presence_spec.coffee +24 -0
  168. data/components/indefinido/indemma/master/src/spec/record/validations/remote_spec.coffee +74 -0
  169. data/components/indefinido/indemma/master/src/spec/record/validations/type_spec.coffee +33 -0
  170. data/components/indefinido/indemma/master/src/spec/record_spec.coffee +29 -0
  171. data/components/indefinido/indemma/master/src/spec/spec_helper.coffee +11 -0
  172. data/components/indefinido/indemma/master/src/spec/support/value_objects/phone.coffee +30 -0
  173. data/components/indefinido/indemma/master/vendor/object/mixin.js +196 -0
  174. data/components/indefinido/indemma/master/vendor/spec/sinon/assert.js +199 -0
  175. data/components/indefinido/indemma/master/vendor/spec/sinon/behavior.js +334 -0
  176. data/components/indefinido/indemma/master/vendor/spec/sinon/call.js +205 -0
  177. data/components/indefinido/indemma/master/vendor/spec/sinon/collection.js +155 -0
  178. data/components/indefinido/indemma/master/vendor/spec/sinon/match.js +245 -0
  179. data/components/indefinido/indemma/master/vendor/spec/sinon/mock.js +451 -0
  180. data/components/indefinido/indemma/master/vendor/spec/sinon/sandbox.js +144 -0
  181. data/components/indefinido/indemma/master/vendor/spec/sinon/spy.js +413 -0
  182. data/components/indefinido/indemma/master/vendor/spec/sinon/stub.js +161 -0
  183. data/components/indefinido/indemma/master/vendor/spec/sinon/test.js +77 -0
  184. data/components/indefinido/indemma/master/vendor/spec/sinon/test_case.js +99 -0
  185. data/components/indefinido/indemma/master/vendor/spec/sinon/util/event.js +94 -0
  186. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server.js +212 -0
  187. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server_with_clock.js +83 -0
  188. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_timers.js +405 -0
  189. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xdomain_request.js +206 -0
  190. data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xml_http_request.js +575 -0
  191. data/components/indefinido/indemma/master/vendor/spec/sinon/util/timers_ie.js +31 -0
  192. data/components/indefinido/indemma/master/vendor/spec/sinon/util/xdr_ie.js +14 -0
  193. data/components/indefinido/indemma/master/vendor/spec/sinon/util/xhr_ie.js +19 -0
  194. data/components/indefinido/indemma/master/vendor/spec/sinon.js +383 -0
  195. data/lib/assets/javascripts/value_objects/phone.js.coffee +3 -1
  196. data/lib/assets/javascripts/widgets/viewer/plugins/scopable.js.coffee +5 -5
  197. data/lib/ende/version.rb +1 -1
  198. data/vendor/assets/components/ende_build.css +4 -4
  199. data/vendor/assets/components/ende_build.js +7974 -7889
  200. metadata +191 -5
  201. data/vendor/assets/component/build.css +0 -112
  202. data/vendor/assets/components/build.css +0 -112
  203. data/vendor/assets/components/indemma_with_none.js +0 -30553
@@ -0,0 +1,22 @@
1
+ require 'indemma/lib/record/resource.js'
2
+
3
+ root = exports ? window
4
+
5
+ rest = require 'indemma/lib/record/rest.js'
6
+ jQuery = require 'component-jquery'
7
+
8
+ describe 'rest', ->
9
+ object = null
10
+
11
+ beforeEach ->
12
+ object = Object.create rest
13
+ object.route = "users"
14
+ object.resource = "user"
15
+
16
+ beforeEach -> sinon.stub(jQuery, "ajax").returns(jQuery.Deferred())
17
+ afterEach -> jQuery.ajax.restore()
18
+
19
+ describe '#delete', ->
20
+ it 'should make ajax call', ->
21
+ object.delete()
22
+ jQuery.ajax.called.should.be.true
@@ -0,0 +1,257 @@
1
+ require 'indemma/lib/record/restfulable.js'
2
+ require 'indemma/lib/record/validatable.js'
3
+ require 'indemma/lib/record/resource.js'
4
+
5
+ 'use strict'
6
+
7
+ root = exports ? window
8
+
9
+ model = root.model # TODO model = require 'indemma/model'
10
+ record = root.record # TODO model = require 'indemma/record'
11
+
12
+ # Move to shared behaviour!
13
+ should_behave_like_errorsable = ->
14
+
15
+ describe '.errors', ->
16
+ describe 'when server responds', ->
17
+ beforeEach ->
18
+ @xhr =
19
+ status: 422
20
+
21
+ describe 'with errors', ->
22
+ it 'should add messages for each attribute on the errors object'
23
+ it 'should add messages for base attribute on the errors object', ->
24
+ base_messages = ["arthur you should bring a towel!"]
25
+ @xhr.responseText = JSON.stringify
26
+ errors:
27
+ base: base_messages
28
+
29
+ @subject.failed @xhr, 'error'
30
+ @subject.should.have.property 'errors'
31
+ @subject.errors[0].should.include 'base', 'server', server_message: base_messages[0]
32
+ @subject.errors.messages.should.have.property 'base', base_messages[0]
33
+
34
+ describe 'with invalid error messages', ->
35
+ it 'when inexistent attribute should throw exception', ->
36
+
37
+ describe 'restfulable', ->
38
+
39
+ describe 'when included', ->
40
+ it 'sets te restufulable loaded flag on model', ->
41
+ model.restfulable.should.be.true
42
+
43
+ # it 'adds save methods to records'
44
+
45
+ describe 'record', ->
46
+ # TODO Convert to @arthur
47
+ arthur = null
48
+
49
+ describe '()', ->
50
+
51
+ beforeEach ->
52
+ @person = model.call resource: 'person'
53
+
54
+ # TODO Convert to @arthur
55
+ @arthur = @person name: 'Arthur Philip Dent'
56
+
57
+ # TODO put persistance check in other property
58
+ @arthur.dirty = true
59
+
60
+ describe '.json()', ->
61
+
62
+ it 'should remove all non data properties', ->
63
+ @arthur.json().should.not.have.property 'before_initialize'
64
+
65
+
66
+ describe '.save()', ->
67
+ beforeEach -> sinon.stub(jQuery, "ajax").returns(jQuery.Deferred())
68
+ afterEach -> jQuery.ajax.restore()
69
+
70
+ it 'should be able to serialize record', ->
71
+ JSON.stringify @arthur.json()
72
+
73
+ it 'should ignore key in transient fields'
74
+
75
+ it 'should send paramenters accordingly'
76
+
77
+ # TODO erase this test and implement the above test (should
78
+ # send paramenters accordingly)
79
+ it 'should make ajax call', ->
80
+ @arthur.save()
81
+ jQuery.ajax.called.should.be.true
82
+
83
+ describe 'model' , ->
84
+ describe '()', ->
85
+ describe '.json()', ->
86
+
87
+ beforeEach ->
88
+ @personable = model.call
89
+ resource: 'person'
90
+ has_many: 'friends'
91
+ nested_attributes: ['friends']
92
+ name: String
93
+
94
+ @friendable = model.call
95
+ resource: 'friend'
96
+ belongs_to: 'person'
97
+
98
+ describe '.assign_attributes()', ->
99
+
100
+ beforeEach ->
101
+ @personable = model.call
102
+ resource: 'person'
103
+ has_many: 'friends'
104
+ belongs_to: 'company'
105
+ has_one: 'towel'
106
+ name: String
107
+
108
+ @friendable = model.call
109
+ resource: 'friend'
110
+ belongs_to: 'person'
111
+ name: String
112
+
113
+ @companyable = model.call
114
+ resource: 'company'
115
+ has_many: 'people'
116
+ name: String
117
+
118
+ @towelable = model.call
119
+ resource: 'towel'
120
+ belongs_to: 'person'
121
+ material: String
122
+
123
+
124
+ @arthur = @personable name: 'Arthur Dent'
125
+ @ford = @friendable name: 'Ford Perfect'
126
+ @marvin = @friendable name: 'Marvin'
127
+ @megadodo = @companyable name: 'Megadodo Publications'
128
+ @towel = @towelable material: 'Microfiber'
129
+
130
+
131
+ # TODO implement setter on has many association and move this code to there
132
+ it 'should not assign attribute with the same value twice', ->
133
+ object = {}
134
+
135
+ @arthur = @personable name: object
136
+ @arthur.assign_attributes name: {wearing: 'robe'}
137
+
138
+ @arthur.name.should.not.be.eq object
139
+
140
+ it 'assigns associations properly', ->
141
+ attributes = friends: [@ford, @marvin]
142
+
143
+ @arthur.assign_attributes attributes
144
+
145
+ search_record = (association, search) ->
146
+ search = JSON.stringify search.json()
147
+ for associated in association
148
+ associated = JSON.stringify(associated.json())
149
+ return true if associated == search
150
+
151
+ false
152
+
153
+ search_record(@arthur.friends, @ford ).should.be.eq.true
154
+ search_record(@arthur.friends, @arthur).should.be.eq.true
155
+
156
+ describe 'when assigning has one', ->
157
+ it 'should build new objects when associated not defined', ->
158
+ @arthur.assign_attributes towel: {material: 'Copper'}
159
+
160
+ @arthur.should.have.property 'towel'
161
+ @arthur.towel.should.have.property 'material', 'Copper'
162
+
163
+ it 'should not build new objects when associated already defined', ->
164
+ @arthur.towel = @towel
165
+ @arthur.assign_attributes towel: {name: 'Copper'}
166
+
167
+ @arthur.should.have.property 'towel', @towel
168
+ @arthur.towel.should.have.property 'name', 'Copper'
169
+ @towel.should.have.property 'name', 'Copper'
170
+
171
+ describe 'when assigning belongs to', ->
172
+ it 'should build new objects when associated not defined', ->
173
+ @arthur.assign_attributes company: {name: 'Megado'}
174
+
175
+ @arthur.should.have.property 'company'
176
+ @arthur.company.should.have.property 'name', 'Megado'
177
+
178
+ it 'should not build new objects when associated already defined', ->
179
+ @arthur.company = @megadodo
180
+ @arthur.assign_attributes company: {name: 'Megado'}
181
+
182
+ @arthur.should.have.property 'company', @megadodo
183
+ @arthur.company.should.have.property 'name', 'Megado'
184
+ @megadodo.should.have.property 'name', 'Megado'
185
+
186
+ describe 'with singular resource', ->
187
+ describe '.create()', ->
188
+
189
+ it 'should return promises'
190
+ it 'should return models when promise is resolved'
191
+
192
+ describe 'with plural resource', ->
193
+
194
+ describe '.create()', ->
195
+ beforeEach ->
196
+ @personable = model.call resource: 'person'
197
+
198
+ @deferred = jQuery.Deferred()
199
+ @deferred.resolveWith @personable({_id: 1, name: 'Arthur'}), [{_id: 1, name: 'Arthur'}]
200
+ sinon.stub(jQuery, "ajax").returns @deferred
201
+
202
+ @promise = @personable.create {name: 'Arthur'}, {name: 'Ford'}
203
+
204
+ afterEach -> jQuery.ajax.restore()
205
+
206
+ # TODO move this test to restful test
207
+ it 'should return a promise', ->
208
+ @promise.done.should.be.function
209
+ @promise.state().should.be.eq 'resolved'
210
+
211
+ it 'should return models when promise is resolved', (done) ->
212
+ # Will be called once for each saved record
213
+ created = ->
214
+ @name.should.be.eq 'Arthur'
215
+ done()
216
+
217
+ @personable.create {name: 'Arthur'}, {name: 'Ford'}, created
218
+
219
+ it 'should optionally accept create callback', (done) ->
220
+ @promise = @personable.create {name: 'Arthur'}, {name: 'Ford'}
221
+ @promise.done.should.be.function
222
+ @promise.done -> done()
223
+ @promise.state().should.be.eq 'resolved'
224
+
225
+
226
+ it 'should create record when only callback is passed', (done) ->
227
+ @personable.create -> done()
228
+ jQuery.ajax.callCount.should.be.eq 3 # 2 are from the beforeEach
229
+
230
+ it 'should throw exception when nothing is passed', () ->
231
+ expect(@personable.create).to.throw TypeError
232
+
233
+ it 'should make ajax calls', ->
234
+ jQuery.ajax.callCount.should.be.eq 2
235
+
236
+
237
+ describe '.destroy()', ->
238
+ describe 'with plural resource', ->
239
+ arthur = person = deferred = null
240
+
241
+ beforeEach ->
242
+ person = model.call resource: 'person'
243
+ deferred = jQuery.Deferred()
244
+ deferred.resolveWith person(name: 'Arthur'), [id: 1]
245
+ sinon.stub(jQuery, "ajax").returns(deferred)
246
+ arthur = person name: 'Arthur', id: 1
247
+
248
+ afterEach -> jQuery.ajax.restore()
249
+
250
+ it "throw exception when record has no id", ->
251
+ delete arthur.id
252
+ expect(arthur.destroy).to.throw Error
253
+
254
+
255
+ it "should make ajax calls", ->
256
+ arthur.destroy()
257
+ jQuery.ajax.callCount.should.be.eq 1
@@ -0,0 +1,227 @@
1
+ require 'indemma/lib/record/resource.js'
2
+ require 'indemma/lib/record/restfulable.js'
3
+ require 'indemma/lib/record/scopable.js'
4
+
5
+ root = exports ? window
6
+
7
+ model = root.model # TODO model = require 'indemma/model'
8
+ record = root.record # TODO model = require 'indemma/record'
9
+
10
+ describe 'scopable', ->
11
+
12
+ describe 'when included', ->
13
+ it 'sets te scopable loaded flag on model', ->
14
+ model.scopable.should.be.true
15
+
16
+ # it 'adds finder methods to records'
17
+
18
+ describe 'model', ->
19
+
20
+ describe '#(options)', ->
21
+
22
+ beforeEach ->
23
+
24
+ @person = model.call
25
+ $hetero : true
26
+ $by_type: []
27
+ $by_name: String
28
+ resource: 'person'
29
+
30
+ it 'should add scope methods to model', ->
31
+ @person.none.should.be.function
32
+
33
+ it 'should generate scope methods based on model definition', ->
34
+ @person.hetero.should.be.function
35
+
36
+ describe '#none', ->
37
+ it 'should return empty response on fetch calls', (done) ->
38
+ # TODO implement getter for none property!
39
+ @person.none().fetch null, (people) ->
40
+ people.length.should.be.empty
41
+ done()
42
+
43
+
44
+ describe 'scope', ->
45
+
46
+ describe '#(name, type)', ->
47
+
48
+ it 'should add scope methods to model', ->
49
+ @person.scope 'bissexual', Boolean
50
+ @person.bissexual.should.be.function
51
+
52
+ # TODO check if generated scope have queryable methods
53
+ describe '#{generated_scope}', ->
54
+
55
+ beforeEach ->
56
+ @request = jQuery.Deferred()
57
+ sinon.stub(jQuery, "ajax").returns @request
58
+ @person.scope.clear()
59
+
60
+ afterEach -> jQuery.ajax.restore()
61
+
62
+ # TODO move to queryable
63
+ describe '#every', ->
64
+
65
+ it 'should fetch models from the server', (done) ->
66
+
67
+ # Will be called once for each saved record
68
+ fetched = (people) ->
69
+ people.should.be.array
70
+ people[0].name.should.be.string
71
+ done()
72
+
73
+ @person.every fetched
74
+
75
+ # TODO rename deferred to @request
76
+ @request.resolveWith @person, [[{name: 'Arthur'}, {name: 'Ford'}]]
77
+
78
+ # TODO allow query storage selection
79
+ # jQuery.ajax.callCount.should.be.eq 1
80
+
81
+
82
+ describe 'when string', ->
83
+ it 'should acumulate data in scope object', ->
84
+ @person.by_name()
85
+ @person.scope.data.by_name.should.be.a 'string'
86
+
87
+ it 'should override data throught parameters', ->
88
+ @person.by_name 'Ford'
89
+ @person.scope.data.by_name.should.be.eq 'Ford'
90
+
91
+ describe 'when array', ->
92
+ it 'should acumulate data in scope object', ->
93
+ @person.by_type()
94
+ @person.scope.data.by_type.should.be.a 'array'
95
+
96
+ it 'should override data throught parameters', ->
97
+ @person.by_type 1, 2, 3
98
+ @person.scope.data.by_type.should.contain 1, 2, 3
99
+
100
+ it 'should use default value'
101
+ it 'should allow scope chaining'
102
+
103
+ describe 'xhr request', ->
104
+
105
+ it 'should build correct url', ->
106
+ @person.by_type(1, 3, 4).fetch()
107
+
108
+ settings = jQuery.ajax.firstCall.args[0]
109
+
110
+ settings.should.have.property 'data'
111
+ settings.data.should.have.property 'by_type'
112
+ settings.data.by_type.should.include 1, 3, 4
113
+
114
+ it 'should make call', ->
115
+ @person.by_type(1, 3, 4).fetch()
116
+ jQuery.ajax.callCount.should.be.eq 1
117
+
118
+
119
+ describe 'when boolean', ->
120
+
121
+ it 'should acumulate data in scope object', ->
122
+ @person.hetero()
123
+ @person.scope.data.hetero.should.be.eq true
124
+
125
+ it 'should override data throught parameters', ->
126
+ @person.hetero false
127
+ @person.scope.data.hetero.should.be.eq false
128
+
129
+ it 'should allow scope chaining'
130
+
131
+ it 'should make ajax call', ->
132
+ @person.hetero().fetch()
133
+ jQuery.ajax.callCount.should.be.eq 1
134
+
135
+ describe '#{generated_association}', ->
136
+
137
+ describe 'of type belongs_to', ->
138
+
139
+ beforeEach ->
140
+ @person = model.call
141
+ $hetero: true
142
+ $by_type: []
143
+ resource: 'person'
144
+
145
+ @towel = model.call
146
+ resource: 'towel'
147
+ material: 'cotton'
148
+ belongs_to: 'person'
149
+
150
+
151
+ describe '#{generated_scope}', ->
152
+
153
+ xit 'can be called on association', ->
154
+ soft_towel = @towel
155
+ material: 'silicon microfiber'
156
+
157
+ soft_towel.build_person()
158
+
159
+ expect(soft_towel.person).to.respondTo 'hetero'
160
+
161
+ describe 'of type has_many', ->
162
+
163
+ beforeEach ->
164
+ @personable = model.call
165
+ $hetero: true
166
+ $by_type: []
167
+ resource: 'person'
168
+ has_many: 'towels'
169
+ nested_attributes: ['towels']
170
+
171
+ @towelable = model.call
172
+ $by_material: []
173
+ resource: 'towel'
174
+ material: 'cotton'
175
+ belongs_to: 'person'
176
+
177
+ @arthur = @personable
178
+ name: 'Arthur'
179
+
180
+ @personable.scope.clear()
181
+
182
+ describe '#{generated_scope}', ->
183
+
184
+ it 'can be called on association', ->
185
+ expect(@arthur.towels).to.respondTo 'by_material'
186
+
187
+ it 'should be serializable into paramenters', ->
188
+ @arthur.towels.by_material 'cotton', 'microfiber'
189
+ query_string = decodeURIComponent(jQuery.param @arthur.towels.scope.data)
190
+ query_string.should.be.eq 'by_material[]=cotton&by_material[]=microfiber'
191
+
192
+ describe '#every', ->
193
+
194
+ it 'should empty association when no models are returned', (done) ->
195
+
196
+ # Will be called once for each saved record
197
+ fetched = (towels) =>
198
+ towels.should.be.array
199
+ towels.should.be.empty
200
+ @arthur.towels.should.have.length 0
201
+ ` this.should.have.length(0) `
202
+ done()
203
+
204
+ @arthur.towels.every fetched
205
+
206
+ @request.resolveWith @arthur.towels, [[]]
207
+ jQuery.ajax.callCount.should.be.eq 1
208
+
209
+ it 'should update resources when already exists in association', (done) ->
210
+ additions = @arthur.towels.add _id: 1, material: 'colan'
211
+
212
+ # Will be called once for each saved record
213
+ fetched = (towels) =>
214
+ towels.should.be.array
215
+ towels.should.have.length 1
216
+ towels[0].material.should.be.eq 'cotton'
217
+
218
+ # Updated the associated object, instead of
219
+ # creating a new one
220
+ additions[0].material.should.be.eq 'cotton'
221
+ @arthur.towels[0].material.should.be.eq 'cotton'
222
+ done()
223
+
224
+ @arthur.towels.every fetched
225
+
226
+ @request.resolveWith @arthur.towels, [[_id: 1, material: 'cotton']]
227
+ jQuery.ajax.callCount.should.be.eq 1
@@ -0,0 +1,39 @@
1
+ 'use strict'
2
+
3
+ storable = require 'indemma/lib/record/storable.js'
4
+
5
+ describe 'storable', ->
6
+ it 'should set the storable key', ->
7
+ model.should.have.property 'storable', true
8
+
9
+ beforeEach ->
10
+ @storage = storable()
11
+
12
+ describe "#store", ->
13
+ beforeEach ->
14
+ @data = name: 'Arthur Dent'
15
+
16
+ describe "write", ->
17
+ it "should write object on deep storage"
18
+ # storage.store 'users.1', data
19
+
20
+ it "should write object on storage", ->
21
+ @storage.store '1', @data
22
+ @storage.writes.should.be.eq 1
23
+ @storage.database['1'].should.be.eq @data
24
+
25
+ it "should mark an object as sustained", ->
26
+ @storage.store '1', @data
27
+ @data.should.have.property 'sustained', true
28
+
29
+
30
+ describe "read", ->
31
+
32
+ beforeEach ->
33
+ @data = name: 'Arthur Dent'
34
+ @storage.store '1', @data
35
+
36
+ it "should save object on storage", ->
37
+ @storage.store('1').should.be.eq @data
38
+
39
+ it "should unmark an object as sustained"
@@ -0,0 +1,19 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/translationable.js'
4
+
5
+ describe 'model', ->
6
+ model = root.model
7
+ person = null
8
+
9
+ beforeEach ->
10
+ person = model.call
11
+ resource : 'person'
12
+ name: String
13
+ translation:
14
+ attributes:
15
+ name: 'Batata'
16
+
17
+ describe '#human_attribute_name', ->
18
+ it 'should return the translated attribute name', ->
19
+ person.human_attribute_name('name').should.be.eq 'Batata'
@@ -0,0 +1,127 @@
1
+ 'use strict'
2
+
3
+ require 'indemma/lib/record/validatable.js'
4
+
5
+ describe 'model', ->
6
+
7
+ person = corporation = null
8
+
9
+ beforeEach ->
10
+ person = model.call resource : 'person'
11
+
12
+ it 'should store validators', ->
13
+ person.should.have.property 'validators'
14
+ person.validators.should.be.an 'array'
15
+
16
+ describe '(validates_... : ...)', ->
17
+
18
+ describe 'validators instatiation', ->
19
+
20
+ it 'should have validators', ->
21
+ person = model.call
22
+ resource : 'person'
23
+ name : String
24
+ validates_presence_of: 'name'
25
+
26
+ person.validators.should.not.be.empty
27
+ validator = person.validators[0]
28
+ validator.should.have.property 'attribute_name', 'name'
29
+
30
+ it 'should have validators with in the key validates'
31
+ #person = model.call
32
+ # resource : 'person'
33
+ # name : String
34
+ # validates : {name: {presence: true} }
35
+
36
+ #person.validators.should.have.key 'name'
37
+
38
+ describe '.validate_attribute()', ->
39
+
40
+ beforeEach ->
41
+ # TODO implement better model redefinition pattern
42
+ person.validators.length = 0
43
+
44
+ person = model.call
45
+ resource : 'person'
46
+ name : String
47
+ validates_presence_of: 'name'
48
+
49
+ it 'should add error messages for the validated attribute', ->
50
+ arthur = person name: null
51
+
52
+ arthur.validate_attribute 'name'
53
+
54
+ arthur.errors.length.should.be.eq 1
55
+ arthur.errors.messages.should.have.property 'name'
56
+
57
+ describe '.valid', ->
58
+
59
+ beforeEach ->
60
+ # TODO implement better model redefinition pattern
61
+ @personable?.validators.length = 0
62
+
63
+ @personable = model.call
64
+ resource : 'person'
65
+ name : String
66
+ validates_presence_of: 'name'
67
+
68
+ @xhr = jQuery.Deferred()
69
+ sinon.stub(jQuery, 'ajax').returns @xhr
70
+
71
+ afterEach -> jQuery.ajax.restore()
72
+
73
+
74
+ # TODO more specific .valid test functionality
75
+ it 'should be true when valid', ->
76
+ arthur = @personable name: "Arthur"
77
+
78
+ arthur.should.have.property 'valid'
79
+ arthur.valid.should.be.true
80
+ arthur.errors.length.should.be.eq 0
81
+
82
+
83
+ it 'should exist as read only property', ->
84
+ arthur = @personable name: "Arthur"
85
+ expect(-> arthur.valid = false).to.throw Error
86
+
87
+ it 'should validate record', ->
88
+ anonymous = @personable name: null
89
+ anonymous.valid.should.be.false
90
+ anonymous.errors.length.should.be.eq 1
91
+
92
+ it 'should not validate record multiple times even with remote' , ->
93
+ @personable = model.call
94
+ resource : 'person'
95
+ name : String
96
+ validates_remotely: 'email'
97
+
98
+ arthur = @personable name: "Arthur", email: "arthur.dent@hitchhikers.guide"
99
+ arthur.valid
100
+ arthur.valid
101
+ arthur.valid
102
+ arthur.valid
103
+
104
+ jQuery.ajax.callCount.should.be.eq 1
105
+
106
+ it 'should not validate record until it changes', ->
107
+ anonymous = @personable name: null
108
+
109
+ anonymous.observation.deliver()
110
+ anonymous.errors.length.should.be.eq 0
111
+
112
+ it 'should not re-validate record until it changes', ->
113
+ anonymous = @personable name: null
114
+
115
+ anonymous.valid.should.be.false
116
+ anonymous.errors.length.should.be.eq 1
117
+
118
+ validation = anonymous.validation
119
+ # We expect it to not instanitante new validation deferred
120
+ anonymous.validate().should.be.eq validation
121
+
122
+ # Record for some reason changed
123
+ anonymous.dirty = true
124
+ anonymous.observation.deliver()
125
+
126
+ # We expect it to instanitante new validation deferred
127
+ anonymous.validate().should.not.be.eq validation