ende 0.5.20 → 0.5.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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