activenetsuite 0.1.1 → 0.1.2
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/lib/activenetsuite.rb +1 -0
- data/lib/activenetsuite/core/record.rb +59 -43
- data/lib/activenetsuite/core/search_record.rb +30 -15
- data/lib/activenetsuite/core/search_result.rb +1 -1
- data/lib/activenetsuite/core/status.rb +17 -19
- data/lib/activenetsuite/core/status_detail.rb +6 -0
- data/lib/activenetsuite/helpers/client.rb +1 -1
- data/lib/activenetsuite/helpers/error.rb +2 -3
- data/lib/activenetsuite/helpers/search_response_methods.rb +1 -1
- data/lib/activenetsuite/messages/get_list_response.rb +18 -0
- data/lib/activenetsuite/types/search_date.rb +9 -0
- data/lib/activenetsuite/types/search_date_field_operator.rb +9 -0
- data/lib/activenetsuite/version.rb +1 -1
- data/spec/lib/activenetsuite/core/record_spec.rb +168 -29
- data/spec/lib/activenetsuite/core/search_record_spec.rb +65 -17
- data/spec/lib/activenetsuite/core/search_result_spec.rb +2 -2
- data/spec/lib/activenetsuite/core/status_spec.rb +95 -0
- data/spec/lib/activenetsuite/helpers/client_spec.rb +33 -2
- data/spec/lib/activenetsuite/types/search_date_field_operator_spec.rb +8 -0
- data/spec/lib/activenetsuite/types/search_date_spec.rb +8 -0
- metadata +8 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3ae2182bb4b0ed5f80d1b87cfba3619ea67a377
|
4
|
+
data.tar.gz: 7bf7b4fb3bc103ffa0dc5232d65c1171e1083fd4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7795d2cfb911860ef8c60b9b402f64312caac098697792eaf299374d8162387a6e6584f651981799bd16a47ed56a11b2de895d1e3c1fa0cad03a6bdf0347d4b
|
7
|
+
data.tar.gz: b510bf5324e604bb2d0f3276ffb4145fe1c5246001cafd299b46317283503a67c4ed8b54d8e5922e8625a5501b719fb226680c94e5edc2a35b71840246dd4c1d
|
data/lib/activenetsuite.rb
CHANGED
@@ -3,17 +3,9 @@ module ActiveNetsuite
|
|
3
3
|
class Record
|
4
4
|
include MethodInflector
|
5
5
|
|
6
|
-
def to_s
|
7
|
-
instance_variables.
|
8
|
-
map do |var|
|
9
|
-
[var, instance_variable_get(var)]
|
10
|
-
end.
|
11
|
-
select do |var, val|
|
12
|
-
val
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
6
|
class << self
|
7
|
+
extend Forwardable
|
8
|
+
|
17
9
|
def client
|
18
10
|
@@client ||= nil
|
19
11
|
end
|
@@ -48,30 +40,17 @@ class Record
|
|
48
40
|
"::#{to_s}SearchBasic".constantize
|
49
41
|
end
|
50
42
|
|
51
|
-
|
52
|
-
client.search_next(search, page_index)
|
53
|
-
end
|
43
|
+
def_delegators :search, :where, :find_by, :inactive, :active
|
54
44
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
def find_by(*args)
|
60
|
-
search.find_by(*args)
|
45
|
+
def list(objects)
|
46
|
+
objects = [objects] unless objects.respond_to?(:map)
|
47
|
+
client.get_list(refs(objects))
|
61
48
|
end
|
62
49
|
|
63
50
|
def all
|
64
51
|
search.response
|
65
52
|
end
|
66
53
|
|
67
|
-
def inactive
|
68
|
-
search.inactive
|
69
|
-
end
|
70
|
-
|
71
|
-
def active
|
72
|
-
search.active
|
73
|
-
end
|
74
|
-
|
75
54
|
def delete(objects)
|
76
55
|
objects = [objects] unless objects.respond_to?(:map)
|
77
56
|
client.delete_list(refs(objects))
|
@@ -97,8 +76,13 @@ class Record
|
|
97
76
|
client.get_deleted(get_deleted_filter)
|
98
77
|
end
|
99
78
|
|
100
|
-
# Convert
|
101
|
-
# @
|
79
|
+
# Convert arg to RecordRef
|
80
|
+
# @overload ref(internal_id)
|
81
|
+
# @param [String] internal_id
|
82
|
+
# @overload ref(hash)
|
83
|
+
# @param [Hash] hash with internal_id or external_id
|
84
|
+
# @option opts [String] :internal_id
|
85
|
+
# @option opts [String] :external_id
|
102
86
|
# @return RecordRef
|
103
87
|
# @example
|
104
88
|
# ref = Record.arg(12)
|
@@ -156,10 +140,38 @@ class Record
|
|
156
140
|
res
|
157
141
|
end
|
158
142
|
|
143
|
+
def add!
|
144
|
+
raise_on_fail(:add)
|
145
|
+
end
|
146
|
+
|
159
147
|
def update
|
160
148
|
client.update(self)
|
161
149
|
end
|
162
150
|
|
151
|
+
def update!
|
152
|
+
raise_on_fail(:update)
|
153
|
+
end
|
154
|
+
|
155
|
+
def save
|
156
|
+
if new?
|
157
|
+
add
|
158
|
+
else
|
159
|
+
update
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def save!
|
164
|
+
if new?
|
165
|
+
add!
|
166
|
+
else
|
167
|
+
update!
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def new?
|
172
|
+
!internal_id
|
173
|
+
end
|
174
|
+
|
163
175
|
def delete
|
164
176
|
res = client.delete(ref)
|
165
177
|
if res.success?
|
@@ -168,6 +180,10 @@ class Record
|
|
168
180
|
res
|
169
181
|
end
|
170
182
|
|
183
|
+
def delete!
|
184
|
+
raise_on_error(:delete)
|
185
|
+
end
|
186
|
+
|
171
187
|
def client
|
172
188
|
self.class.client
|
173
189
|
end
|
@@ -175,9 +191,9 @@ class Record
|
|
175
191
|
def load
|
176
192
|
return self if loaded?
|
177
193
|
|
178
|
-
|
179
|
-
|
180
|
-
send :"#{getter}=",
|
194
|
+
result = find_by_id
|
195
|
+
result.getters.each do |getter|
|
196
|
+
send :"#{getter}=", result.send(getter)
|
181
197
|
end
|
182
198
|
@loaded = true
|
183
199
|
self
|
@@ -188,7 +204,11 @@ class Record
|
|
188
204
|
end
|
189
205
|
|
190
206
|
def active?
|
191
|
-
!
|
207
|
+
!is_inactive
|
208
|
+
end
|
209
|
+
|
210
|
+
def inactive?
|
211
|
+
!active?
|
192
212
|
end
|
193
213
|
|
194
214
|
def active=(value)
|
@@ -199,16 +219,6 @@ class Record
|
|
199
219
|
self.is_inactive = !!value
|
200
220
|
end
|
201
221
|
|
202
|
-
def activate
|
203
|
-
self.active = true
|
204
|
-
self
|
205
|
-
end
|
206
|
-
|
207
|
-
def inactivate
|
208
|
-
self.active = false
|
209
|
-
self
|
210
|
-
end
|
211
|
-
|
212
222
|
def ref
|
213
223
|
self.class.ref(internal_id)
|
214
224
|
end
|
@@ -223,6 +233,12 @@ class Record
|
|
223
233
|
|
224
234
|
private
|
225
235
|
|
236
|
+
def raise_on_fail(method)
|
237
|
+
res = send(method)
|
238
|
+
return res if res.success?
|
239
|
+
raise NetsuiteError, res
|
240
|
+
end
|
241
|
+
|
226
242
|
def raise_not_found_error
|
227
243
|
self.class.raise_not_found_error(ref)
|
228
244
|
end
|
@@ -7,13 +7,7 @@ class SearchRecord
|
|
7
7
|
attr_accessor :record_class
|
8
8
|
|
9
9
|
def_delegators :response, :page_index, :page_size, :search_id, :total_pages,
|
10
|
-
:total_records, :
|
11
|
-
|
12
|
-
def each
|
13
|
-
response.each do |result|
|
14
|
-
yield result if block_given?
|
15
|
-
end
|
16
|
-
end
|
10
|
+
:total_records, :more?, :next, :each, :to_a
|
17
11
|
|
18
12
|
def where(*args)
|
19
13
|
dup.send(:add, *args)
|
@@ -23,16 +17,25 @@ class SearchRecord
|
|
23
17
|
where(*args).first
|
24
18
|
end
|
25
19
|
|
26
|
-
def to_a
|
27
|
-
response.to_a
|
28
|
-
end
|
29
|
-
|
30
20
|
def inactive
|
31
|
-
|
21
|
+
where(isInactive: true)
|
32
22
|
end
|
33
23
|
|
34
24
|
def active
|
35
|
-
|
25
|
+
where(isInactive: false)
|
26
|
+
end
|
27
|
+
|
28
|
+
def deleted(op, val)
|
29
|
+
search_value = SearchDateField.new
|
30
|
+
search_value.xmlattr_operator = SearchDateFieldOperator.make(op)
|
31
|
+
search_value.predefinedSearchValue = SearchDate.make(val)
|
32
|
+
|
33
|
+
search_type = SearchEnumMultiSelectField.new
|
34
|
+
search_type.xmlattr_operator = SearchEnumMultiSelectFieldOperator::AnyOf
|
35
|
+
search_type.searchValue = type
|
36
|
+
|
37
|
+
get_deleted_filter = GetDeletedFilter.new(search_value, search_type)
|
38
|
+
client.get_deleted(get_deleted_filter)
|
36
39
|
end
|
37
40
|
|
38
41
|
def response
|
@@ -50,7 +53,7 @@ class SearchRecord
|
|
50
53
|
def add(*args)
|
51
54
|
if args.first.is_a?(Hash)
|
52
55
|
@method, @value = args.first.flatten
|
53
|
-
@op =
|
56
|
+
@op = default_operator
|
54
57
|
end
|
55
58
|
if args.size == 3
|
56
59
|
@method, @op, @value = args
|
@@ -66,6 +69,19 @@ class SearchRecord
|
|
66
69
|
self
|
67
70
|
end
|
68
71
|
|
72
|
+
def default_operator
|
73
|
+
case value
|
74
|
+
when String
|
75
|
+
:is
|
76
|
+
when Fixnum
|
77
|
+
:equal_to
|
78
|
+
when Date, DateTime
|
79
|
+
:on
|
80
|
+
else
|
81
|
+
raise ArgumentError, "Can't find search class for #{value.inspect}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
69
85
|
def search_class
|
70
86
|
case value
|
71
87
|
when String
|
@@ -89,7 +105,6 @@ class SearchRecord
|
|
89
105
|
|
90
106
|
def record_class
|
91
107
|
@record_class
|
92
|
-
#"::#{self.class.to_s.gsub(/SearchBasic$/, '')}".constantize
|
93
108
|
end
|
94
109
|
end
|
95
110
|
|
@@ -1,20 +1,27 @@
|
|
1
1
|
module ActiveNetsuite
|
2
2
|
|
3
3
|
class Status
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
# Make it so Status responds to error_code? style methods
|
5
|
+
# @param [Symbol] method name
|
6
|
+
# @return [Boolean]
|
7
|
+
# @example
|
8
|
+
# status.code # => 'DUP_ITEM'
|
9
|
+
# status.dup_item? # => true
|
10
|
+
# status.cogs_error? # => false
|
11
|
+
def method_missing(method)
|
12
|
+
if method.to_s.end_with?('?')
|
13
|
+
code == method.to_s.chop.upcase
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
13
18
|
|
19
|
+
# True if status is success
|
14
20
|
def success?
|
15
|
-
xmlattr_isSuccess
|
21
|
+
!!xmlattr_isSuccess
|
16
22
|
end
|
17
23
|
|
24
|
+
# True if status is failure
|
18
25
|
def failure?
|
19
26
|
!success?
|
20
27
|
end
|
@@ -27,15 +34,6 @@ class Status
|
|
27
34
|
status_detail.message if status_detail
|
28
35
|
end
|
29
36
|
|
30
|
-
constants.each do |constant|
|
31
|
-
name = (constant.to_s.underscore + '?').to_sym
|
32
|
-
value = const_get(constant)
|
33
|
-
next unless value.is_a?(String)
|
34
|
-
define_method name do
|
35
|
-
code == value
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
37
|
def duplicate?
|
40
38
|
dup_item? || dup_rcrd? || dup_entity? || dup_vendor_name?
|
41
39
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ActiveNetsuite
|
2
|
+
|
3
|
+
class GetListResponse
|
4
|
+
include Enumerable
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def_delegators :records, :[]
|
8
|
+
|
9
|
+
alias_method :records, :readResponseList
|
10
|
+
|
11
|
+
def each
|
12
|
+
records.each do |record|
|
13
|
+
yield record if block_given?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -26,21 +26,22 @@ class ActiveNetsuite::Record
|
|
26
26
|
|
27
27
|
attr_accessor :foo
|
28
28
|
attr_accessor :bar
|
29
|
+
attr_accessor :is_inactive
|
29
30
|
end
|
30
31
|
|
31
32
|
class ActiveNetsuite::RecordSearchBasic; end
|
32
33
|
|
33
34
|
describe Record do
|
34
|
-
let(:
|
35
|
+
let(:record) { Record.new args }
|
35
36
|
let(:args) { nil }
|
36
37
|
let(:client) { double }
|
37
38
|
before { Record.client = client }
|
38
39
|
|
39
40
|
describe '#add' do
|
40
|
-
subject {
|
41
|
+
subject { record.add }
|
41
42
|
|
42
43
|
before do
|
43
|
-
|
44
|
+
record.client.stub(:add) { result }
|
44
45
|
end
|
45
46
|
let(:result) { double success?: success, internal_id: :internal_id }
|
46
47
|
let(:success) { true }
|
@@ -49,31 +50,56 @@ describe Record do
|
|
49
50
|
|
50
51
|
context 'when success' do
|
51
52
|
let(:success) { true }
|
52
|
-
it { expect { subject }.to change {
|
53
|
+
it { expect { subject }.to change { record.internal_id }.to(:internal_id) }
|
53
54
|
end
|
54
55
|
|
55
56
|
context 'when not success' do
|
56
57
|
let(:success) { false }
|
57
58
|
it { expect { subject }.to_not \
|
58
|
-
change {
|
59
|
+
change { record.internal_id }.to(:internal_id) }
|
59
60
|
end
|
60
61
|
end
|
61
62
|
|
63
|
+
describe '#add!' do
|
64
|
+
subject { record.add! }
|
65
|
+
|
66
|
+
before do
|
67
|
+
record.client.stub(:add) { result }
|
68
|
+
end
|
69
|
+
let(:result) { double success?: success, internal_id: :internal_id }
|
70
|
+
let(:success) { true }
|
71
|
+
|
72
|
+
it { should eq result }
|
73
|
+
|
74
|
+
context 'when success' do
|
75
|
+
let(:success) { true }
|
76
|
+
it { expect { subject }.to change { record.internal_id }.to(:internal_id) }
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'when not success' do
|
80
|
+
let(:success) { false }
|
81
|
+
it { expect { subject rescue nil }.to_not \
|
82
|
+
change { record.internal_id }.to(:internal_id) }
|
83
|
+
it { expect { subject }.to raise_error NetsuiteError }
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
62
88
|
describe '#update' do
|
63
|
-
subject {
|
89
|
+
subject { record.update }
|
64
90
|
|
65
|
-
before {
|
91
|
+
before { record.client.stub(:update).with(record) { result } }
|
66
92
|
let(:result) { double }
|
67
93
|
|
68
94
|
it { should be result }
|
69
95
|
end
|
70
96
|
|
71
97
|
describe '#delete' do
|
72
|
-
subject {
|
98
|
+
subject { record.delete }
|
73
99
|
|
74
100
|
before do
|
75
101
|
client.stub(:delete) { result }
|
76
|
-
|
102
|
+
record.internal_id = 100
|
77
103
|
end
|
78
104
|
let(:result) { double success?: success }
|
79
105
|
let(:success) { true }
|
@@ -81,34 +107,34 @@ describe Record do
|
|
81
107
|
|
82
108
|
context 'when it is success' do
|
83
109
|
let(:success) { true }
|
84
|
-
it { expect { subject }.to change {
|
110
|
+
it { expect { subject }.to change { record.internal_id }.to(nil) }
|
85
111
|
end
|
86
112
|
|
87
113
|
context 'when it is failure' do
|
88
114
|
let(:success) { false }
|
89
|
-
it { expect { subject }.to_not change {
|
115
|
+
it { expect { subject }.to_not change { record.internal_id }.from(100) }
|
90
116
|
end
|
91
117
|
end
|
92
118
|
|
93
119
|
describe '#client' do
|
94
|
-
subject {
|
95
|
-
before {
|
120
|
+
subject { record.client }
|
121
|
+
before { record.class.client = client }
|
96
122
|
let(:client) { double }
|
97
123
|
|
98
124
|
it { should be client }
|
99
125
|
end
|
100
126
|
|
101
127
|
describe '#load' do
|
102
|
-
subject {
|
103
|
-
before {
|
128
|
+
subject { record.load }
|
129
|
+
before { record.instance_variable_set(:@loaded, loaded) }
|
104
130
|
let(:loaded) { double }
|
105
131
|
|
106
|
-
it { should be
|
132
|
+
it { should be record }
|
107
133
|
|
108
134
|
context 'when already loaded' do
|
109
135
|
let(:loaded) { true }
|
110
136
|
|
111
|
-
it { should be
|
137
|
+
it { should be record }
|
112
138
|
it do
|
113
139
|
client.should_not_receive(:get)
|
114
140
|
subject
|
@@ -119,38 +145,38 @@ describe Record do
|
|
119
145
|
let(:loaded) { false }
|
120
146
|
|
121
147
|
before do
|
122
|
-
|
123
|
-
client.stub(:get) { double record:
|
148
|
+
record.internal_id = 123
|
149
|
+
client.stub(:get) { double record: result }
|
124
150
|
end
|
125
151
|
|
126
|
-
let(:
|
152
|
+
let(:result) do
|
127
153
|
double getters: [:foo, :bar],
|
128
154
|
foo: :foo,
|
129
155
|
bar: :bar
|
130
156
|
end
|
131
157
|
|
132
|
-
it { expect { subject }.to change {
|
133
|
-
it { expect { subject }.to change {
|
134
|
-
it { expect { subject }.to change {
|
158
|
+
it { expect { subject }.to change { record.loaded? }.to(true) }
|
159
|
+
it { expect { subject }.to change { record.foo }.to(:foo) }
|
160
|
+
it { expect { subject }.to change { record.bar }.to(:bar) }
|
135
161
|
end
|
136
162
|
end
|
137
163
|
|
138
164
|
describe '#loaded?' do
|
139
|
-
subject {
|
140
|
-
before {
|
165
|
+
subject { record.loaded? }
|
166
|
+
before { record.instance_variable_set(:@loaded, true) }
|
141
167
|
it { should be_true }
|
142
168
|
end
|
143
169
|
|
144
170
|
describe '#ref' do
|
145
|
-
subject {
|
171
|
+
subject { record.ref }
|
146
172
|
|
147
173
|
it { should be_a RecordRef }
|
148
174
|
its(:type) { should eq "record" }
|
149
|
-
its(:internal_id) { should eq
|
175
|
+
its(:internal_id) { should eq record.internal_id }
|
150
176
|
end
|
151
177
|
|
152
178
|
describe '#setters' do
|
153
|
-
subject {
|
179
|
+
subject { record.setters }
|
154
180
|
it do
|
155
181
|
should include :foo=, :bar=, :nullFieldList=,
|
156
182
|
:xmlattr_externalId=, :xmlattr_internalId=
|
@@ -158,12 +184,68 @@ describe Record do
|
|
158
184
|
end
|
159
185
|
|
160
186
|
describe '#getters' do
|
161
|
-
subject {
|
187
|
+
subject { record.getters }
|
162
188
|
it do
|
163
189
|
should include :foo, :bar, :xmlattr_externalId, :xmlattr_internalId
|
164
190
|
end
|
165
191
|
end
|
166
192
|
|
193
|
+
describe '.list' do
|
194
|
+
subject { described_class.list(objects) }
|
195
|
+
|
196
|
+
let(:ids) { [10, 20] }
|
197
|
+
|
198
|
+
let(:recs) do
|
199
|
+
ids.map do |id|
|
200
|
+
rec = Record.new
|
201
|
+
rec.internal_id = id
|
202
|
+
rec
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
let(:refs) do
|
207
|
+
ids.map do |id|
|
208
|
+
ref = RecordRef.new
|
209
|
+
ref.internal_id = id
|
210
|
+
ref.type = 'record'
|
211
|
+
ref
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
context 'when internal ids given' do
|
216
|
+
let(:objects) { ids }
|
217
|
+
|
218
|
+
it do
|
219
|
+
described_class.client.should_receive(:get_list) do |args|
|
220
|
+
args == refs
|
221
|
+
end
|
222
|
+
subject
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
context 'when Records given' do
|
227
|
+
let(:objects) { recs }
|
228
|
+
|
229
|
+
it do
|
230
|
+
described_class.client.should_receive(:get_list) do |args|
|
231
|
+
args == refs
|
232
|
+
end
|
233
|
+
subject
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context 'when Refs given' do
|
238
|
+
let(:objects) { refs }
|
239
|
+
|
240
|
+
it do
|
241
|
+
described_class.client.should_receive(:get_list) do |args|
|
242
|
+
args == refs
|
243
|
+
end
|
244
|
+
subject
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
167
249
|
describe '.delete' do
|
168
250
|
subject { described_class.delete(objects) }
|
169
251
|
|
@@ -295,4 +377,61 @@ describe Record do
|
|
295
377
|
subject { Record.basic_search_class }
|
296
378
|
it { should be RecordSearchBasic }
|
297
379
|
end
|
380
|
+
|
381
|
+
describe '#active?' do
|
382
|
+
subject { record.active? }
|
383
|
+
|
384
|
+
context 'when is_inactive=true' do
|
385
|
+
before { record.is_inactive = true }
|
386
|
+
it { should be_false }
|
387
|
+
end
|
388
|
+
|
389
|
+
context 'when is_inactive=false' do
|
390
|
+
before { record.is_inactive = false }
|
391
|
+
it { should be_true }
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
describe '#save' do
|
396
|
+
subject { record.save }
|
397
|
+
let :result do
|
398
|
+
double success?: true, internal_id: 123
|
399
|
+
end
|
400
|
+
before do
|
401
|
+
client.stub(:add).with(record) { result }
|
402
|
+
end
|
403
|
+
|
404
|
+
context 'when new record' do
|
405
|
+
before { record.internal_id = nil }
|
406
|
+
specify do
|
407
|
+
client.should_receive(:add).with(record) { result }
|
408
|
+
subject
|
409
|
+
end
|
410
|
+
|
411
|
+
it { expect { subject }.to change { record.internal_id }.to(123) }
|
412
|
+
end
|
413
|
+
|
414
|
+
context 'when existing record' do
|
415
|
+
before { record.internal_id = 123 }
|
416
|
+
specify do
|
417
|
+
client.should_receive(:update).with(record) { result }
|
418
|
+
subject
|
419
|
+
end
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
describe '#new?' do
|
424
|
+
subject { record.new? }
|
425
|
+
before { record.internal_id = internal_id }
|
426
|
+
|
427
|
+
context 'when there is no internal_id' do
|
428
|
+
let(:internal_id) { nil }
|
429
|
+
it { should be_true }
|
430
|
+
end
|
431
|
+
|
432
|
+
context 'when there is internal_id' do
|
433
|
+
let(:internal_id) { 123 }
|
434
|
+
it { should be_false }
|
435
|
+
end
|
436
|
+
end
|
298
437
|
end
|
@@ -10,41 +10,89 @@ describe SearchRecord do
|
|
10
10
|
search.record_class = Record
|
11
11
|
search
|
12
12
|
end
|
13
|
+
let(:client) { double search: response }
|
14
|
+
let(:response) { double }
|
13
15
|
|
14
16
|
before do
|
15
17
|
Record.stub(:client) { client }
|
16
18
|
SearchRecord.stub(:inflected_method) { :foo }
|
17
19
|
end
|
18
20
|
|
19
|
-
describe '#each' do
|
20
|
-
subject { search.each }
|
21
|
-
let(:client) { double search: response }
|
22
|
-
let(:response) { [:a, :b, :c] }
|
23
|
-
it do
|
24
|
-
search.response.should_receive(:each).and_yield(response)
|
25
|
-
subject
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
21
|
describe '#where' do
|
30
22
|
subject { search.where *args }
|
31
23
|
let(:args) { double }
|
32
24
|
|
33
25
|
context 'when foo: "bar" given' do
|
34
26
|
let(:args) { [{foo: 'bar'}] }
|
35
|
-
let :where do
|
36
|
-
where = SearchRecord.new
|
37
|
-
where.foo = SearchStringField.new
|
38
|
-
where.foo.xmlattr_operator = SearchStringFieldOperator::Is
|
39
|
-
where.foo.searchValue = 'bar'
|
40
|
-
where
|
41
|
-
end
|
42
27
|
|
43
28
|
it { should be_a SearchRecord }
|
29
|
+
it { should_not be search }
|
44
30
|
its(:foo) { should be_a SearchStringField }
|
45
31
|
its('foo.xmlattr_operator') { should eq SearchStringFieldOperator::Is }
|
46
32
|
its('foo.searchValue') { 'bar' }
|
47
33
|
end
|
34
|
+
|
35
|
+
context 'when foo: 10 given' do
|
36
|
+
let(:args) { [{foo: 10} ] }
|
37
|
+
|
38
|
+
it { should be_a SearchRecord }
|
39
|
+
it { should_not be search }
|
40
|
+
its(:foo) { should be_a SearchLongField }
|
41
|
+
its('foo.xmlattr_operator') { should eq SearchLongFieldOperator::EqualTo }
|
42
|
+
its('foo.searchValue') { 10 }
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when foo: Date.new(2000, 1, 2) given' do
|
46
|
+
let(:args) { [{foo: Date.new(2000, 1, 2)} ] }
|
47
|
+
|
48
|
+
it { should be_a SearchRecord }
|
49
|
+
it { should_not be search }
|
50
|
+
its(:foo) { should be_a SearchDateField }
|
51
|
+
its('foo.xmlattr_operator') { should eq SearchDateFieldOperator::On }
|
52
|
+
its('foo.searchValue') { Date.new(2000, 1, 2) }
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when :foo, :has_keywords, "key" given' do
|
56
|
+
let(:args) { [:foo, :has_keywords, 'key'] }
|
57
|
+
|
58
|
+
it { should be_a SearchRecord }
|
59
|
+
it { should_not be search }
|
60
|
+
its(:foo) { should be_a SearchStringField }
|
61
|
+
its('foo.xmlattr_operator') { should eq SearchStringFieldOperator::HasKeywords }
|
62
|
+
its('foo.searchValue') { 'key' }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#find_by' do
|
67
|
+
subject { search.find_by *args }
|
68
|
+
end
|
69
|
+
|
70
|
+
describe 'response delegators' do
|
71
|
+
[:page_index, :page_size, :search_id, :total_pages,
|
72
|
+
:total_records, :more?, :next, :each].each do |method|
|
73
|
+
|
74
|
+
describe "#{method}" do
|
75
|
+
subject { search.send method }
|
76
|
+
let(:response) { double method => value }
|
77
|
+
let(:value) { double }
|
78
|
+
specify do
|
79
|
+
client.should_receive(:search).with(search) { response }
|
80
|
+
should eq value
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe '#find_by' do
|
87
|
+
subject { search.find_by *args }
|
88
|
+
before do
|
89
|
+
search.stub(:where).with(args) { response }
|
90
|
+
end
|
91
|
+
let(:args) { double }
|
92
|
+
let(:response) { double first: record }
|
93
|
+
let(:record) { double }
|
94
|
+
|
95
|
+
it { should eq record }
|
48
96
|
end
|
49
97
|
end
|
50
98
|
|
@@ -3,8 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe SearchResult do
|
4
4
|
let(:result) { SearchResult.new }
|
5
5
|
|
6
|
-
describe '#
|
7
|
-
subject { result.
|
6
|
+
describe '#more?' do
|
7
|
+
subject { result.more? }
|
8
8
|
before do
|
9
9
|
result.page_index = page_index
|
10
10
|
result.total_pages = total_pages
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Status do
|
4
|
+
let(:status) { described_class.new }
|
5
|
+
|
6
|
+
describe '#success?' do
|
7
|
+
subject { status.success? }
|
8
|
+
before { status.stub(:xmlattr_isSuccess) { false } }
|
9
|
+
it { should be_false }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#failure?' do
|
13
|
+
subject { status.failure? }
|
14
|
+
before { status.stub(:xmlattr_isSuccess) { false } }
|
15
|
+
it { should be_true }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#code' do
|
19
|
+
subject { status.code }
|
20
|
+
before do
|
21
|
+
status.stub(:statusDetail) { status_detail }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when there is statusDetail' do
|
25
|
+
let(:status_detail) { [double(code: :code)] }
|
26
|
+
it { should be :code }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when there is no statusDetail' do
|
30
|
+
let(:status_detail) { nil }
|
31
|
+
it { should be_nil }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#message' do
|
36
|
+
subject { status.message }
|
37
|
+
before do
|
38
|
+
status.stub(:statusDetail) { status_detail }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when there is statusDetail' do
|
42
|
+
let(:status_detail) { [double(message: :message)] }
|
43
|
+
it { should be :message }
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when there is no statusDetail' do
|
47
|
+
let(:status_detail) { nil }
|
48
|
+
it { should be_nil }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#duplicate?' do
|
53
|
+
subject { status.duplicate? }
|
54
|
+
before do
|
55
|
+
status.stub(:statusDetail) { [double(code: code)] }
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when code==DUP_ITEM for example' do
|
59
|
+
let(:code) { 'DUP_ITEM' }
|
60
|
+
it { should be_true }
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when code==COGS_ERROR for example' do
|
64
|
+
let(:code) { 'COGS_ERROR' }
|
65
|
+
it { should be_false }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#missing_method' do
|
70
|
+
subject { status.send method }
|
71
|
+
before do
|
72
|
+
status.stub(:statusDetail) { [double(code: code)] }
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when method ends with ? and matches code' do
|
76
|
+
let(:method) { :dup_item? }
|
77
|
+
let(:code) { 'DUP_ITEM' }
|
78
|
+
it { should be_true }
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'when method ends with ? and does not match code' do
|
82
|
+
let(:method) { :dup_item? }
|
83
|
+
let(:code) { 'COGS_ERROR' }
|
84
|
+
it { should be_false }
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'when method does not end with ?' do
|
88
|
+
let(:method) { :missing }
|
89
|
+
it 'does not try to evaluate code' do
|
90
|
+
status.should_not_receive(:code)
|
91
|
+
subject rescue nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -105,8 +105,39 @@ describe Client do
|
|
105
105
|
it do
|
106
106
|
client.driver.should_receive(:addList) do |req|
|
107
107
|
req.should be_a AddListRequest
|
108
|
-
req.should
|
109
|
-
|
108
|
+
req.should eq recs
|
109
|
+
res
|
110
|
+
end
|
111
|
+
should eq res
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe '#update' do
|
116
|
+
subject { client.update(rec) }
|
117
|
+
|
118
|
+
let(:rec) { double }
|
119
|
+
let(:res) { double }
|
120
|
+
|
121
|
+
it do
|
122
|
+
client.driver.should_receive(:update) do |req|
|
123
|
+
req.should be_a UpdateRequest
|
124
|
+
req.record.should be rec
|
125
|
+
res
|
126
|
+
end
|
127
|
+
should eq res
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#update_list' do
|
132
|
+
subject { client.update_list(recs) }
|
133
|
+
|
134
|
+
let(:recs) { [double] }
|
135
|
+
let(:res) { double }
|
136
|
+
|
137
|
+
it do
|
138
|
+
client.driver.should_receive(:updateList) do |req|
|
139
|
+
req.should be_a UpdateListRequest
|
140
|
+
req.should eq recs
|
110
141
|
res
|
111
142
|
end
|
112
143
|
should eq res
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activenetsuite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stan Mazhara
|
@@ -149,6 +149,7 @@ files:
|
|
149
149
|
- lib/activenetsuite/core/search_record.rb
|
150
150
|
- lib/activenetsuite/core/search_result.rb
|
151
151
|
- lib/activenetsuite/core/status.rb
|
152
|
+
- lib/activenetsuite/core/status_detail.rb
|
152
153
|
- lib/activenetsuite/helpers/client.rb
|
153
154
|
- lib/activenetsuite/helpers/error.rb
|
154
155
|
- lib/activenetsuite/helpers/method_inflector.rb
|
@@ -159,6 +160,7 @@ files:
|
|
159
160
|
- lib/activenetsuite/messages/delete_response.rb
|
160
161
|
- lib/activenetsuite/messages/get_deleted_response.rb
|
161
162
|
- lib/activenetsuite/messages/get_deleted_result.rb
|
163
|
+
- lib/activenetsuite/messages/get_list_response.rb
|
162
164
|
- lib/activenetsuite/messages/get_response.rb
|
163
165
|
- lib/activenetsuite/messages/read_response.rb
|
164
166
|
- lib/activenetsuite/messages/search_more_with_id_response.rb
|
@@ -173,6 +175,8 @@ files:
|
|
173
175
|
- lib/activenetsuite/soap/default.rb
|
174
176
|
- lib/activenetsuite/soap/defaultDriver.rb
|
175
177
|
- lib/activenetsuite/soap/defaultMappingRegistry.rb
|
178
|
+
- lib/activenetsuite/types/search_date.rb
|
179
|
+
- lib/activenetsuite/types/search_date_field_operator.rb
|
176
180
|
- lib/activenetsuite/version.rb
|
177
181
|
- spec/lib/activenetsuite/accounting/account_spec.rb
|
178
182
|
- spec/lib/activenetsuite/accounting/non_inventory_sale_item_spec.rb
|
@@ -180,6 +184,7 @@ files:
|
|
180
184
|
- spec/lib/activenetsuite/core/record_spec.rb
|
181
185
|
- spec/lib/activenetsuite/core/search_record_spec.rb
|
182
186
|
- spec/lib/activenetsuite/core/search_result_spec.rb
|
187
|
+
- spec/lib/activenetsuite/core/status_spec.rb
|
183
188
|
- spec/lib/activenetsuite/helpers/client_spec.rb
|
184
189
|
- spec/lib/activenetsuite/helpers/method_inflector_spec.rb
|
185
190
|
- spec/lib/activenetsuite/helpers/search_response_methods_spec.rb
|
@@ -189,6 +194,8 @@ files:
|
|
189
194
|
- spec/lib/activenetsuite/relationships/vendor_spec.rb
|
190
195
|
- spec/lib/activenetsuite/sales/cash_refund_spec.rb
|
191
196
|
- spec/lib/activenetsuite/sales/cash_sale_spec.rb
|
197
|
+
- spec/lib/activenetsuite/types/search_date_field_operator_spec.rb
|
198
|
+
- spec/lib/activenetsuite/types/search_date_spec.rb
|
192
199
|
- spec/spec_helper.rb
|
193
200
|
homepage: https://github.com/smazhara/activenetsuite
|
194
201
|
licenses:
|