arkenstone-open 3.0.1
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 +7 -0
- data/.github/workflows/codacy-analysis.yml +46 -0
- data/.gitignore +19 -0
- data/.rubocop.yml +5 -0
- data/.ruby-version +1 -0
- data/.travis.yml +16 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +101 -0
- data/LICENSE.txt +11 -0
- data/README.md +87 -0
- data/Rakefile +36 -0
- data/arkenstone.gemspec +27 -0
- data/lib/arkenstone/associations/resources.rb +76 -0
- data/lib/arkenstone/associations.rb +389 -0
- data/lib/arkenstone/document.rb +289 -0
- data/lib/arkenstone/enumerable/query_list.rb +20 -0
- data/lib/arkenstone/errors/no_url_error.rb +14 -0
- data/lib/arkenstone/helpers.rb +18 -0
- data/lib/arkenstone/network/env.rb +19 -0
- data/lib/arkenstone/network/hook.rb +74 -0
- data/lib/arkenstone/network/network.rb +72 -0
- data/lib/arkenstone/query_builder.rb +84 -0
- data/lib/arkenstone/queryable.rb +38 -0
- data/lib/arkenstone/timestamps.rb +25 -0
- data/lib/arkenstone/validation/validation_error.rb +34 -0
- data/lib/arkenstone/validation/validations.rb +192 -0
- data/lib/arkenstone/version.rb +5 -0
- data/lib/arkenstone.rb +22 -0
- data/test/associations/test_document_overrides.rb +50 -0
- data/test/associations/test_has_and_belongs_to_many.rb +80 -0
- data/test/dummy/app/models/association.rb +35 -0
- data/test/dummy/app/models/superuser.rb +8 -0
- data/test/dummy/app/models/user.rb +10 -0
- data/test/spec_helper.rb +16 -0
- data/test/test_arkenstone.rb +354 -0
- data/test/test_arkenstone_hook_inheritance.rb +39 -0
- data/test/test_associations.rb +327 -0
- data/test/test_enumerables.rb +36 -0
- data/test/test_environment.rb +14 -0
- data/test/test_helpers.rb +18 -0
- data/test/test_hooks.rb +104 -0
- data/test/test_query_builder.rb +163 -0
- data/test/test_queryable.rb +59 -0
- data/test/test_validations.rb +197 -0
- metadata +133 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
class QueryableTests < Test::Unit::TestCase
|
6
|
+
def test_query_url
|
7
|
+
url = 'http://example.com/users/query'
|
8
|
+
assert(url == User.query_url)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_where_with_string
|
12
|
+
dummy_user1 = user_options(name: 'user 1')
|
13
|
+
dummy_user2 = user_options(name: 'user 2')
|
14
|
+
stub_request(:post, "#{User.arkenstone_url}query").to_return(body: [dummy_user1, dummy_user2].to_json)
|
15
|
+
results = User.where '{name: "user 1"}'
|
16
|
+
assert(results.nil? == false)
|
17
|
+
assert(results.first.instance_of?(User))
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_where_with_hash
|
21
|
+
dummy_user1 = user_options(name: 'user 1')
|
22
|
+
dummy_user2 = user_options(name: 'user 2')
|
23
|
+
stub_request(:post,
|
24
|
+
"#{User.arkenstone_url}query").with(body: { name: 'user 1' }.to_json).to_return(body: [dummy_user1,
|
25
|
+
dummy_user2].to_json)
|
26
|
+
results = User.where({ name: 'user 1' })
|
27
|
+
assert(results.nil? == false)
|
28
|
+
assert(results.first.instance_of?(User))
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_where_with_block
|
32
|
+
dummy_user1 = user_options(name: 'user 1')
|
33
|
+
dummy_user2 = user_options(name: 'user 2')
|
34
|
+
stub_request(:post,
|
35
|
+
"#{User.arkenstone_url}query").with(body: { name: 'user 1' }).to_return(body: [dummy_user1,
|
36
|
+
dummy_user2].to_json)
|
37
|
+
results = User.where do
|
38
|
+
{
|
39
|
+
name: 'user 1'
|
40
|
+
}
|
41
|
+
end
|
42
|
+
assert(results.nil? == false)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_where_nil
|
46
|
+
result = User.where
|
47
|
+
assert(result.nil?)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_where_no_results
|
51
|
+
stub_request(:post, "#{User.arkenstone_url}query").to_return(body: [].to_json)
|
52
|
+
result = User.where ''
|
53
|
+
assert(result == [])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def user_options(options = {})
|
58
|
+
{ name: 'John Doe', age: 18, gender: 'Male', bearded: true }.merge!(options)
|
59
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
class ArkenstoneValidationTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
eval %(
|
8
|
+
class ArkenstoneTestFirstName
|
9
|
+
include Arkenstone::Validation
|
10
|
+
|
11
|
+
attr_accessor :first_name
|
12
|
+
validates :first_name, presence: true
|
13
|
+
end
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_model_validate_presence
|
18
|
+
model = ArkenstoneTestFirstName.new
|
19
|
+
model.first_name = nil
|
20
|
+
assert(model.valid? == false)
|
21
|
+
model.first_name = 'test'
|
22
|
+
assert(model.valid?)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_model_validate_presence_empty_string
|
26
|
+
model = ArkenstoneTestFirstName.new
|
27
|
+
model.first_name = ''
|
28
|
+
assert(model.valid? == false)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_model_validate_empty_array
|
32
|
+
eval %(
|
33
|
+
class ArkenstoneTestEmpty
|
34
|
+
include Arkenstone::Validation
|
35
|
+
|
36
|
+
attr_accessor :values
|
37
|
+
validates :values, empty: false
|
38
|
+
end
|
39
|
+
)
|
40
|
+
model = ArkenstoneTestEmpty.new
|
41
|
+
assert_equal false, model.valid?
|
42
|
+
model.values = []
|
43
|
+
assert_equal false, model.valid?
|
44
|
+
model.values = ['hi']
|
45
|
+
assert_equal true, model.valid?
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_model_validate_format
|
49
|
+
eval %(
|
50
|
+
class ArkenstoneTestLastName
|
51
|
+
include Arkenstone::Validation
|
52
|
+
|
53
|
+
attr_accessor :last_name
|
54
|
+
validates :last_name, format: { with: /[a-z]+/, message: "must be lowercase" }
|
55
|
+
end
|
56
|
+
)
|
57
|
+
model = ArkenstoneTestLastName.new
|
58
|
+
model.last_name = 'ABC'
|
59
|
+
assert(model.valid? == false)
|
60
|
+
model.last_name = 'abc'
|
61
|
+
assert(model.valid?)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_model_validate_true_value
|
65
|
+
eval %(
|
66
|
+
class ArkenstoneTestBool
|
67
|
+
include Arkenstone::Validation
|
68
|
+
|
69
|
+
attr_accessor :accepts_tandcs
|
70
|
+
validates :accepts_tandcs, acceptance: true
|
71
|
+
end
|
72
|
+
)
|
73
|
+
model = ArkenstoneTestBool.new
|
74
|
+
assert(model.valid? == false)
|
75
|
+
assert(model.errors[:accepts_tandcs] == ['must be true'])
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_model_validates_type
|
79
|
+
eval %(
|
80
|
+
class ArkenstoneTestType
|
81
|
+
include Arkenstone::Validation
|
82
|
+
|
83
|
+
attr_accessor :should_be_string
|
84
|
+
validates :should_be_string, type: String
|
85
|
+
end
|
86
|
+
)
|
87
|
+
|
88
|
+
model = ArkenstoneTestType.new
|
89
|
+
model.should_be_string = 'hi'
|
90
|
+
assert(model.valid?)
|
91
|
+
model.should_be_string = 100
|
92
|
+
assert(model.valid? == false)
|
93
|
+
|
94
|
+
eval %(
|
95
|
+
class BaseThing
|
96
|
+
end
|
97
|
+
|
98
|
+
class ChildThing < BaseThing
|
99
|
+
end
|
100
|
+
|
101
|
+
class InheritanceTestType
|
102
|
+
include Arkenstone::Validation
|
103
|
+
|
104
|
+
attr_accessor :should_be_base
|
105
|
+
validates :should_be_base, type: BaseThing
|
106
|
+
end
|
107
|
+
)
|
108
|
+
model = InheritanceTestType.new
|
109
|
+
model.should_be_base = ChildThing.new
|
110
|
+
assert(model.valid?)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_model_validates_confirmation
|
114
|
+
eval %(
|
115
|
+
class ArkenstoneTestConfirmation
|
116
|
+
include Arkenstone::Document
|
117
|
+
include Arkenstone::Validation
|
118
|
+
|
119
|
+
attributes :email
|
120
|
+
attr_accessor :email_confirmation
|
121
|
+
|
122
|
+
validates :email, confirmation: true
|
123
|
+
end
|
124
|
+
)
|
125
|
+
|
126
|
+
model = ArkenstoneTestConfirmation.new
|
127
|
+
model.email = 'test@example.com'
|
128
|
+
|
129
|
+
assert(!model.valid?)
|
130
|
+
assert_equal(['confirmation does not match email'], model.errors[:email])
|
131
|
+
|
132
|
+
model.email_confirmation = model.email
|
133
|
+
|
134
|
+
assert(model.valid?)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_model_custom_validator
|
138
|
+
eval %(
|
139
|
+
class ArkenstoneTestCustom
|
140
|
+
include Arkenstone::Validation
|
141
|
+
|
142
|
+
attr_accessor :number
|
143
|
+
validate :numberwang
|
144
|
+
|
145
|
+
def numberwang # http://www.youtube.com/watch?v=qjOZtWZ56lc
|
146
|
+
errors.add(:number, "That's numberwang!") unless [3, 19, 333].include? @number
|
147
|
+
end
|
148
|
+
end
|
149
|
+
)
|
150
|
+
model = ArkenstoneTestCustom.new
|
151
|
+
model.number = 100
|
152
|
+
assert(model.valid? == false)
|
153
|
+
model.number = 19
|
154
|
+
assert(model.valid?)
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_validation_errors
|
158
|
+
model = ArkenstoneTestFirstName.new
|
159
|
+
model.first_name = nil
|
160
|
+
model.valid?
|
161
|
+
assert(model.errors.nil? == false)
|
162
|
+
assert(model.errors[:first_name] == ["can't be blank"])
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_validation_with_nil_fields_to_validate
|
166
|
+
eval %(
|
167
|
+
class ArkenstoneTestValidator
|
168
|
+
include Arkenstone::Validation
|
169
|
+
include Arkenstone::Document
|
170
|
+
|
171
|
+
attributes :id
|
172
|
+
end
|
173
|
+
|
174
|
+
class ArkenstoneChildValidator < ArkenstoneTestValidator
|
175
|
+
end
|
176
|
+
)
|
177
|
+
model = ArkenstoneChildValidator.new
|
178
|
+
assert(model.valid?)
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_custom_messages
|
182
|
+
eval %(
|
183
|
+
class ArkenstoneCustomMessage
|
184
|
+
include Arkenstone::Validation
|
185
|
+
|
186
|
+
attr_accessor :name
|
187
|
+
|
188
|
+
validates :name, presence: true, message: "Test Message"
|
189
|
+
end
|
190
|
+
)
|
191
|
+
|
192
|
+
model = ArkenstoneCustomMessage.new
|
193
|
+
model.name = nil
|
194
|
+
assert(model.valid? == false)
|
195
|
+
assert(model.errors[:name] == ['Test Message'])
|
196
|
+
end
|
197
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: arkenstone-open
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Christenson II
|
8
|
+
- Steve Young
|
9
|
+
- Scott Williams
|
10
|
+
- Brett Byler
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2023-03-21 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: bundler
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2.1'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.1'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 13.0.1
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 13.0.1
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: activesupport
|
46
|
+
requirement: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '5.0'
|
51
|
+
type: :runtime
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '5.0'
|
58
|
+
description: An Open Source ActiveRecord replacement over REST
|
59
|
+
email:
|
60
|
+
- m3talsmith@gmail.com
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- ".github/workflows/codacy-analysis.yml"
|
66
|
+
- ".gitignore"
|
67
|
+
- ".rubocop.yml"
|
68
|
+
- ".ruby-version"
|
69
|
+
- ".travis.yml"
|
70
|
+
- Gemfile
|
71
|
+
- Gemfile.lock
|
72
|
+
- LICENSE.txt
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- arkenstone.gemspec
|
76
|
+
- lib/arkenstone.rb
|
77
|
+
- lib/arkenstone/associations.rb
|
78
|
+
- lib/arkenstone/associations/resources.rb
|
79
|
+
- lib/arkenstone/document.rb
|
80
|
+
- lib/arkenstone/enumerable/query_list.rb
|
81
|
+
- lib/arkenstone/errors/no_url_error.rb
|
82
|
+
- lib/arkenstone/helpers.rb
|
83
|
+
- lib/arkenstone/network/env.rb
|
84
|
+
- lib/arkenstone/network/hook.rb
|
85
|
+
- lib/arkenstone/network/network.rb
|
86
|
+
- lib/arkenstone/query_builder.rb
|
87
|
+
- lib/arkenstone/queryable.rb
|
88
|
+
- lib/arkenstone/timestamps.rb
|
89
|
+
- lib/arkenstone/validation/validation_error.rb
|
90
|
+
- lib/arkenstone/validation/validations.rb
|
91
|
+
- lib/arkenstone/version.rb
|
92
|
+
- test/associations/test_document_overrides.rb
|
93
|
+
- test/associations/test_has_and_belongs_to_many.rb
|
94
|
+
- test/dummy/app/models/association.rb
|
95
|
+
- test/dummy/app/models/superuser.rb
|
96
|
+
- test/dummy/app/models/user.rb
|
97
|
+
- test/spec_helper.rb
|
98
|
+
- test/test_arkenstone.rb
|
99
|
+
- test/test_arkenstone_hook_inheritance.rb
|
100
|
+
- test/test_associations.rb
|
101
|
+
- test/test_enumerables.rb
|
102
|
+
- test/test_environment.rb
|
103
|
+
- test/test_helpers.rb
|
104
|
+
- test/test_hooks.rb
|
105
|
+
- test/test_query_builder.rb
|
106
|
+
- test/test_queryable.rb
|
107
|
+
- test/test_validations.rb
|
108
|
+
homepage: https://github.com/m3talsmith/arkenstone
|
109
|
+
licenses:
|
110
|
+
- MIT
|
111
|
+
metadata:
|
112
|
+
rubygems_mfa_required: 'true'
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '3.0'
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
requirements: []
|
128
|
+
rubygems_version: 3.4.1
|
129
|
+
signing_key:
|
130
|
+
specification_version: 4
|
131
|
+
summary: A drop-in replacement for ActiveRecord that performs CRUD operations over
|
132
|
+
RESTful URLs.
|
133
|
+
test_files: []
|