td-client 0.9.0dev2 → 1.0.0
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/td/client.rb +16 -8
- data/lib/td/client/api.rb +66 -47
- data/lib/td/client/api/bulk_import.rb +1 -2
- data/lib/td/client/api/bulk_load.rb +3 -3
- data/lib/td/client/api/export.rb +12 -0
- data/lib/td/client/api/import.rb +3 -2
- data/lib/td/client/api/job.rb +146 -71
- data/lib/td/client/api/schedule.rb +1 -1
- data/lib/td/client/api_error.rb +5 -0
- data/lib/td/client/model.rb +92 -28
- data/lib/td/client/version.rb +1 -1
- data/spec/spec_helper.rb +5 -5
- data/spec/td/client/account_api_spec.rb +5 -5
- data/spec/td/client/api_error_spec.rb +77 -0
- data/spec/td/client/api_spec.rb +76 -52
- data/spec/td/client/api_ssl_connection_spec.rb +1 -1
- data/spec/td/client/bulk_import_spec.rb +28 -29
- data/spec/td/client/bulk_load_spec.rb +60 -35
- data/spec/td/client/db_api_spec.rb +1 -1
- data/spec/td/client/export_api_spec.rb +11 -1
- data/spec/td/client/import_api_spec.rb +85 -10
- data/spec/td/client/job_api_spec.rb +568 -61
- data/spec/td/client/model_job_spec.rb +27 -10
- data/spec/td/client/model_schedule_spec.rb +2 -2
- data/spec/td/client/model_schema_spec.rb +134 -0
- data/spec/td/client/partial_delete_api_spec.rb +1 -1
- data/spec/td/client/result_api_spec.rb +3 -3
- data/spec/td/client/sched_api_spec.rb +12 -4
- data/spec/td/client/server_status_api_spec.rb +2 -2
- data/spec/td/client/spec_resources.rb +1 -0
- data/spec/td/client/table_api_spec.rb +14 -14
- data/spec/td/client/user_api_spec.rb +12 -12
- data/spec/td/client_sched_spec.rb +31 -6
- data/spec/td/client_spec.rb +1 -0
- metadata +42 -81
@@ -26,7 +26,7 @@ describe 'Job Model' do
|
|
26
26
|
'job_id', 'type', 'query', 'status', 'url', 'debug',
|
27
27
|
'start_at', 'end_at', 'cpu_time', 'result_size', 'result', 'result_url',
|
28
28
|
'hive_result_schema', 'priority', 'retry_limit', 'org_name', 'db_name',
|
29
|
-
'duration'
|
29
|
+
'duration', 'num_records'
|
30
30
|
].map {|name| job_attributes[name]}
|
31
31
|
end
|
32
32
|
|
@@ -43,20 +43,20 @@ describe 'Job Model' do
|
|
43
43
|
let(:io) { StringIO.new }
|
44
44
|
|
45
45
|
context 'not finished?' do
|
46
|
-
before { job.
|
46
|
+
before { allow(job).to receive(:finished?) { false } }
|
47
47
|
|
48
48
|
it 'do not call #job_result_raw' do
|
49
|
-
client.
|
49
|
+
expect(client).not_to receive(:job_result_raw)
|
50
50
|
|
51
51
|
expect(job.result_raw(format, io)).to_not be
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
context 'finished?' do
|
56
|
-
before { job.
|
56
|
+
before { allow(job).to receive(:finished?) { true } }
|
57
57
|
|
58
58
|
it 'call #job_result_raw' do
|
59
|
-
client.
|
59
|
+
expect(client).to receive(:job_result_raw).with(job_id, format, io)
|
60
60
|
|
61
61
|
job.result_raw(format, io)
|
62
62
|
end
|
@@ -90,14 +90,17 @@ describe 'Job Model' do
|
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'calls a given block in every wait_interval second' do
|
93
|
+
now = 1_400_000_000
|
94
|
+
allow(self).to receive(:sleep){|arg| now += arg }
|
95
|
+
allow(Process).to receive(:clock_gettime){ now }
|
93
96
|
expect { |b|
|
94
97
|
begin
|
95
98
|
thread = Thread.start {
|
96
|
-
job.wait(nil,
|
99
|
+
job.wait(nil, 2, &b)
|
97
100
|
}
|
98
|
-
sleep
|
101
|
+
sleep 6
|
99
102
|
change_job_status(Job::STATUS_SUCCESS)
|
100
|
-
thread.join(
|
103
|
+
thread.join(1)
|
101
104
|
expect(thread).to be_stop
|
102
105
|
ensure
|
103
106
|
thread.kill # just in case
|
@@ -108,12 +111,26 @@ describe 'Job Model' do
|
|
108
111
|
|
109
112
|
context 'with timeout' do
|
110
113
|
context 'the job running time is too long' do
|
111
|
-
it 'raise
|
114
|
+
it 'raise Timeout::Error' do
|
112
115
|
expect {
|
113
116
|
job.wait(0.1)
|
114
|
-
}.to raise_error(
|
117
|
+
}.to raise_error(Timeout::Error)
|
115
118
|
end
|
116
119
|
end
|
120
|
+
|
121
|
+
it 'calls a given block in every wait_interval second, and timeout' do
|
122
|
+
expect { |b|
|
123
|
+
begin
|
124
|
+
thread = Thread.start {
|
125
|
+
job.wait(0.3, 0.1, &b)
|
126
|
+
}
|
127
|
+
expect{ thread.value }.to raise_error(Timeout::Error)
|
128
|
+
expect(thread).to be_stop
|
129
|
+
ensure
|
130
|
+
thread.kill # just in case
|
131
|
+
end
|
132
|
+
}.to yield_control.at_least(2).times
|
133
|
+
end
|
117
134
|
end
|
118
135
|
end
|
119
136
|
end
|
@@ -14,11 +14,11 @@ describe 'Schedule Model' do
|
|
14
14
|
let(:num) { 1 }
|
15
15
|
|
16
16
|
before do
|
17
|
-
API.
|
17
|
+
allow(API).to receive(:new).with(api_key, {}).and_return(api)
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'success call api' do
|
21
|
-
api.
|
21
|
+
expect(api).to receive(:run_schedule).with(name, time, num).and_return([])
|
22
22
|
|
23
23
|
schedule.run(time, num)
|
24
24
|
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'td/client/spec_resources'
|
3
|
+
|
4
|
+
describe 'TreasureData::Schema::Field' do
|
5
|
+
describe '.new' do
|
6
|
+
context 'name="v"' do
|
7
|
+
it 'raises ParameterValidationError' do
|
8
|
+
expect{ Schema::Field.new('v', 'int') }.to raise_error(ParameterValidationError)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
context 'name="time"' do
|
12
|
+
it 'raises ParameterValidationError' do
|
13
|
+
expect{ Schema::Field.new('time', 'int') }.to raise_error(ParameterValidationError)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
context 'name with UTF-8' do
|
17
|
+
it 'works' do
|
18
|
+
name = "\u3042\u3044\u3046"
|
19
|
+
f = Schema::Field.new(name, 'int')
|
20
|
+
expect(f.name).to eq name
|
21
|
+
expect(f.type).to eq 'int'
|
22
|
+
expect(f.sql_alias).to be_nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
context 'with sql_alias' do
|
26
|
+
it 'raises' do
|
27
|
+
f = Schema::Field.new('t:t', 'int', 'alice')
|
28
|
+
expect(f.name).to eq 't:t'
|
29
|
+
expect(f.type).to eq 'int'
|
30
|
+
expect(f.sql_alias).to eq 'alice'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
context 'with invalid sql_alias' do
|
34
|
+
it 'raises' do
|
35
|
+
expect{ Schema::Field.new('t:t', 'int', 't:t') }.to raise_error(ParameterValidationError)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'TreasureData::Schema' do
|
42
|
+
describe '.parse' do
|
43
|
+
let(:columns){ ["foo:int", "BAR\u3070\u30FC:string@bar", "baz:baz!:array<double>@baz"] }
|
44
|
+
it do
|
45
|
+
sc = Schema.parse(columns)
|
46
|
+
expect(sc.fields.size).to eq 3
|
47
|
+
expect(sc.fields[0].name).to eq 'foo'
|
48
|
+
expect(sc.fields[0].type).to eq 'int'
|
49
|
+
expect(sc.fields[0].sql_alias).to be_nil
|
50
|
+
expect(sc.fields[1].name).to eq "BAR\u3070\u30FC"
|
51
|
+
expect(sc.fields[1].type).to eq 'string'
|
52
|
+
expect(sc.fields[1].sql_alias).to eq 'bar'
|
53
|
+
expect(sc.fields[2].name).to eq 'baz:baz!'
|
54
|
+
expect(sc.fields[2].type).to eq 'array<double>'
|
55
|
+
expect(sc.fields[2].sql_alias).to eq 'baz'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '.new' do
|
60
|
+
it do
|
61
|
+
f = Schema::Field.new('a', 'int')
|
62
|
+
sc = Schema.new([f])
|
63
|
+
expect(sc.fields[0]).to eq f
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#fields' do
|
68
|
+
it do
|
69
|
+
f = Schema::Field.new('a', 'int')
|
70
|
+
sc = Schema.new([f])
|
71
|
+
expect(sc.fields[0]).to eq f
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#add_field' do
|
76
|
+
it do
|
77
|
+
f = Schema::Field.new('a', 'int')
|
78
|
+
sc = Schema.new([f])
|
79
|
+
sc.add_field('b', 'double', 'bb')
|
80
|
+
expect(sc.fields[1].name).to eq 'b'
|
81
|
+
end
|
82
|
+
it 'raises ParameterValidationError if name is duplicated' do
|
83
|
+
f = Schema::Field.new('a', 'int')
|
84
|
+
sc = Schema.new([f])
|
85
|
+
expect{ sc.add_field('a', 'double') }.to raise_error(ParameterValidationError)
|
86
|
+
end
|
87
|
+
it 'raises ParameterValidationError if sql_alias is duplicated' do
|
88
|
+
f = Schema::Field.new('a', 'int')
|
89
|
+
sc = Schema.new([f])
|
90
|
+
expect{ sc.add_field('abc', 'double', 'a') }.to raise_error(ParameterValidationError)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe '#merge' do
|
95
|
+
it do
|
96
|
+
sc1 = Schema.parse(['foo:int', 'bar:float'])
|
97
|
+
sc2 = Schema.parse(['bar:double', 'baz:string'])
|
98
|
+
sc3 = sc1.merge(sc2)
|
99
|
+
expect(sc3.fields.size).to eq 3
|
100
|
+
expect(sc3.fields[0].name).to eq 'foo'
|
101
|
+
expect(sc3.fields[0].type).to eq 'int'
|
102
|
+
expect(sc3.fields[1].name).to eq 'bar'
|
103
|
+
expect(sc3.fields[1].type).to eq 'double'
|
104
|
+
expect(sc3.fields[2].name).to eq 'baz'
|
105
|
+
expect(sc3.fields[2].type).to eq 'string'
|
106
|
+
end
|
107
|
+
it do
|
108
|
+
sc1 = Schema.parse(['foo:int', 'bar:float'])
|
109
|
+
sc2 = Schema.parse(['bar:double@foo'])
|
110
|
+
expect{ sc1.merge(sc2) }.to raise_error(ArgumentError)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '#to_json' do
|
115
|
+
it do
|
116
|
+
sc = Schema.parse(['foo:int', 'bar:float@baz'])
|
117
|
+
expect(sc.to_json).to eq '[["foo","int"],["bar","float","baz"]]'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#from_json' do
|
122
|
+
it do
|
123
|
+
sc = Schema.new
|
124
|
+
sc.from_json [["foo","int"],["bar","float","baz"]]
|
125
|
+
expect(sc.fields.size).to eq 2
|
126
|
+
expect(sc.fields[0].name).to eq 'foo'
|
127
|
+
expect(sc.fields[0].type).to eq 'int'
|
128
|
+
expect(sc.fields[0].sql_alias).to be_nil
|
129
|
+
expect(sc.fields[1].name).to eq 'bar'
|
130
|
+
expect(sc.fields[1].type).to eq 'float'
|
131
|
+
expect(sc.fields[1].sql_alias).to eq 'baz'
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -27,7 +27,7 @@ describe 'PartialDelete API' do
|
|
27
27
|
stub_api_request(:post, "/v3/table/partialdelete/#{e(db_name)}/#{e(table_name)}").with(:body => from_to).
|
28
28
|
to_return(:body => {'database' => db_name, 'table' => table_name, 'job_id' => '1'}.to_json)
|
29
29
|
|
30
|
-
api.partial_delete(db_name, table_name, to, from).
|
30
|
+
expect(api.partial_delete(db_name, table_name, to, from)).to eq('1')
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'should return 404 error with non exist database name' do
|
@@ -14,7 +14,7 @@ describe 'Result API' do
|
|
14
14
|
params = {'url' => result_url}
|
15
15
|
stub_api_request(:post, "/v3/result/create/#{e(result_name)}").with(:body => params).to_return(:body => {'result' => result_name}.to_json)
|
16
16
|
|
17
|
-
api.create_result(result_name, result_url).
|
17
|
+
expect(api.create_result(result_name, result_url)).to be true
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should return 422 error with invalid name' do
|
@@ -56,14 +56,14 @@ describe 'Result API' do
|
|
56
56
|
it 'should return name and url' do
|
57
57
|
stub_api_request(:get, '/v3/result/list').
|
58
58
|
to_return(:body => {'results' => [{'name' => 'name', 'url' => 'url'}]}.to_json)
|
59
|
-
api.list_result.
|
59
|
+
expect(api.list_result).to eq([['name', 'url', nil]])
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
63
|
describe 'delete_result' do
|
64
64
|
it 'should delete the result' do
|
65
65
|
stub_api_request(:post, "/v3/result/delete/#{e(result_name)}")
|
66
|
-
api.delete_result(result_name).
|
66
|
+
expect(api.delete_result(result_name)).to eq(true)
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'should raise error' do
|
@@ -20,7 +20,15 @@ describe 'Schedule API' do
|
|
20
20
|
with(:body => opts.merge('type' => 'hive')).
|
21
21
|
to_return(:body => {'name' => sched_name, 'start' => start.to_s}.to_json)
|
22
22
|
|
23
|
-
api.create_schedule(sched_name, opts.merge('type' => 'hive')).
|
23
|
+
expect(api.create_schedule(sched_name, opts.merge('type' => 'hive'))).to eq(start.to_s)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should create a dummy schedule' do
|
27
|
+
stub_api_request(:post, "/v3/schedule/create/#{e(sched_name)}").
|
28
|
+
with(:body => opts.merge('type' => 'hive')).
|
29
|
+
to_return(:body => {'name' => sched_name, 'start' => nil}.to_json)
|
30
|
+
|
31
|
+
expect(api.create_schedule(sched_name, opts.merge('type' => 'hive'))).to be_nil
|
24
32
|
end
|
25
33
|
|
26
34
|
it 'should return 422 error with invalid name' do
|
@@ -40,7 +48,7 @@ describe 'Schedule API' do
|
|
40
48
|
it 'should delete the schedule' do
|
41
49
|
stub_api_request(:post, "/v3/schedule/delete/#{e(sched_name)}").
|
42
50
|
to_return(:body => {'cron' => 'cron', 'query' => 'query'}.to_json)
|
43
|
-
api.delete_schedule(sched_name).
|
51
|
+
expect(api.delete_schedule(sched_name)).to eq(['cron', 'query'])
|
44
52
|
end
|
45
53
|
end
|
46
54
|
|
@@ -86,7 +94,7 @@ describe 'Schedule API' do
|
|
86
94
|
stub_api_request(:get, "/v3/schedule/history/#{e(sched_name)}").
|
87
95
|
with(:query => {'from' => 0, 'to' => 100}).
|
88
96
|
to_return(:body => {'history' => [history]}.to_json)
|
89
|
-
api.history(sched_name, 0, 100).
|
97
|
+
expect(api.history(sched_name, 0, 100)).to eq([[nil, 'job_id', :type, 'status', 'query', 'start_at', 'end_at', 'result', 'priority', 'database']])
|
90
98
|
end
|
91
99
|
end
|
92
100
|
|
@@ -95,7 +103,7 @@ describe 'Schedule API' do
|
|
95
103
|
stub_api_request(:post, "/v3/schedule/run/#{e(sched_name)}/123456789").
|
96
104
|
with(:body => {'num' => '5'}).
|
97
105
|
to_return(:body => {'jobs' => [{'job_id' => 'job_id', 'scheduled_at' => 'scheduled_at', 'type' => 'type'}]}.to_json)
|
98
|
-
api.run_schedule(sched_name, 123456789, 5).
|
106
|
+
expect(api.run_schedule(sched_name, 123456789, 5)).to eq([['job_id', :type, 'scheduled_at']])
|
99
107
|
end
|
100
108
|
end
|
101
109
|
end
|
@@ -13,13 +13,13 @@ describe 'ServerStatus API' do
|
|
13
13
|
it 'returns status' do
|
14
14
|
stub_api_request(:get, '/v3/system/server_status').
|
15
15
|
to_return(:body => {'status' => 'OK'}.to_json)
|
16
|
-
api.server_status.
|
16
|
+
expect(api.server_status).to eq('OK')
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'returns error description' do
|
20
20
|
stub_api_request(:get, '/v3/system/server_status').
|
21
21
|
to_return(:status => 500)
|
22
|
-
api.server_status.
|
22
|
+
expect(api.server_status).to eq('Server is down (500)')
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -27,7 +27,7 @@ describe 'Table API' do
|
|
27
27
|
it 'should create a new table if the database exists' do
|
28
28
|
stub_api_request(:post, "/v3/table/create/#{e db_name}/#{e(table_name)}/log").
|
29
29
|
to_return(:body => {'database' => db_name, 'table' => table_name, 'type' => 'log'}.to_json)
|
30
|
-
api.create_log_table(db_name, table_name).
|
30
|
+
expect(api.create_log_table(db_name, table_name)).to be true
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'should return 400 error with invalid name' do
|
@@ -82,10 +82,10 @@ describe 'Table API' do
|
|
82
82
|
describe "'tables' Client API" do
|
83
83
|
it 'should return an array of Table objects' do
|
84
84
|
tables = [
|
85
|
-
["table_1", "item", "[[\"
|
86
|
-
["table_2", "log", "[[\"
|
87
|
-
["table_3", "item", "[[\"
|
88
|
-
["table_4", "log", "[[\"
|
85
|
+
["table_1", "item", "[[\"value\",\"string\"]]", 111, "2013-01-21 01:51:41 UTC", "2014-01-21 01:51:41 UTC"],
|
86
|
+
["table_2", "log", "[[\"value\",\"long\"]]", 222, "2013-02-22 02:52:42 UTC", "2014-02-22 02:52:42 UTC"],
|
87
|
+
["table_3", "item", "[[\"value\",\"string\"]]", 333, "2013-03-23 03:53:43 UTC", "2014-03-23 03:53:43 UTC"],
|
88
|
+
["table_4", "log", "[[\"value\",\"long\"]]", 444, "2013-04-24 04:54:44 UTC", "2014-04-24 04:54:44 UTC"]
|
89
89
|
]
|
90
90
|
stub_api_request(:get, "/v3/table/list/#{e db_name}").
|
91
91
|
to_return(:body => {'tables' => [
|
@@ -138,10 +138,10 @@ describe 'Table API' do
|
|
138
138
|
describe "'table' Client API" do
|
139
139
|
it 'should return the Table object corresponding to the name' do
|
140
140
|
tables = [
|
141
|
-
["table_1", "item", "[[\"
|
142
|
-
["table_2", "log", "[[\"
|
143
|
-
["table_3", "item", "[[\"
|
144
|
-
["table_4", "log", "[[\"
|
141
|
+
["table_1", "item", "[[\"value\",\"string\"]]", 111, "2013-01-21 01:51:41 UTC", "2014-01-21 01:51:41 UTC"],
|
142
|
+
["table_2", "log", "[[\"value\",\"long\"]]", 222, "2013-02-22 02:52:42 UTC", "2014-02-22 02:52:42 UTC"],
|
143
|
+
["table_3", "item", "[[\"value\",\"string\"]]", 333, "2013-03-23 03:53:43 UTC", "2014-03-23 03:53:43 UTC"],
|
144
|
+
["table_4", "log", "[[\"value\",\"long\"]]", 444, "2013-04-24 04:54:44 UTC", "2014-04-24 04:54:44 UTC"]
|
145
145
|
]
|
146
146
|
stub_api_request(:get, "/v3/table/list/#{e db_name}").
|
147
147
|
to_return(:body => {'tables' => [
|
@@ -166,7 +166,7 @@ describe 'Table API' do
|
|
166
166
|
describe 'swap_table' do
|
167
167
|
it 'should swap tables' do
|
168
168
|
stub_api_request(:post, '/v3/table/swap/db/table1/table2')
|
169
|
-
api.swap_table('db', 'table1', 'table2').
|
169
|
+
expect(api.swap_table('db', 'table1', 'table2')).to eq(true)
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
@@ -175,7 +175,7 @@ describe 'Table API' do
|
|
175
175
|
stub_api_request(:post, '/v3/table/update/db/table').
|
176
176
|
with(:body => {'expire_days' => '5'}).
|
177
177
|
to_return(:body => {'type' => 'type'}.to_json)
|
178
|
-
api.update_expire('db', 'table', 5).
|
178
|
+
expect(api.update_expire('db', 'table', 5)).to eq(true)
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
@@ -197,14 +197,14 @@ describe 'Table API' do
|
|
197
197
|
api.tail('db', 'table', 10) do |row|
|
198
198
|
result << row
|
199
199
|
end
|
200
|
-
result.
|
200
|
+
expect(result).to eq([[1, 2, 3], [4, 5, 6]])
|
201
201
|
end
|
202
202
|
|
203
203
|
it 'returns rows' do
|
204
204
|
stub_api_request(:get, '/v3/table/tail/db/table').
|
205
205
|
with(:query => {'format' => 'msgpack', 'count' => '10'}).
|
206
206
|
to_return(:body => packed)
|
207
|
-
api.tail('db', 'table', 10).
|
207
|
+
expect(api.tail('db', 'table', 10)).to eq([[1, 2, 3], [4, 5, 6]])
|
208
208
|
end
|
209
209
|
|
210
210
|
it 'shows deprecated warning for from and to' do
|
@@ -220,7 +220,7 @@ describe 'Table API' do
|
|
220
220
|
$stderr.reopen(backup)
|
221
221
|
w.close
|
222
222
|
end
|
223
|
-
r.read.
|
223
|
+
expect(r.read).to eq(%Q(parameter "to" and "from" no longer work\n))
|
224
224
|
end
|
225
225
|
end
|
226
226
|
end
|
@@ -14,7 +14,7 @@ describe 'User API' do
|
|
14
14
|
it 'returns apikey' do
|
15
15
|
stub_api_request(:post, "/v3/user/authenticate").
|
16
16
|
to_return(:body => {'apikey' => 'apikey'}.to_json)
|
17
|
-
api.authenticate('user', 'password').
|
17
|
+
expect(api.authenticate('user', 'password')).to eq('apikey')
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'raises AuthError for authentication failure' do
|
@@ -38,30 +38,30 @@ describe 'User API' do
|
|
38
38
|
it 'returns users' do
|
39
39
|
stub_api_request(:get, "/v3/user/list").
|
40
40
|
to_return(:body => {'users' => [{'name' => 'name1', 'email' => 'email1'}, {'name' => 'name2', 'email' => 'email2'}]}.to_json)
|
41
|
-
api.list_users.
|
41
|
+
expect(api.list_users).to eq([
|
42
42
|
['name1', nil, nil, 'email1'],
|
43
43
|
['name2', nil, nil, 'email2'],
|
44
|
-
]
|
44
|
+
])
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
describe 'add_user' do
|
49
49
|
it 'runs' do
|
50
50
|
stub_api_request(:post, "/v3/user/add/name").to_return(:body => {}.to_json)
|
51
|
-
api.add_user('name', "org", 'name+suffix@example.com', 'password').
|
51
|
+
expect(api.add_user('name', "org", 'name+suffix@example.com', 'password')).to eq(true)
|
52
52
|
end
|
53
53
|
|
54
54
|
# TODO
|
55
55
|
it 'does not escape sp but it must be a bug' do
|
56
56
|
stub_api_request(:post, "/v3/user/add/!%20%20%20%20@%23$%25%5E&*()_%2B%7C~%2Ecom").to_return(:body => {}.to_json)
|
57
|
-
api.add_user('! @#$%^&*()_+|~.com', "org", 'name+suffix@example.com', 'password').
|
57
|
+
expect(api.add_user('! @#$%^&*()_+|~.com', "org", 'name+suffix@example.com', 'password')).to eq(true)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
describe 'remove_user' do
|
62
62
|
it 'runs' do
|
63
63
|
stub_api_request(:post, "/v3/user/remove/name").to_return(:body => {}.to_json)
|
64
|
-
api.remove_user('name').
|
64
|
+
expect(api.remove_user('name')).to eq(true)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -70,7 +70,7 @@ describe 'User API' do
|
|
70
70
|
stub_api_request(:post, "/v3/user/email/change/name").
|
71
71
|
with(:body => {'email' => 'new@email.com'}).
|
72
72
|
to_return(:body => {}.to_json)
|
73
|
-
api.change_email('name', 'new@email.com').
|
73
|
+
expect(api.change_email('name', 'new@email.com')).to eq(true)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -78,7 +78,7 @@ describe 'User API' do
|
|
78
78
|
it 'runs' do
|
79
79
|
stub_api_request(:get, "/v3/user/apikey/list/name").
|
80
80
|
to_return(:body => {'apikeys' => ['key1', 'key2']}.to_json)
|
81
|
-
api.list_apikeys('name').
|
81
|
+
expect(api.list_apikeys('name')).to eq(['key1', 'key2'])
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
@@ -86,7 +86,7 @@ describe 'User API' do
|
|
86
86
|
it 'does not return the generated apikey because you can list apikey afterwards' do
|
87
87
|
stub_api_request(:post, "/v3/user/apikey/add/name").
|
88
88
|
to_return(:body => {'apikey' => 'apikey'}.to_json)
|
89
|
-
api.add_apikey('name').
|
89
|
+
expect(api.add_apikey('name')).to eq(true)
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
@@ -94,7 +94,7 @@ describe 'User API' do
|
|
94
94
|
it 'runs' do
|
95
95
|
stub_api_request(:post, "/v3/user/apikey/remove/name").
|
96
96
|
to_return(:body => {}.to_json)
|
97
|
-
api.remove_apikey('name', 'apikey').
|
97
|
+
expect(api.remove_apikey('name', 'apikey')).to eq(true)
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
@@ -103,7 +103,7 @@ describe 'User API' do
|
|
103
103
|
stub_api_request(:post, "/v3/user/password/change/name").
|
104
104
|
with(:body => {'password' => 'password'}).
|
105
105
|
to_return(:body => {}.to_json)
|
106
|
-
api.change_password('name', 'password').
|
106
|
+
expect(api.change_password('name', 'password')).to eq(true)
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
@@ -112,7 +112,7 @@ describe 'User API' do
|
|
112
112
|
stub_api_request(:post, "/v3/user/password/change").
|
113
113
|
with(:body => {'old_password' => 'old_password', 'password' => 'password'}).
|
114
114
|
to_return(:body => {}.to_json)
|
115
|
-
api.change_my_password('old_password', 'password').
|
115
|
+
expect(api.change_my_password('old_password', 'password')).to eq(true)
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|