Skip to content

Commit e936932

Browse files
committed
Add more tests for all the API "index" methods. Small search change.
This adds a basic test suite across all the API "index" methods that are used in DataTables to ensure they behave as DataTables expects (pagination, searching, etc). To make testing easier, also add searching for the "_id" field to all the searching. Also adjust "_id" searching to only match the full value, rather than wildcards (since I'm not sure we would ever really need wildcard searches for IDs, and this will make searches a bit easier under the Postgres stuff we're exploring with the explicit UUID type). To make testing easier, also adjust how the datatables "order" param gets parsed to allow for missing indexes (even though this shouldn't really be happening in the real world). But this makes it easier to test to ensure indexes are looped over in numeric order (so we can send in "2" and "12" to test this).
1 parent 9427524 commit e936932

File tree

21 files changed

+826
-107
lines changed

21 files changed

+826
-107
lines changed

src/api-umbrella/web-app/app/controllers/api/v1/admin_groups_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def index
2222
if(params[:search] && params[:search][:value].present?)
2323
@admin_groups = @admin_groups.or([
2424
{ :name => /#{Regexp.escape(params[:search][:value])}/i },
25+
{ :_id => params[:search][:value].downcase },
2526
])
2627
end
2728

src/api-umbrella/web-app/app/controllers/api/v1/admins_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def index
2222
{ :email => /#{Regexp.escape(params["search"]["value"])}/i },
2323
{ :username => /#{Regexp.escape(params["search"]["value"])}/i },
2424
{ :authentication_token => /#{Regexp.escape(params["search"]["value"])}/i },
25-
{ :_id => /#{Regexp.escape(params["search"]["value"])}/i },
25+
{ :_id => params[:search][:value].downcase },
2626
])
2727
end
2828

src/api-umbrella/web-app/app/controllers/api/v1/api_scopes_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def index
2424
{ :name => /#{Regexp.escape(params[:search][:value])}/i },
2525
{ :host => /#{Regexp.escape(params[:search][:value])}/i },
2626
{ :path_prefix => /#{Regexp.escape(params[:search][:value])}/i },
27+
{ :_id => params[:search][:value].downcase },
2728
])
2829
end
2930
end

src/api-umbrella/web-app/app/controllers/api/v1/users_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def index
2626
{ :api_key => /#{Regexp.escape(params["search"]["value"])}/i },
2727
{ :registration_source => /#{Regexp.escape(params["search"]["value"])}/i },
2828
{ :roles => /#{Regexp.escape(params["search"]["value"])}/i },
29-
{ :_id => /#{Regexp.escape(params["search"]["value"])}/i },
29+
{ :_id => params[:search][:value].downcase },
3030
])
3131
end
3232
end

src/api-umbrella/web-app/app/controllers/api/v1/website_backends_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def index
2323
@website_backends = @website_backends.or([
2424
{ :frontend_host => /#{Regexp.escape(params[:search][:value])}/i },
2525
{ :server_host => /#{Regexp.escape(params[:search][:value])}/i },
26+
{ :_id => params[:search][:value].downcase },
2627
])
2728
end
2829
end

src/api-umbrella/web-app/app/helpers/datatables_helper.rb

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,9 @@ def param_index_array(key)
2424
if params[key].is_a?(Array)
2525
as_array = params[key]
2626
elsif params[key].is_a?(Hash)
27-
upper_bound = params[key].length - 1
28-
(0..upper_bound).each do |idx|
29-
if params[key].key?(idx.to_s)
30-
as_array << params[key][idx.to_s]
31-
end
27+
indexes = params[key].keys.sort_by { |k| k.to_i }
28+
indexes.each do |index|
29+
as_array << params[key][index]
3230
end
3331
elsif params.key?(key)
3432
as_array = [params[key]]

test/admin_ui/test_api_scopes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_create
3030
end
3131

3232
def test_update
33-
api_scope = FactoryGirl.create(:api_scope)
33+
api_scope = FactoryGirl.create(:api_scope, :name => "Example", :path_prefix => "/example")
3434

3535
admin_login
3636
visit("/admin/#/api_scopes/#{api_scope.id}/edit")

test/apis/v1/admin_groups/test_index.rb

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ def setup
1010
AdminGroup.delete_all
1111
end
1212

13+
include ApiUmbrellaSharedTests::DataTablesApi
14+
1315
def test_admin_usernames_in_group
1416
group = FactoryGirl.create(:admin_group)
1517
admin_in_group = FactoryGirl.create(:limited_admin, :groups => [
@@ -51,4 +53,116 @@ def test_admin_usernames_empty
5153
assert_equal(1, data["data"].length)
5254
assert_equal([], data["data"][0]["admin_usernames"])
5355
end
56+
57+
def test_response_fields
58+
record = FactoryGirl.create(data_tables_factory_name, {
59+
:created_at => Time.utc(2017, 1, 1),
60+
:created_by => SecureRandom.uuid,
61+
:name => "Example",
62+
:permission_ids => ["analytics", "user_view"],
63+
:updated_at => Time.utc(2017, 1, 2),
64+
:updated_by => SecureRandom.uuid,
65+
})
66+
admin = FactoryGirl.create(:admin, :groups => [record])
67+
68+
response = Typhoeus.get(data_tables_api_url, http_options.deep_merge(admin_token).deep_merge({
69+
:params => {
70+
:search => { :value => record.id },
71+
},
72+
}))
73+
assert_response_code(200, response)
74+
data = MultiJson.load(response.body)
75+
assert_data_tables_root_fields(data)
76+
assert_equal(1, data.fetch("data").length)
77+
78+
record_data = data.fetch("data").first
79+
assert_base_record_fields(record_data)
80+
81+
assert_equal(1, record_data.fetch("admin_usernames").length)
82+
assert_equal(admin.username, record_data.fetch("admin_usernames").first)
83+
assert_equal(1, record_data.fetch("api_scope_display_names").length)
84+
assert_match("- localhost/example", record_data.fetch("api_scope_display_names").first)
85+
assert_equal(1, record_data.fetch("api_scope_ids").length)
86+
assert_match_uuid(record_data.fetch("api_scope_ids").first)
87+
assert_equal("2017-01-01T00:00:00Z", record_data.fetch("created_at"))
88+
assert_match_uuid(record_data.fetch("created_by"))
89+
assert_equal(record.created_by, record_data.fetch("created_by"))
90+
assert_equal("Example", record_data.fetch("name"))
91+
assert_equal(["Analytics", "API Users - View"], record_data.fetch("permission_display_names"))
92+
assert_equal(["analytics", "user_view"], record_data.fetch("permission_ids"))
93+
assert_equal("2017-01-02T00:00:00Z", record_data.fetch("updated_at"))
94+
assert_match_uuid(record_data.fetch("updated_by"))
95+
assert_equal(record.updated_by, record_data.fetch("updated_by"))
96+
end
97+
98+
def test_empty_response_fields
99+
record = FactoryGirl.create(data_tables_factory_name)
100+
101+
response = Typhoeus.get(data_tables_api_url, http_options.deep_merge(admin_token).deep_merge({
102+
:params => {
103+
:search => { :value => record.id },
104+
},
105+
}))
106+
assert_response_code(200, response)
107+
data = MultiJson.load(response.body)
108+
assert_data_tables_root_fields(data)
109+
assert_equal(1, data.fetch("data").length)
110+
111+
record_data = data.fetch("data").first
112+
assert_base_record_fields(record_data)
113+
114+
assert_nil(record_data.fetch("created_by"))
115+
assert_nil(record_data.fetch("updated_by"))
116+
end
117+
118+
def test_search_name
119+
assert_data_tables_search(:name, "NameSearchTest", "amesearcht")
120+
end
121+
122+
def test_order_name
123+
assert_data_tables_order(:name, ["A", "B"])
124+
end
125+
126+
private
127+
128+
def data_tables_api_url
129+
"https://127.0.0.1:9081/api-umbrella/v1/admin_groups.json"
130+
end
131+
132+
def data_tables_factory_name
133+
:admin_group
134+
end
135+
136+
def data_tables_record_count
137+
AdminGroup.where(:deleted_at => nil).count
138+
end
139+
140+
def assert_base_record_fields(record_data)
141+
assert_equal([
142+
"admin_usernames",
143+
"api_scope_display_names",
144+
"api_scope_ids",
145+
"created_at",
146+
"created_by",
147+
"deleted_at",
148+
"id",
149+
"name",
150+
"permission_display_names",
151+
"permission_ids",
152+
"updated_at",
153+
"updated_by",
154+
"version",
155+
].sort, record_data.keys.sort)
156+
assert_kind_of(Array, record_data.fetch("admin_usernames"))
157+
assert_kind_of(Array, record_data.fetch("api_scope_display_names"))
158+
assert_kind_of(Array, record_data.fetch("api_scope_ids"))
159+
assert_match_iso8601(record_data.fetch("created_at"))
160+
assert_nil(record_data.fetch("deleted_at"))
161+
assert_match_uuid(record_data.fetch("id"))
162+
assert_kind_of(String, record_data.fetch("name"))
163+
assert_kind_of(Array, record_data.fetch("permission_display_names"))
164+
assert_kind_of(Array, record_data.fetch("permission_ids"))
165+
assert_match_iso8601(record_data.fetch("updated_at"))
166+
assert_kind_of(Integer, record_data.fetch("version"))
167+
end
54168
end

test/apis/v1/admins/test_index.rb

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,19 @@ def setup
1010
Admin.delete_all
1111
end
1212

13-
def test_paginate_results
14-
FactoryGirl.create_list(:admin, 3)
13+
include ApiUmbrellaSharedTests::DataTablesApi
1514

16-
response = Typhoeus.get("https://127.0.0.1:9081/api-umbrella/v1/admins.json?length=2", http_options.deep_merge(admin_token))
17-
assert_response_code(200, response)
15+
private
1816

19-
admin_count = Admin.where(:deleted_at => nil).count
20-
assert_operator(admin_count, :>, 2)
17+
def data_tables_api_url
18+
"https://127.0.0.1:9081/api-umbrella/v1/admins.json"
19+
end
20+
21+
def data_tables_factory_name
22+
:admin
23+
end
2124

22-
data = MultiJson.load(response.body)
23-
assert_equal(admin_count, data["recordsTotal"])
24-
assert_equal(admin_count, data["recordsFiltered"])
25-
assert_equal(2, data["data"].length)
25+
def data_tables_record_count
26+
Admin.where(:deleted_at => nil).count
2627
end
2728
end

test/apis/v1/api_scopes/test_index.rb

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
require_relative "../../../test_helper"
2+
3+
class Test::Apis::V1::ApiScopes::TestIndex < Minitest::Test
4+
include ApiUmbrellaTestHelpers::AdminAuth
5+
include ApiUmbrellaTestHelpers::Setup
6+
7+
def setup
8+
super
9+
setup_server
10+
ApiScope.delete_all
11+
end
12+
13+
include ApiUmbrellaSharedTests::DataTablesApi
14+
15+
def test_response_fields
16+
record = FactoryGirl.create(data_tables_factory_name, {
17+
:created_at => Time.utc(2017, 1, 1),
18+
:created_by => SecureRandom.uuid,
19+
:host => "example.com",
20+
:name => "Example",
21+
:path_prefix => "/#{unique_test_id}/",
22+
:updated_at => Time.utc(2017, 1, 2),
23+
:updated_by => SecureRandom.uuid,
24+
})
25+
26+
response = Typhoeus.get(data_tables_api_url, http_options.deep_merge(admin_token).deep_merge({
27+
:params => {
28+
:search => { :value => record.id },
29+
},
30+
}))
31+
assert_response_code(200, response)
32+
data = MultiJson.load(response.body)
33+
assert_data_tables_root_fields(data)
34+
assert_equal(1, data.fetch("data").length)
35+
36+
record_data = data.fetch("data").first
37+
assert_base_record_fields(record_data)
38+
39+
assert_equal("2017-01-01T00:00:00Z", record_data.fetch("created_at"))
40+
assert_match_uuid(record_data.fetch("created_by"))
41+
assert_equal(record.created_by, record_data.fetch("created_by"))
42+
assert_equal("example.com", record_data.fetch("host"))
43+
assert_equal("Example", record_data.fetch("name"))
44+
assert_equal("/#{unique_test_id}/", record_data.fetch("path_prefix"))
45+
assert_equal("2017-01-02T00:00:00Z", record_data.fetch("updated_at"))
46+
assert_match_uuid(record_data.fetch("updated_by"))
47+
assert_equal(record.updated_by, record_data.fetch("updated_by"))
48+
end
49+
50+
def test_empty_response_fields
51+
record = FactoryGirl.create(data_tables_factory_name)
52+
53+
response = Typhoeus.get(data_tables_api_url, http_options.deep_merge(admin_token).deep_merge({
54+
:params => {
55+
:search => { :value => record.id },
56+
},
57+
}))
58+
assert_response_code(200, response)
59+
data = MultiJson.load(response.body)
60+
assert_data_tables_root_fields(data)
61+
assert_equal(1, data.fetch("data").length)
62+
63+
record_data = data.fetch("data").first
64+
assert_base_record_fields(record_data)
65+
66+
assert_nil(record_data.fetch("created_by"))
67+
assert_nil(record_data.fetch("updated_by"))
68+
end
69+
70+
def test_search_name
71+
assert_data_tables_search(:name, "NameSearchTest", "amesearcht")
72+
end
73+
74+
def test_search_host
75+
assert_data_tables_search(:host, "hostsearchtest.com", "ostsearcht")
76+
end
77+
78+
def test_search_path_prefix
79+
assert_data_tables_search(:path_prefix, "/path-prefix/search-test/", "refix/searc")
80+
end
81+
82+
def test_order_name
83+
assert_data_tables_order(:name, ["A", "B"])
84+
end
85+
86+
def test_order_host
87+
assert_data_tables_order(:host, ["a.example.com", "b.example.com"])
88+
end
89+
90+
def test_order_path_prefix
91+
assert_data_tables_order(:path_prefix, ["/a", "/b"])
92+
end
93+
94+
private
95+
96+
def data_tables_api_url
97+
"https://127.0.0.1:9081/api-umbrella/v1/api_scopes.json"
98+
end
99+
100+
def data_tables_factory_name
101+
:api_scope
102+
end
103+
104+
def data_tables_record_count
105+
ApiScope.where(:deleted_at => nil).count
106+
end
107+
108+
def assert_base_record_fields(record_data)
109+
assert_equal([
110+
"created_at",
111+
"created_by",
112+
"deleted_at",
113+
"host",
114+
"id",
115+
"name",
116+
"path_prefix",
117+
"updated_at",
118+
"updated_by",
119+
"version",
120+
].sort, record_data.keys.sort)
121+
assert_match_iso8601(record_data.fetch("created_at"))
122+
assert_nil(record_data.fetch("deleted_at"))
123+
assert_kind_of(String, record_data.fetch("host"))
124+
assert_match_uuid(record_data.fetch("id"))
125+
assert_kind_of(String, record_data.fetch("name"))
126+
assert_kind_of(String, record_data.fetch("path_prefix"))
127+
assert_match_iso8601(record_data.fetch("updated_at"))
128+
assert_kind_of(Integer, record_data.fetch("version"))
129+
end
130+
end

0 commit comments

Comments
 (0)