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.
- checksums.yaml +4 -4
- data/component.json +1 -1
- data/components/indefinido/indemma/master/.gitignore +17 -0
- data/components/indefinido/indemma/master/.ruby-gemset +1 -0
- data/components/indefinido/indemma/master/.ruby-version +1 -0
- data/components/indefinido/indemma/master/Gemfile +12 -0
- data/components/indefinido/indemma/master/Guardfile +39 -0
- data/components/indefinido/indemma/master/History.md +0 -0
- data/components/indefinido/indemma/master/Readme.md +445 -0
- data/components/indefinido/indemma/master/build/development.js +26123 -0
- data/components/indefinido/indemma/master/build/release.js +16741 -0
- data/components/indefinido/indemma/master/build/test.js +26123 -0
- data/components/indefinido/indemma/master/component.json +1 -1
- data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/component.json +18 -0
- data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/index.js +110 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.gitignore +22 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.mailmap +1 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.npmignore +14 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.travis.yml +14 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/CONTRIBUTING.md +173 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/History.md +895 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/Makefile +93 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/README.md +99 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/ReleaseNotes.md +482 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/bower.json +27 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/chai.js +4782 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/component.json +50 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/index.js +1 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.conf.js +28 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.sauce.js +41 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/assertion.js +130 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/config.js +50 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/core/assertions.js +1314 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/assert.js +1056 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/expect.js +12 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/should.js +78 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addChainableMethod.js +111 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addMethod.js +43 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addProperty.js +40 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/flag.js +32 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getActual.js +18 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getEnumerableProperties.js +25 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getMessage.js +49 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getName.js +20 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getPathValue.js +102 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getProperties.js +35 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/index.js +114 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/inspect.js +320 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/objDisplay.js +49 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteChainableMethod.js +53 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteMethod.js +51 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteProperty.js +54 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/test.js +26 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/transferFlags.js +44 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/type.js +45 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai.js +87 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/package.json +42 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/sauce.browsers.js +128 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_block.sh +7 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_setup.sh +53 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/assert.js +638 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/auth/.gitkeep +0 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/index.js +22 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/karma.js +22 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/configuration.js +133 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/errors.js +14 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/message.js +47 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/expect.js +814 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/globalShould.js +15 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/plugins.js +24 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/should.js +744 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/utilities.js +309 -0
- data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/component.json +20 -0
- data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/lib/eql.js +257 -0
- data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/component.json +18 -0
- data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/lib/type.js +142 -0
- data/components/indefinido/indemma/master/components/component/bind/1.0.0/component.json +14 -0
- data/components/indefinido/indemma/master/components/component/bind/1.0.0/index.js +23 -0
- data/components/indefinido/indemma/master/components/component/jquery/1.0.0/component.json +10 -0
- data/components/indefinido/indemma/master/components/component/jquery/1.0.0/index.js +10308 -0
- data/components/indefinido/indemma/master/components/component/type/1.0.0/component.json +20 -0
- data/components/indefinido/indemma/master/components/component/type/1.0.0/index.js +32 -0
- data/components/indefinido/indemma/master/components/indefinido/advisable/master/component.json +21 -0
- data/components/indefinido/indemma/master/components/indefinido/advisable/master/index.js +1 -0
- data/components/indefinido/indemma/master/components/indefinido/advisable/master/lib/advisable.js +60 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/component.json +39 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/index.js +1 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/adapters/rivets.js +40 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/notifierable.js +145 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/schedulerable.js +147 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/lookup.js +38 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/keypath_observer.js +38 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/observation.js +45 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/selection.js +57 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/self_observer.js +38 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable.js +97 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/platform.js +12 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/observe-js/observe.js +1631 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors-legacy.js +92 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors.js +248 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/array.indexOf.js +8 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/object.create.js +77 -0
- data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/component.json +25 -0
- data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/dist/assimilate.js +127 -0
- data/components/indefinido/indemma/master/karma.conf.js +75 -0
- data/components/indefinido/indemma/master/lib/record/associable.js +4 -2
- data/components/indefinido/indemma/master/lib/record/dirtyable.js +1 -1
- data/components/indefinido/indemma/master/package.json +9 -0
- data/components/indefinido/indemma/master/spec/record/associable_spec.js +211 -0
- data/components/indefinido/indemma/master/spec/record/dirtyable_spec.js +57 -0
- data/components/indefinido/indemma/master/spec/record/maid_spec.js +40 -0
- data/components/indefinido/indemma/master/spec/record/persistable_spec.js +46 -0
- data/components/indefinido/indemma/master/spec/record/queryable_spec.js +39 -0
- data/components/indefinido/indemma/master/spec/record/resource_spec.js +93 -0
- data/components/indefinido/indemma/master/spec/record/rest_spec.js +32 -0
- data/components/indefinido/indemma/master/spec/record/restfulable_spec.js +346 -0
- data/components/indefinido/indemma/master/spec/record/scopable_spec.js +242 -0
- data/components/indefinido/indemma/master/spec/record/storable_spec.js +44 -0
- data/components/indefinido/indemma/master/spec/record/translationable.js +28 -0
- data/components/indefinido/indemma/master/spec/record/validatable_spec.js +142 -0
- data/components/indefinido/indemma/master/spec/record/validations/associated_spec.js +43 -0
- data/components/indefinido/indemma/master/spec/record/validations/confirmation_spec.js +36 -0
- data/components/indefinido/indemma/master/spec/record/validations/cpf_spec.js +34 -0
- data/components/indefinido/indemma/master/spec/record/validations/presence_spec.js +28 -0
- data/components/indefinido/indemma/master/spec/record/validations/remote_spec.js +87 -0
- data/components/indefinido/indemma/master/spec/record/validations/type_spec.js +48 -0
- data/components/indefinido/indemma/master/spec/record_spec.js +49 -0
- data/components/indefinido/indemma/master/spec/spec_helper.js +15 -0
- data/components/indefinido/indemma/master/spec/support/value_objects/phone.js +45 -0
- data/components/indefinido/indemma/master/src/lib/extensions/rivets.coffee +17 -0
- data/components/indefinido/indemma/master/src/lib/record/associable.coffee +419 -0
- data/components/indefinido/indemma/master/src/lib/record/dirtyable.coffee +47 -0
- data/components/indefinido/indemma/master/src/lib/record/errors.coffee +20 -0
- data/components/indefinido/indemma/master/src/lib/record/maid.coffee +16 -0
- data/components/indefinido/indemma/master/src/lib/record/persistable.coffee +34 -0
- data/components/indefinido/indemma/master/src/lib/record/queryable.coffee +29 -0
- data/components/indefinido/indemma/master/src/lib/record/resource.coffee +107 -0
- data/components/indefinido/indemma/master/src/lib/record/rest.coffee +34 -0
- data/components/indefinido/indemma/master/src/lib/record/restfulable.coffee +487 -0
- data/components/indefinido/indemma/master/src/lib/record/scopable.coffee +279 -0
- data/components/indefinido/indemma/master/src/lib/record/storable.coffee +49 -0
- data/components/indefinido/indemma/master/src/lib/record/translationable.coffee +18 -0
- data/components/indefinido/indemma/master/src/lib/record/validatable.coffee +241 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/associated.coffee +34 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/confirmation.coffee +17 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/cpf.coffee +57 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/presence.coffee +16 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/remote.coffee +61 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/type.coffee +31 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/validatorable.coffee +5 -0
- data/components/indefinido/indemma/master/src/lib/record.coffee +143 -0
- data/components/indefinido/indemma/master/src/spec/record/associable_spec.coffee +205 -0
- data/components/indefinido/indemma/master/src/spec/record/dirtyable_spec.coffee +47 -0
- data/components/indefinido/indemma/master/src/spec/record/maid_spec.coffee +34 -0
- data/components/indefinido/indemma/master/src/spec/record/persistable_spec.coffee +39 -0
- data/components/indefinido/indemma/master/src/spec/record/queryable_spec.coffee +33 -0
- data/components/indefinido/indemma/master/src/spec/record/resource_spec.coffee +69 -0
- data/components/indefinido/indemma/master/src/spec/record/rest_spec.coffee +22 -0
- data/components/indefinido/indemma/master/src/spec/record/restfulable_spec.coffee +257 -0
- data/components/indefinido/indemma/master/src/spec/record/scopable_spec.coffee +227 -0
- data/components/indefinido/indemma/master/src/spec/record/storable_spec.coffee +39 -0
- data/components/indefinido/indemma/master/src/spec/record/translationable.coffee +19 -0
- data/components/indefinido/indemma/master/src/spec/record/validatable_spec.coffee +127 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/associated_spec.coffee +35 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/confirmation_spec.coffee +25 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/cpf_spec.coffee +27 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/presence_spec.coffee +24 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/remote_spec.coffee +74 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/type_spec.coffee +33 -0
- data/components/indefinido/indemma/master/src/spec/record_spec.coffee +29 -0
- data/components/indefinido/indemma/master/src/spec/spec_helper.coffee +11 -0
- data/components/indefinido/indemma/master/src/spec/support/value_objects/phone.coffee +30 -0
- data/components/indefinido/indemma/master/vendor/object/mixin.js +196 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/assert.js +199 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/behavior.js +334 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/call.js +205 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/collection.js +155 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/match.js +245 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/mock.js +451 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/sandbox.js +144 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/spy.js +413 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/stub.js +161 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/test.js +77 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/test_case.js +99 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/event.js +94 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server.js +212 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server_with_clock.js +83 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_timers.js +405 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xdomain_request.js +206 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xml_http_request.js +575 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/timers_ie.js +31 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/xdr_ie.js +14 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/xhr_ie.js +19 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon.js +383 -0
- data/lib/assets/javascripts/value_objects/phone.js.coffee +3 -1
- data/lib/assets/javascripts/widgets/viewer/plugins/scopable.js.coffee +5 -5
- data/lib/ende/version.rb +1 -1
- data/vendor/assets/components/ende_build.css +4 -4
- data/vendor/assets/components/ende_build.js +7974 -7889
- metadata +191 -5
- data/vendor/assets/component/build.css +0 -112
- data/vendor/assets/components/build.css +0 -112
- 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
|