mno-enterprise-api 3.3.1 → 3.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/mno_enterprise/config.js.coffee.erb +1 -0
- data/app/controllers/mno_enterprise/impersonate_controller.rb +5 -1
- data/app/controllers/mno_enterprise/jpi/v1/admin/impac/dashboard_templates_controller.rb +93 -0
- data/app/controllers/mno_enterprise/jpi/v1/admin/impac/kpis_controller.rb +71 -0
- data/app/controllers/mno_enterprise/jpi/v1/admin/impac/widgets_controller.rb +70 -0
- data/app/controllers/mno_enterprise/jpi/v1/impac/dashboard_templates_controller.rb +5 -0
- data/app/views/mno_enterprise/auth/confirmations/_form.html.haml +10 -1
- data/app/views/mno_enterprise/jpi/v1/admin/base_resource/_member.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/dashboard_templates/_template.json.jbuilder +16 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/dashboard_templates/index.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/dashboard_templates/show.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/kpis/_kpi.json.jbuilder +2 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/kpis/show.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/widgets/_widget.json.jbuilder +7 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/widgets/show.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/app_feedbacks/_resource.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/app_questions/_resource.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/current_users/show.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/impac/dashboard_templates/index.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/impac/kpis/_kpi.json.jbuilder +1 -1
- data/app/views/mno_enterprise/pages/loading.html.erb +1 -1
- data/config/routes.rb +12 -0
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/impac/dashboard_templates_controller.rb +20 -0
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/impac/dashboards_controller.rb +25 -2
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/impac/kpis_controller.rb +13 -11
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/marketplace_controller.rb +1 -1
- data/lib/mno_enterprise/concerns/controllers/pages_controller.rb +3 -1
- data/spec/controllers/mno_enterprise/impersonate_controller_spec.rb +11 -2
- data/spec/controllers/mno_enterprise/jpi/v1/admin/impac/dashboard_templates_controller_spec.rb +225 -0
- data/spec/controllers/mno_enterprise/jpi/v1/admin/impac/kpis_controller_spec.rb +134 -0
- data/spec/controllers/mno_enterprise/jpi/v1/admin/impac/widgets_controller_spec.rb +150 -0
- data/spec/controllers/mno_enterprise/jpi/v1/app_feedbacks_controller_spec.rb +2 -1
- data/spec/controllers/mno_enterprise/jpi/v1/app_questions_controller_spec.rb +2 -1
- data/spec/controllers/mno_enterprise/jpi/v1/impac/dashboard_templates_controller_spec.rb +97 -0
- data/spec/controllers/mno_enterprise/jpi/v1/impac/dashboards_controller_spec.rb +223 -0
- data/spec/controllers/mno_enterprise/jpi/v1/marketplace_controller_spec.rb +31 -1
- data/spec/controllers/mno_enterprise/pages_controller_spec.rb +13 -2
- data/spec/routing/mno_enterprise/jpi/v1/admin/impac/dashboard_templates_controller_routing_spec.rb +28 -0
- data/spec/routing/mno_enterprise/jpi/v1/admin/impac/kpis_controller_routing_spec.rb +20 -0
- data/spec/routing/mno_enterprise/jpi/v1/admin/impac/widgets_controller_routing_spec.rb +20 -0
- data/spec/routing/mno_enterprise/jpi/v1/impac/dashboard_templates_controller_routing_spec.rb +11 -0
- metadata +35 -4
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
module MnoEnterprise
|
4
|
+
describe Jpi::V1::Admin::Impac::WidgetsController, type: :controller do
|
5
|
+
# include MnoEnterprise::TestingSupport::JpiV1TestHelper
|
6
|
+
include MnoEnterprise::TestingSupport::SharedExamples::JpiV1Admin
|
7
|
+
render_views
|
8
|
+
routes { MnoEnterprise::Engine.routes }
|
9
|
+
before { request.env["HTTP_ACCEPT"] = 'application/json' }
|
10
|
+
|
11
|
+
let(:user) { build(:user, :admin, :with_organizations) }
|
12
|
+
let(:org) { build(:organization, users: [user]) }
|
13
|
+
let(:template) { build(:impac_dashboard, dashboard_type: 'template') }
|
14
|
+
let(:metadata) { { hist_parameters: { from: '2015-01-01', to: '2015-03-31', period: 'MONTHLY' } } }
|
15
|
+
let(:widget) { build(:impac_widget, dashboard: template, settings: metadata) }
|
16
|
+
let(:kpi) { build(:impac_kpi, widget: widget) }
|
17
|
+
|
18
|
+
let(:hash_for_kpi) do
|
19
|
+
{
|
20
|
+
"id" => kpi.id,
|
21
|
+
"element_watched" => kpi.element_watched,
|
22
|
+
"endpoint" => kpi.endpoint
|
23
|
+
}
|
24
|
+
end
|
25
|
+
let(:hash_for_widget) do
|
26
|
+
{
|
27
|
+
"id" => widget.id,
|
28
|
+
"name" => widget.name,
|
29
|
+
'metadata' => metadata.deep_stringify_keys,
|
30
|
+
"endpoint" => widget.widget_category,
|
31
|
+
"width" => widget.width,
|
32
|
+
"kpis" => [hash_for_kpi]
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
before do
|
37
|
+
api_stub_for(get: "/users/#{user.id}", response: from_api(user))
|
38
|
+
sign_in user
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#create' do
|
42
|
+
let(:widget_params) do
|
43
|
+
{
|
44
|
+
endpoint: widget.endpoint,
|
45
|
+
name: widget.name,
|
46
|
+
width: widget.width,
|
47
|
+
metadata: metadata,
|
48
|
+
forbidden: 'param'
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
subject { post :create, dashboard_template_id: template.id, widget: widget_params }
|
53
|
+
|
54
|
+
before do
|
55
|
+
api_stub_for(
|
56
|
+
get: "/dashboards/#{template.id}",
|
57
|
+
params: { filter: { 'dashboard_type' => 'template' } },
|
58
|
+
response: from_api(template)
|
59
|
+
)
|
60
|
+
api_stub_for(
|
61
|
+
post: "dashboards/#{template.id}/widgets",
|
62
|
+
response: from_api(widget)
|
63
|
+
)
|
64
|
+
# Why is Her doing a GET /widgets after doing a POST /widgets?
|
65
|
+
api_stub_for(
|
66
|
+
get: "dashboards/#{template.id}/widgets",
|
67
|
+
response: from_api([widget])
|
68
|
+
)
|
69
|
+
api_stub_for(
|
70
|
+
get: "/widgets/#{widget.id}/kpis",
|
71
|
+
response: from_api([kpi])
|
72
|
+
)
|
73
|
+
end
|
74
|
+
|
75
|
+
it_behaves_like "a jpi v1 admin action"
|
76
|
+
|
77
|
+
it 'returns a widget' do
|
78
|
+
subject
|
79
|
+
expect(JSON.parse(response.body)).to eq(hash_for_widget)
|
80
|
+
end
|
81
|
+
|
82
|
+
# api_stub should be modified to allow this case to be stubbed
|
83
|
+
context 'when the template cannot be found' do
|
84
|
+
xit 'spec to be described'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '#update' do
|
89
|
+
let(:widget_params) do
|
90
|
+
{
|
91
|
+
name: widget.name,
|
92
|
+
width: widget.width,
|
93
|
+
metadata: metadata,
|
94
|
+
forbidden: 'param'
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
subject { put :update, id: widget.id, widget: widget_params }
|
99
|
+
|
100
|
+
before do
|
101
|
+
api_stub_for(
|
102
|
+
get: "widgets/#{widget.id}",
|
103
|
+
response: from_api(widget)
|
104
|
+
)
|
105
|
+
api_stub_for(
|
106
|
+
put: "/widgets/#{widget.id}",
|
107
|
+
response: from_api(widget)
|
108
|
+
)
|
109
|
+
api_stub_for(
|
110
|
+
get: "/widgets/#{widget.id}/kpis",
|
111
|
+
response: from_api([kpi])
|
112
|
+
)
|
113
|
+
end
|
114
|
+
|
115
|
+
it_behaves_like "a jpi v1 admin action"
|
116
|
+
|
117
|
+
it 'returns a widget' do
|
118
|
+
subject
|
119
|
+
expect(JSON.parse(response.body)).to eq(hash_for_widget)
|
120
|
+
end
|
121
|
+
|
122
|
+
# api_stub should be modified to allow this case to be stubbed
|
123
|
+
context 'when the widget update is unsuccessful' do
|
124
|
+
xit 'spec to be described'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#destroy' do
|
129
|
+
subject { delete :destroy, id: widget.id }
|
130
|
+
|
131
|
+
before do
|
132
|
+
api_stub_for(
|
133
|
+
get: "widgets/#{widget.id}",
|
134
|
+
response: from_api(widget)
|
135
|
+
)
|
136
|
+
api_stub_for(
|
137
|
+
delete: "/widgets/#{widget.id}",
|
138
|
+
response: from_api(nil)
|
139
|
+
)
|
140
|
+
end
|
141
|
+
|
142
|
+
it_behaves_like "a jpi v1 admin action"
|
143
|
+
|
144
|
+
# api_stub should be modified to allow this case to be stubbed
|
145
|
+
context 'when the widget destruction is invalidunsuccessful' do
|
146
|
+
xit 'spec to be described'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -18,7 +18,8 @@ module MnoEnterprise
|
|
18
18
|
let(:app) { build(:app) }
|
19
19
|
let(:feedback_comment_1) { build(:app_comment) }
|
20
20
|
let(:feedback_comment_2) { build(:app_comment) }
|
21
|
-
let(:
|
21
|
+
let(:rejected_feedback_comment) { build(:app_comment, status: 'rejected') }
|
22
|
+
let(:app_feedback) { build(:app_feedback, comments: [feedback_comment_1, feedback_comment_2, rejected_feedback_comment]) }
|
22
23
|
let(:expected_hash_for_comment_1) do
|
23
24
|
attrs = %w(id description status user_id user_name organization_id organization_name app_id feedback_id app_name user_admin_role edited edited_by_name edited_by_admin_role edited_by_id)
|
24
25
|
feedback_comment_1.attributes.slice(*attrs).merge({'created_at' => feedback_comment_1.created_at.as_json, 'updated_at' => feedback_comment_1.updated_at.as_json})
|
@@ -18,7 +18,8 @@ module MnoEnterprise
|
|
18
18
|
let(:app) { build(:app) }
|
19
19
|
let(:question_answer_1) { build(:app_answer) }
|
20
20
|
let(:question_answer_2) { build(:app_answer) }
|
21
|
-
let(:
|
21
|
+
let(:rejected_answer) { build(:app_answer, status: 'rejected') }
|
22
|
+
let(:app_question) { build(:app_question, answers: [question_answer_1, question_answer_2, rejected_answer]) }
|
22
23
|
let(:expected_hash_for_answer_1) do
|
23
24
|
attrs = %w(id description status user_id user_name organization_id organization_name app_id question_id app_name user_admin_role edited edited_by_name edited_by_admin_role edited_by_id)
|
24
25
|
question_answer_1.attributes.slice(*attrs).merge({'created_at' => question_answer_1.created_at.as_json, 'updated_at' => question_answer_1.updated_at.as_json})
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
module MnoEnterprise
|
4
|
+
describe MnoEnterprise::Jpi::V1::Impac::DashboardTemplatesController, type: :controller do
|
5
|
+
include MnoEnterprise::TestingSupport::JpiV1TestHelper
|
6
|
+
render_views
|
7
|
+
routes { MnoEnterprise::Engine.routes }
|
8
|
+
before { request.env["HTTP_ACCEPT"] = 'application/json' }
|
9
|
+
before { Rails.cache.clear }
|
10
|
+
|
11
|
+
let(:user) { build(:user, :with_organizations) }
|
12
|
+
let(:org) { build(:organization, users: [user]) }
|
13
|
+
let(:metadata) { { hist_parameters: { from: '2015-01-01', to: '2015-03-31', period: 'MONTHLY' } } }
|
14
|
+
let(:template) { build(:impac_dashboard, dashboard_type: 'template', organization_ids: [org.uid], currency: 'EUR', settings: metadata) }
|
15
|
+
let(:widget) { build(:impac_widget, dashboard: template, owner: user) }
|
16
|
+
let(:d_kpi) { build(:impac_kpi, dashboard: template) }
|
17
|
+
let(:w_kpi) { build(:impac_kpi, widget: widget) }
|
18
|
+
|
19
|
+
def hash_for_kpi(kpi)
|
20
|
+
{
|
21
|
+
"id" => kpi.id,
|
22
|
+
"element_watched" => kpi.element_watched,
|
23
|
+
"endpoint" => kpi.endpoint
|
24
|
+
}
|
25
|
+
end
|
26
|
+
let(:hash_for_widget) do
|
27
|
+
{
|
28
|
+
"id" => widget.id,
|
29
|
+
"name" => widget.name,
|
30
|
+
"endpoint" => widget.widget_category,
|
31
|
+
"width" => widget.width,
|
32
|
+
"kpis" => [hash_for_kpi(w_kpi)],
|
33
|
+
'owner' => from_api(user)[:data]
|
34
|
+
}
|
35
|
+
end
|
36
|
+
let(:hash_for_template) do
|
37
|
+
{
|
38
|
+
"id" => template.id,
|
39
|
+
"name" => template.name,
|
40
|
+
"full_name" => template.full_name,
|
41
|
+
"currency" => 'EUR',
|
42
|
+
"metadata" => metadata.deep_stringify_keys,
|
43
|
+
"data_sources" => [{ "id" => org.id, "uid" => org.uid, "label" => org.name}],
|
44
|
+
"kpis" => [hash_for_kpi(d_kpi)],
|
45
|
+
"widgets" => [hash_for_widget]
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
before do
|
50
|
+
api_stub_for(get: "/users/#{user.id}", response: from_api(user))
|
51
|
+
sign_in user
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'GET #index' do
|
55
|
+
subject { get :index }
|
56
|
+
|
57
|
+
before do
|
58
|
+
api_stub_for(
|
59
|
+
get: '/dashboards',
|
60
|
+
params: { filter: { 'dashboard_type' => 'template', 'published' => true } },
|
61
|
+
response: from_api([template])
|
62
|
+
)
|
63
|
+
api_stub_for(
|
64
|
+
get: "/users/#{user.id}/organizations",
|
65
|
+
response: from_api([org])
|
66
|
+
)
|
67
|
+
api_stub_for(
|
68
|
+
get: "/dashboards/#{template.id}/widgets",
|
69
|
+
response: from_api([widget])
|
70
|
+
)
|
71
|
+
api_stub_for(
|
72
|
+
get: "/dashboards/#{template.id}/kpis",
|
73
|
+
response: from_api([d_kpi])
|
74
|
+
)
|
75
|
+
api_stub_for(
|
76
|
+
get: "/widgets/#{widget.id}/kpis",
|
77
|
+
response: from_api([w_kpi])
|
78
|
+
)
|
79
|
+
api_stub_for(
|
80
|
+
get: "/kpis/#{w_kpi.id}/alerts",
|
81
|
+
response: from_api([])
|
82
|
+
)
|
83
|
+
api_stub_for(
|
84
|
+
get: "/kpis/#{d_kpi.id}/alerts",
|
85
|
+
response: from_api([])
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
it_behaves_like "jpi v1 protected action"
|
90
|
+
|
91
|
+
it 'returns a list of dashboard templates' do
|
92
|
+
subject
|
93
|
+
expect(JSON.parse(response.body)).to eq([hash_for_template])
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,223 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
module MnoEnterprise
|
4
|
+
describe MnoEnterprise::Jpi::V1::Impac::DashboardsController, type: :controller do
|
5
|
+
include MnoEnterprise::TestingSupport::JpiV1TestHelper
|
6
|
+
render_views
|
7
|
+
routes { MnoEnterprise::Engine.routes }
|
8
|
+
before { request.env["HTTP_ACCEPT"] = 'application/json' }
|
9
|
+
before { Rails.cache.clear }
|
10
|
+
|
11
|
+
RSpec.shared_context "#{described_class}: dashboard dependencies stubs" do
|
12
|
+
before do
|
13
|
+
api_stub_for(
|
14
|
+
get: "/users/#{user.id}/organizations",
|
15
|
+
response: from_api([org])
|
16
|
+
)
|
17
|
+
api_stub_for(
|
18
|
+
get: "/dashboards/#{dashboard.id}/widgets",
|
19
|
+
response: from_api([widget])
|
20
|
+
)
|
21
|
+
api_stub_for(
|
22
|
+
get: "/dashboards/#{dashboard.id}/kpis",
|
23
|
+
response: from_api([d_kpi])
|
24
|
+
)
|
25
|
+
api_stub_for(
|
26
|
+
get: "/widgets/#{widget.id}/kpis",
|
27
|
+
response: from_api([w_kpi])
|
28
|
+
)
|
29
|
+
api_stub_for(
|
30
|
+
get: "/kpis/#{w_kpi.id}/alerts",
|
31
|
+
response: from_api([])
|
32
|
+
)
|
33
|
+
api_stub_for(
|
34
|
+
get: "/kpis/#{d_kpi.id}/alerts",
|
35
|
+
response: from_api([])
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:user) { build(:user, :with_organizations) }
|
41
|
+
let(:org) { build(:organization, users: [user]) }
|
42
|
+
let(:metadata) { { hist_parameters: { from: '2015-01-01', to: '2015-03-31', period: 'MONTHLY' } } }
|
43
|
+
let(:dashboard) { build(:impac_dashboard, dashboard_type: 'dashboard', organization_ids: [org.uid], currency: 'EUR', settings: metadata) }
|
44
|
+
let(:widget) { build(:impac_widget, dashboard: dashboard, owner: user) }
|
45
|
+
let(:d_kpi) { build(:impac_kpi, dashboard: dashboard) }
|
46
|
+
let(:w_kpi) { build(:impac_kpi, widget: widget) }
|
47
|
+
|
48
|
+
let(:dashboard_params) do
|
49
|
+
{
|
50
|
+
name: dashboard.name,
|
51
|
+
currency: dashboard.currency,
|
52
|
+
widgets_order: [3, 2, 1],
|
53
|
+
organization_ids: [4, 5],
|
54
|
+
metadata: metadata,
|
55
|
+
forbidden: 'param'
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def hash_for_kpi(kpi)
|
60
|
+
{
|
61
|
+
"id" => kpi.id,
|
62
|
+
"element_watched" => kpi.element_watched,
|
63
|
+
"endpoint" => kpi.endpoint
|
64
|
+
}
|
65
|
+
end
|
66
|
+
let(:hash_for_widget) do
|
67
|
+
{
|
68
|
+
"id" => widget.id,
|
69
|
+
"name" => widget.name,
|
70
|
+
"endpoint" => widget.widget_category,
|
71
|
+
"width" => widget.width,
|
72
|
+
"kpis" => [hash_for_kpi(w_kpi)],
|
73
|
+
'owner' => from_api(user)[:data]
|
74
|
+
}
|
75
|
+
end
|
76
|
+
let(:hash_for_dashboard) do
|
77
|
+
{
|
78
|
+
"id" => dashboard.id,
|
79
|
+
"name" => dashboard.name,
|
80
|
+
"full_name" => dashboard.full_name,
|
81
|
+
"currency" => 'EUR',
|
82
|
+
"metadata" => metadata.deep_stringify_keys,
|
83
|
+
"data_sources" => [{ "id" => org.id, "uid" => org.uid, "label" => org.name}],
|
84
|
+
"kpis" => [hash_for_kpi(d_kpi)],
|
85
|
+
"widgets" => [hash_for_widget]
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
before do
|
90
|
+
api_stub_for(get: "/users/#{user.id}", response: from_api(user))
|
91
|
+
sign_in user
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'GET #index' do
|
95
|
+
subject { get :index }
|
96
|
+
|
97
|
+
before do
|
98
|
+
api_stub_for(
|
99
|
+
get: "users/#{user.id}/dashboards",
|
100
|
+
response: from_api([dashboard])
|
101
|
+
)
|
102
|
+
end
|
103
|
+
include_context "#{described_class}: dashboard dependencies stubs"
|
104
|
+
|
105
|
+
it_behaves_like "jpi v1 protected action"
|
106
|
+
|
107
|
+
it 'returns a list of dashboards' do
|
108
|
+
subject
|
109
|
+
expect(JSON.parse(response.body)).to eq([hash_for_dashboard])
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe 'GET #show' do
|
114
|
+
before do
|
115
|
+
api_stub_for(
|
116
|
+
get: "users/#{user.id}/dashboards/#{dashboard.id}",
|
117
|
+
response: from_api(dashboard)
|
118
|
+
)
|
119
|
+
end
|
120
|
+
include_context "#{described_class}: dashboard dependencies stubs"
|
121
|
+
|
122
|
+
subject { get :show, id: dashboard.id }
|
123
|
+
|
124
|
+
it_behaves_like "jpi v1 protected action"
|
125
|
+
|
126
|
+
it 'returns a dashboard' do
|
127
|
+
subject
|
128
|
+
expect(JSON.parse(response.body)).to eq(hash_for_dashboard)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe 'POST #create' do
|
133
|
+
before do
|
134
|
+
api_stub_for(
|
135
|
+
post: "users/#{user.id}/dashboards",
|
136
|
+
response: from_api(dashboard)
|
137
|
+
)
|
138
|
+
# Her calling GET /dashboards after a POST...
|
139
|
+
api_stub_for(
|
140
|
+
get: "users/#{user.id}/dashboards",
|
141
|
+
response: from_api([dashboard])
|
142
|
+
)
|
143
|
+
end
|
144
|
+
include_context "#{described_class}: dashboard dependencies stubs"
|
145
|
+
|
146
|
+
subject { post :create, user_id: user.id, dashboard: dashboard_params }
|
147
|
+
|
148
|
+
it_behaves_like "jpi v1 protected action"
|
149
|
+
|
150
|
+
it 'returns a dashboard' do
|
151
|
+
subject
|
152
|
+
expect(JSON.parse(response.body)).to eq(hash_for_dashboard)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe 'PUT #update' do
|
157
|
+
before do
|
158
|
+
api_stub_for(
|
159
|
+
get: "users/#{user.id}/dashboards/#{dashboard.id}",
|
160
|
+
response: from_api(dashboard)
|
161
|
+
)
|
162
|
+
api_stub_for(
|
163
|
+
put: "dashboards/#{dashboard.id}",
|
164
|
+
response: from_api(dashboard)
|
165
|
+
)
|
166
|
+
end
|
167
|
+
include_context "#{described_class}: dashboard dependencies stubs"
|
168
|
+
|
169
|
+
subject { put :update, id: dashboard.id, dashboard: dashboard_params }
|
170
|
+
|
171
|
+
it_behaves_like "jpi v1 protected action"
|
172
|
+
|
173
|
+
it 'returns a dashboard' do
|
174
|
+
subject
|
175
|
+
expect(JSON.parse(response.body)).to eq(hash_for_dashboard)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "DELETE destroy" do
|
180
|
+
before do
|
181
|
+
api_stub_for(
|
182
|
+
get: "users/#{user.id}/dashboards/#{dashboard.id}",
|
183
|
+
response: from_api(dashboard)
|
184
|
+
)
|
185
|
+
api_stub_for(
|
186
|
+
delete: "dashboards/#{dashboard.id}",
|
187
|
+
response: from_api(dashboard)
|
188
|
+
)
|
189
|
+
end
|
190
|
+
include_context "#{described_class}: dashboard dependencies stubs"
|
191
|
+
|
192
|
+
subject { delete :destroy, id: dashboard.id }
|
193
|
+
|
194
|
+
it_behaves_like "jpi v1 protected action"
|
195
|
+
end
|
196
|
+
|
197
|
+
describe 'POST copy' do
|
198
|
+
let(:template) { build(:impac_dashboard, dashboard_type: 'template') }
|
199
|
+
|
200
|
+
before do
|
201
|
+
api_stub_for(
|
202
|
+
get: "/dashboards/#{template.id}",
|
203
|
+
params: { filter: { 'dashboard_type' => 'template' } },
|
204
|
+
response: from_api(template)
|
205
|
+
)
|
206
|
+
api_stub_for(
|
207
|
+
post: "/dashboards/#{template.id}/copy",
|
208
|
+
response: from_api(dashboard)
|
209
|
+
)
|
210
|
+
end
|
211
|
+
include_context "#{described_class}: dashboard dependencies stubs"
|
212
|
+
|
213
|
+
subject { post :copy, id: template.id, dashboard: dashboard_params }
|
214
|
+
|
215
|
+
it_behaves_like "jpi v1 protected action"
|
216
|
+
|
217
|
+
it 'returns a dashboard' do
|
218
|
+
subject
|
219
|
+
expect(JSON.parse(response.body)).to eq(hash_for_dashboard)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|