mno-enterprise-core 3.3.3 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a9bc8575caf93295002d64712d732d5fc882a09a
4
- data.tar.gz: e27125cc924ba10ac4f62eecb668a1018a4717ad
2
+ SHA256:
3
+ metadata.gz: cf176f50a3ce889c72e80a547eb8bcad4edb87467e74c858572c0bd6deece662
4
+ data.tar.gz: da051544d51089e2d354864e25434184788d0d1dd30c4774c87e79358ad26a12
5
5
  SHA512:
6
- metadata.gz: '0680225db073172cefab691f5bd89183d9f82858ff5fe3ad51760639109bde0f59563c7b241bdaf2100d89bd3479096e3371385aab09532e299985e6eeb7068f'
7
- data.tar.gz: d5d82305dbe6d5c81290d99ce572694009cd7f2176e4edf275bd2deaa5ccb369a185163aeb76d9f61583ea6261c5ae277221b5e6ca52c936829f2ddad639d957
6
+ metadata.gz: 1be7040ae608b7c404339a89a4098c526ac1e82e7eedbde0849f8857c27f2d928104068bdf649d26667a3bb22fe665d81be887a8ad9b3ef5639181cb7ff2762b
7
+ data.tar.gz: 1af8e04e29fb60df75c7fcc64803f062c67cb05931b0ae6bf0474920a38ad0ffe81f428b37109ef3181c2cfd92f1e2c7864ffc318c5a4385a9c64bb1b4adc8f7
@@ -32,7 +32,7 @@ module MnoEnterprise
32
32
  end
33
33
 
34
34
  def current_ability
35
- MnoEnterprise::Ability.new(current_user)
35
+ MnoEnterprise::Ability.new(current_user, session)
36
36
  end
37
37
 
38
38
  def set_default_meta
@@ -22,13 +22,13 @@ module MnoEnterprise
22
22
  end
23
23
 
24
24
  # Return all the organizations linked to this dashboard and to which the user has access
25
- # If the dashboard is a template, return all the current user's organization
25
+ # If the dashboard is a template, return all the current user's organizations
26
26
  def organizations(org_list = nil)
27
27
  if org_list
28
28
  return org_list if dashboard_type == 'template'
29
- org_list.to_a.select { |e| self.organization_ids.include?(e.uid) }
29
+ org_list.to_a.select { |e| organization_ids.include?(e.uid) || organization_ids.include?(e.id) }
30
30
  else
31
- MnoEnterprise::Organization.where('uid.in' => self.organization_ids).to_a
31
+ MnoEnterprise::Organization.where('uid.in' => organization_ids).to_a
32
32
  end
33
33
  end
34
34
 
@@ -44,10 +44,7 @@ module MnoEnterprise
44
44
  end
45
45
 
46
46
  def to_audit_event
47
- {
48
- name: name,
49
- organization_id: (owner_type == 'Organization') ? owner_id : nil
50
- }
47
+ { name: name }
51
48
  end
52
49
 
53
50
  def copy(owner, name, organization_ids)
@@ -7,5 +7,18 @@ module MnoEnterprise
7
7
  belongs_to :widget, class_name: 'MnoEnterprise::Impac::Widget'
8
8
  has_many :alerts, class_name: 'MnoEnterprise::Impac::Alert'
9
9
 
10
+ def organizations(orgs = nil)
11
+ if orgs.present?
12
+ orgs.select { |org| organization_ids.include?(org.uid) }.to_a
13
+ else
14
+ MnoEnterprise::Organization.where('uid.in' => organization_ids).to_a
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def organization_ids
21
+ @organization_ids ||= (settings.present? && settings['organization_ids']).to_a
22
+ end
10
23
  end
11
24
  end
@@ -2,21 +2,32 @@ module MnoEnterprise
2
2
  class Impac::Widget < BaseResource
3
3
 
4
4
  # TODO: remove :widget_category when mnohub migrated to new model
5
- attributes :name, :width, :widget_category, :settings, :endpoint
5
+ attributes :name, :width, :widget_category, :settings, :endpoint, :layouts
6
6
 
7
7
  belongs_to :dashboard, class_name: 'MnoEnterprise::Impac::Dashboard'
8
8
  has_many :kpis, class_name: 'MnoEnterprise::Impac::Kpi'
9
9
 
10
10
  def to_audit_event
11
-
12
- if settings.present? && settings['organization_ids'].present?
13
- organization = MnoEnterprise::Organization.find_by(uid: settings['organization_ids'].first)
11
+ if organization_ids.present?
12
+ organization = MnoEnterprise::Organization.find_by(uid: organization_ids.first)
14
13
  { name: name, organization_id: organization.id }
15
14
  else
16
15
  { name: name }
17
16
  end
17
+ end
18
18
 
19
+ def organizations(orgs = nil)
20
+ if orgs.present?
21
+ orgs.select { |org| organization_ids.include?(org.uid) }.to_a
22
+ else
23
+ MnoEnterprise::Organization.where('uid.in' => organization_ids).to_a
24
+ end
19
25
  end
20
26
 
27
+ private
28
+
29
+ def organization_ids
30
+ @organization_ids ||= (settings.present? && settings['organization_ids']).to_a
31
+ end
21
32
  end
22
33
  end
@@ -0,0 +1,8 @@
1
+ module MnoEnterprise
2
+ class SubTenant < BaseResource
3
+ attributes :name, :account_manager_ids, :client_ids
4
+
5
+ has_many :account_managers, class_name: 'MnoEnterprise::User'
6
+ has_many :clients, class_name: 'MnoEnterprise::Organization'
7
+ end
8
+ end
@@ -37,6 +37,7 @@
37
37
  # website :string(255)
38
38
  # api_key :string(255)
39
39
  # api_secret :string(255)
40
+ # mnoe_sub_tenant_id :string
40
41
  #
41
42
 
42
43
  module MnoEnterprise
@@ -51,7 +52,7 @@ module MnoEnterprise
51
52
  :last_sign_in_ip, :confirmation_token, :confirmed_at, :confirmation_sent_at, :unconfirmed_email,
52
53
  :failed_attempts, :unlock_token, :locked_at, :name, :surname, :company, :phone, :phone_country_code,
53
54
  :geo_country_code, :geo_state_code, :geo_city, :website, :orga_on_create, :sso_session, :current_password_required, :admin_role,
54
- :api_key, :api_secret, :developer, :kpi_enabled, :external_id, :meta_data, :password_valid
55
+ :api_key, :api_secret, :developer, :kpi_enabled, :external_id, :meta_data, :password_valid, :mnoe_sub_tenant_id, :client_ids
55
56
 
56
57
  define_model_callbacks :validation #required by Devise
57
58
 
@@ -83,6 +84,8 @@ module MnoEnterprise
83
84
  has_many :dashboards, class_name: 'MnoEnterprise::Impac::Dashboard'
84
85
  has_many :alerts, class_name: 'MnoEnterprise::Impac::Alert'
85
86
 
87
+ has_many :clients, class_name: 'MnoEnterprise::Organization'
88
+
86
89
  #================================
87
90
  # Callbacks
88
91
  #================================
@@ -39,7 +39,7 @@ module MnoEnterprise
39
39
 
40
40
  # Financial values
41
41
  @data[:invoice_price] = @invoice.price
42
- @data[:invoice_currency] = @invoice.price.currency_as_string
42
+ @data[:invoice_currency] = @invoice.price.currency.to_s
43
43
  @data[:invoice_currency_name] = @invoice.price.currency.name
44
44
  @data[:invoice_credit_paid] = @invoice.credit_paid
45
45
  @data[:invoice_total_payable] = @invoice.total_payable
@@ -119,7 +119,7 @@ module MnoEnterprise
119
119
 
120
120
  # Format a money object
121
121
  def money(m)
122
- "#{m.format(symbol: false)} #{m.currency_as_string}"
122
+ "#{m.format(symbol: false)} #{m.currency.to_s}"
123
123
  end
124
124
 
125
125
  # Add a repeated header to the document
@@ -114,6 +114,7 @@ en:
114
114
 
115
115
  settings:
116
116
  company_name: Company name
117
+ financial_year_end_month: Financial Year End Month,
117
118
  connec_data_sharing: Connec!™ Data Sharing
118
119
  enable: "On"
119
120
  disable: "Off"
@@ -96,6 +96,7 @@ id:
96
96
 
97
97
  settings:
98
98
  company_name: Nama perusahaan
99
+ financial_year_end_month: Bulan Akhir Tahun Keuangan
99
100
  connec_data_sharing: Berbagi Data Connec!™
100
101
  enable: "On"
101
102
  disable: "Off"
@@ -96,6 +96,7 @@ zh:
96
96
 
97
97
  settings:
98
98
  company_name: 公司名称
99
+ financial_year_end_month: 财政年度结束月份
99
100
  connec_data_sharing: Connec!??数据分享
100
101
  enable: "On"
101
102
  disable: "Off"
@@ -12,7 +12,7 @@ module AccountingjsSerializer
12
12
  'subunit_symbol' => subunit_symbol(money.currency),
13
13
  'subunit_format' => subunit_symbol_first(money.currency) ? "%s%v" : "%v%s",
14
14
  'subunit_to_unit' => money.currency.subunit_to_unit,
15
- 'iso_code' => money.currency_as_string
15
+ 'iso_code' => money.currency.to_s
16
16
  }
17
17
  }
18
18
  end
@@ -60,6 +60,8 @@ devise:
60
60
 
61
61
  # Admin Panel Config
62
62
  admin_panel:
63
+ account_manager:
64
+ enabled: false
63
65
  apps_management:
64
66
  enabled: true
65
67
  audit_log:
@@ -71,11 +73,13 @@ admin_panel:
71
73
  enabled: true
72
74
  finance:
73
75
  enabled: true
76
+ impersonation:
77
+ disabled: false
74
78
  # Ability to enable Intercom on the admin panel
75
79
  # Intercom needs to be properly setup for the dashboard
76
80
  intercom:
77
81
  enabled: false
78
- impersonation:
79
- disabled: false
80
82
  staff:
81
83
  enabled: true
84
+ sub_tenant:
85
+ enabled: false
@@ -19,7 +19,7 @@ module MnoEnterprise::Concerns::Models::Ability
19
19
  #==================================================================
20
20
  # Instance methods
21
21
  #==================================================================
22
- def initialize(user)
22
+ def initialize(user, session)
23
23
  user ||= MnoEnterprise::User.new
24
24
 
25
25
  #===================================================
@@ -68,7 +68,8 @@ module MnoEnterprise::Concerns::Models::Ability
68
68
  #===================================================
69
69
  # Impac
70
70
  #===================================================
71
- impac_abilities(user)
71
+ orgs_with_acl = user.organizations.active.include_acl(session[:impersonator_user_id]).to_a
72
+ impac_abilities(orgs_with_acl)
72
73
 
73
74
  #===================================================
74
75
  # Admin abilities
@@ -103,42 +104,69 @@ module MnoEnterprise::Concerns::Models::Ability
103
104
  # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
104
105
  end
105
106
 
106
- def impac_abilities(user)
107
- can :manage_impac, MnoEnterprise::Impac::Dashboard do |dhb|
108
- dhb.organizations.any? && dhb.organizations.all? do |org|
109
- !!user.role(org) && ['Super Admin', 'Admin'].include?(user.role(org))
107
+ # Enables / disables Impac! Angular capabilities
108
+ def impac_abilities(orgs_with_acl)
109
+ can :create_impac_dashboards, MnoEnterprise::Impac::Dashboard do |d|
110
+ orgs = d.organizations(orgs_with_acl)
111
+ orgs.present? && orgs.all? do |org|
112
+ org.acl[:related] && org.acl[:related][:dashboards] && org.acl[:related][:dashboards][:create]
110
113
  end
111
114
  end
112
115
 
113
- can :manage_dashboard, MnoEnterprise::Impac::Dashboard do |dashboard|
114
- if dashboard.owner_type == "Organization"
115
- # The current user is a member of the organization that owns the dashboard that has the kpi attached to
116
- owner = MnoEnterprise::Organization.find(dashboard.owner_id)
117
- owner && !!user.role(owner)
118
- elsif dashboard.owner_type == "User"
119
- # The current user is the owner of the dashboard that has the kpi attached to
120
- dashboard.owner_id == user.id
121
- else
122
- false
116
+ can :update_impac_dashboards, MnoEnterprise::Impac::Dashboard do |d|
117
+ orgs = d.organizations(orgs_with_acl)
118
+ orgs.present? && orgs.all? do |org|
119
+ org.acl[:related] && org.acl[:related][:dashboards] && org.acl[:related][:dashboards][:update]
123
120
  end
124
121
  end
125
122
 
126
- can :manage_widget, MnoEnterprise::Impac::Widget do |widget|
127
- dashboard = widget.dashboard
128
- authorize! :manage_dashboard, dashboard
123
+ can :destroy_impac_dashboards, MnoEnterprise::Impac::Dashboard do |d|
124
+ orgs = d.organizations(orgs_with_acl)
125
+ orgs.present? && orgs.all? do |org|
126
+ org.acl[:related] && org.acl[:related][:dashboards] && org.acl[:related][:dashboards][:destroy]
127
+ end
128
+ end
129
+
130
+ can :create_impac_widgets, MnoEnterprise::Impac::Widget do |w|
131
+ orgs = w.organizations(orgs_with_acl)
132
+ orgs.present? && orgs.all? do |org|
133
+ org.acl[:related] && org.acl[:related][:widgets] && org.acl[:related][:widgets][:create]
134
+ end
135
+ end
136
+
137
+ can :update_impac_widgets, MnoEnterprise::Impac::Widget do |w|
138
+ orgs = w.organizations(orgs_with_acl)
139
+ orgs.present? && orgs.all? do |org|
140
+ org.acl[:related] && org.acl[:related][:widgets] && org.acl[:related][:widgets][:update]
141
+ end
129
142
  end
130
143
 
131
- can :manage_kpi, MnoEnterprise::Impac::Kpi do |kpi|
132
- if kpi.widget.present?
133
- authorize! :manage_widget, MnoEnterprise::Impac::Widget.find(kpi.widget.id)
134
- else
135
- authorize! :manage_dashboard, kpi.dashboard
144
+ can :destroy_impac_widgets, MnoEnterprise::Impac::Widget do |w|
145
+ orgs = w.organizations(orgs_with_acl)
146
+ orgs.present? && orgs.all? do |org|
147
+ org.acl[:related] && org.acl[:related][:widgets] && org.acl[:related][:widgets][:destroy]
136
148
  end
137
149
  end
138
150
 
139
- can :manage_alert, MnoEnterprise::Impac::Alert do |alert|
140
- kpi = alert.kpi
141
- authorize! :manage_kpi, kpi
151
+ can :create_impac_kpis, MnoEnterprise::Impac::Kpi do |k|
152
+ orgs = k.organizations(orgs_with_acl)
153
+ orgs.present? && orgs.all? do |org|
154
+ org.acl[:related] && org.acl[:related][:kpis] && org.acl[:related][:kpis][:create]
155
+ end
156
+ end
157
+
158
+ can :update_impac_kpis, MnoEnterprise::Impac::Kpi do |k|
159
+ orgs = k.organizations(orgs_with_acl)
160
+ orgs.present? && orgs.all? do |org|
161
+ org.acl[:related] && org.acl[:related][:kpis] && org.acl[:related][:kpis][:update]
162
+ end
163
+ end
164
+
165
+ can :destroy_impac_kpis, MnoEnterprise::Impac::Kpi do |k|
166
+ orgs = k.organizations(orgs_with_acl)
167
+ orgs.present? && orgs.all? do |org|
168
+ org.acl[:related] && org.acl[:related][:kpis] && org.acl[:related][:kpis][:destroy]
169
+ end
142
170
  end
143
171
  end
144
172
 
@@ -146,6 +174,7 @@ module MnoEnterprise::Concerns::Models::Ability
146
174
  def admin_abilities(user)
147
175
  if user.admin_role.to_s.casecmp('admin').zero? || user.admin_role.to_s.casecmp('staff').zero?
148
176
  can :manage_app_instances, MnoEnterprise::Organization
177
+ can :manage_sub_tenant, MnoEnterprise::SubTenant
149
178
  end
150
179
  end
151
180
  end
@@ -37,12 +37,16 @@ module MnoEnterprise::Concerns::Models::Organization
37
37
  included do
38
38
  attributes :uid, :name, :account_frozen, :free_trial_end_at, :soa_enabled, :mails, :logo,
39
39
  :latitude, :longitude, :geo_country_code, :geo_state_code, :geo_city, :geo_tz, :geo_currency,
40
- :meta_data, :industry, :size, :financial_year_end_month
40
+ :meta_data, :industry, :size, :financial_year_end_month, :acl
41
41
 
42
42
  scope :in_arrears, -> { where(in_arrears?: true) }
43
-
44
43
  scope :active, -> { where(account_frozen: false) }
45
-
44
+ scope :include_acl, ->(imp_id) do
45
+ tap do |x|
46
+ x.params[:include_acl?] = true
47
+ x.params[:account_manager_id] = imp_id if Settings.admin_panel.account_manager.enabled?
48
+ end
49
+ end
46
50
  default_scope lambda { where(account_frozen: false) }
47
51
 
48
52
  #================================
@@ -0,0 +1,14 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_girl
2
+
3
+ # This is an API resource factory generating a Hash to be used in API stubs
4
+ # Use as such: build(:api_user)
5
+ # See http://stackoverflow.com/questions/10032760/how-to-define-an-array-hash-in-factory-girl
6
+ FactoryGirl.define do
7
+
8
+ factory :sub_tenant, class: MnoEnterprise::SubTenant do
9
+ sequence(:id)
10
+ name 'SubTenant'
11
+ # Properly build the resource with Her
12
+ initialize_with { new(attributes).tap { |e| e.clear_attribute_changes! } }
13
+ end
14
+ end
@@ -51,6 +51,10 @@ FactoryGirl.define do
51
51
  kpi_enabled true
52
52
  end
53
53
 
54
+ trait :with_clients do
55
+ clients { [build(:organization).attributes] }
56
+ end
57
+
54
58
  # Properly build the resource with Her
55
59
  initialize_with { new(attributes).tap { |e| e.clear_attribute_changes! } }
56
60
  end
@@ -24,7 +24,7 @@ module MnoEnterpriseApiTestHelper
24
24
  end
25
25
  return hash
26
26
  when res.kind_of?(Money)
27
- return { cents: res.cents, currency: res.currency_as_string }
27
+ return { cents: res.cents, currency: res.currency.to_s }
28
28
  when res.respond_to?(:iso8601)
29
29
  return res.iso8601
30
30
  else
@@ -54,7 +54,8 @@ module MnoEnterprise::TestingSupport::OrganizationsSharedHelpers
54
54
  'name' => organization.name,
55
55
  'soa_enabled' => organization.soa_enabled,
56
56
  'account_frozen' => organization.account_frozen,
57
- 'payment_restriction' => organization.payment_restriction
57
+ 'payment_restriction' => organization.payment_restriction,
58
+ 'financial_year_end_month' => organization.financial_year_end_month
58
59
  }
59
60
 
60
61
  if admin
@@ -0,0 +1,13 @@
1
+ RSpec.shared_context MnoEnterprise::Jpi::V1::Admin::BaseResourceController do
2
+ include MnoEnterprise::TestingSupport::SharedExamples::JpiV1Admin
3
+
4
+ render_views
5
+ routes { MnoEnterprise::Engine.routes }
6
+ before { request.env["HTTP_ACCEPT"] = 'application/json' }
7
+
8
+ # user is stubbed in the controller?
9
+ before do
10
+ api_stub_for(get: "/users/#{user.id}", response: from_api(user))
11
+ sign_in(user)
12
+ end
13
+ end
@@ -0,0 +1,73 @@
1
+ module MnoEnterprise::TestingSupport::SharedContexts::JpiV1AdminImpacController
2
+ def hash_for_kpi(kpi)
3
+ {
4
+ "id" => kpi.id,
5
+ "element_watched" => kpi.element_watched,
6
+ "endpoint" => kpi.endpoint
7
+ }
8
+ end
9
+
10
+ shared_context 'MnoEnterprise::Jpi::V1::Admin::Impac' do
11
+ shared_context "#{described_class}: dashboard dependencies stubs" do
12
+ before do
13
+ # Not ideal but this is a nested context
14
+ if described_class == MnoEnterprise::Jpi::V1::Admin::Impac::DashboardsController
15
+ api_stub_for(
16
+ get: "/organizations?filter[uid.in][]=#{org.uid}",
17
+ response: from_api([org])
18
+ )
19
+ end
20
+ if described_class == MnoEnterprise::Jpi::V1::Admin::Impac::DashboardTemplatesController
21
+ api_stub_for(
22
+ get: "/users/#{user.id}/organizations",
23
+ response: from_api([org])
24
+ )
25
+ end
26
+ api_stub_for(
27
+ get: "/dashboards/#{dashboard.id}/widgets",
28
+ response: from_api([widget])
29
+ )
30
+ api_stub_for(
31
+ get: "/dashboards/#{dashboard.id}/kpis",
32
+ response: from_api([d_kpi])
33
+ )
34
+ api_stub_for(
35
+ get: "/widgets/#{widget.id}/kpis",
36
+ response: from_api([w_kpi])
37
+ )
38
+ end
39
+ end
40
+
41
+ let(:user) { build(:user, :admin, :with_organizations) }
42
+ let(:org) { build(:organization, users: [user]) }
43
+ let(:metadata) { { hist_parameters: { from: '2015-01-01', to: '2015-03-31', period: 'MONTHLY' } } }
44
+ let(:dashboard) { build(:impac_dashboard, dashboard_type: 'dashboard', organization_ids: [org.uid], currency: 'EUR', settings: metadata) }
45
+ let(:widget) { build(:impac_widget, dashboard: dashboard, owner: user) }
46
+ let(:d_kpi) { build(:impac_kpi, dashboard: dashboard) }
47
+ let(:w_kpi) { build(:impac_kpi, widget: widget) }
48
+
49
+ let(:hash_for_widget) do
50
+ {
51
+ "id" => widget.id,
52
+ "name" => widget.name,
53
+ "endpoint" => widget.widget_category,
54
+ "width" => widget.width,
55
+ "kpis" => [hash_for_kpi(w_kpi)]
56
+ }
57
+ end
58
+ let(:hash_for_dashboard) do
59
+ {
60
+ "id" => dashboard.id,
61
+ "name" => dashboard.name,
62
+ "full_name" => dashboard.full_name,
63
+ "currency" => 'EUR',
64
+ "metadata" => metadata.deep_stringify_keys,
65
+ "data_sources" => [{ "id" => org.id, "uid" => org.uid, "label" => org.name}],
66
+ "kpis" => [hash_for_kpi(d_kpi)],
67
+ "widgets" => [hash_for_widget]
68
+ }
69
+ end
70
+ end
71
+ end
72
+
73
+
@@ -1,3 +1,3 @@
1
1
  module MnoEnterprise
2
- VERSION = '3.3.3'
2
+ VERSION = '3.4.0'
3
3
  end
@@ -3,12 +3,35 @@ require 'cancan/matchers'
3
3
 
4
4
  # TODO: add more ability tests
5
5
  RSpec.describe MnoEnterprise::Ability, type: :model do
6
- subject(:ability) { described_class.new(user) }
6
+ subject(:ability) { described_class.new(user, session) }
7
7
  let(:user) { FactoryGirl.build(:user, admin_role: admin_role) }
8
+ let(:user2) { FactoryGirl.build(:user) }
9
+ let(:session) { { impersonator_user_id: user2.id } }
8
10
  let(:admin_role) { nil }
9
11
  let(:organization) { FactoryGirl.build(:organization) }
12
+
13
+ let(:org1) { FactoryGirl.build(:organization, acl: acl) }
14
+ let(:org2) { FactoryGirl.build(:organization, acl: acl) }
15
+ let(:acl) do
16
+ {
17
+ self: { show: false, update: false, destroy: false },
18
+ related: {
19
+ impac: { show: false },
20
+ dashboards: { show: false, create: false, update: false, destroy: false },
21
+ widgets: { show: false, create: false, update: false, destroy: false },
22
+ kpis: { show: false, create: false, update: false, destroy: false },
23
+ }
24
+ }
25
+ end
26
+ let(:orgs_with_acl) { [org1, org2] }
27
+ let(:orgs_ids) { orgs_with_acl.map(&:uid) }
10
28
 
11
- before { allow(user).to receive(:role).with(organization) { nil } }
29
+ before do
30
+ allow(user).to receive(:role).with(organization) { nil }
31
+ allow(user).to receive(:organizations).and_return(
32
+ double(:active, active: double(:include_acl, include_acl: orgs_with_acl))
33
+ )
34
+ end
12
35
 
13
36
  context 'when User#admin_role is admin' do
14
37
  let(:admin_role) { 'admin' }
@@ -23,4 +46,39 @@ RSpec.describe MnoEnterprise::Ability, type: :model do
23
46
  context 'when no User#admin_role' do
24
47
  it { is_expected.not_to be_able_to(:manage_app_instances, organization) }
25
48
  end
49
+
50
+ describe 'Impac! abilities' do
51
+ %i(dashboards widgets kpis).each do |component|
52
+ %i(create update destroy).each do |action|
53
+ context "when at least one organization cannot #{action} #{component}" do
54
+ before { org1.acl[:related][component][action] = true }
55
+
56
+ it do
57
+ impac_component = FactoryGirl.build(
58
+ "impac_#{component}".singularize.to_sym,
59
+ settings: { organization_ids: orgs_ids },
60
+ organization_ids: orgs_ids
61
+ )
62
+ is_expected.not_to be_able_to("#{action}_impac_#{component}".to_sym, impac_component)
63
+ end
64
+ end
65
+
66
+ context "when all the organizations can #{action} #{component}" do
67
+ before do
68
+ org1.acl[:related][component][action] = true
69
+ org2.acl[:related][component][action] = true
70
+ end
71
+
72
+ it do
73
+ impac_component = FactoryGirl.build(
74
+ "impac_#{component}".singularize.to_sym,
75
+ settings: { organization_ids: orgs_ids },
76
+ organization_ids: orgs_ids
77
+ )
78
+ is_expected.to be_able_to("#{action}_impac_#{component}".to_sym, impac_component)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
26
84
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mno-enterprise-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.3
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arnaud Lachaume
@@ -9,28 +9,28 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-10-26 00:00:00.000000000 Z
12
+ date: 2019-04-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
19
- - !ruby/object:Gem::Version
20
- version: '4.2'
21
18
  - - ">="
22
19
  - !ruby/object:Gem::Version
23
20
  version: 4.2.0
21
+ - - "~>"
22
+ - !ruby/object:Gem::Version
23
+ version: '4.2'
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
- - - "~>"
29
- - !ruby/object:Gem::Version
30
- version: '4.2'
31
28
  - - ">="
32
29
  - !ruby/object:Gem::Version
33
30
  version: 4.2.0
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.2'
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: her
36
36
  requirement: !ruby/object:Gem::Requirement
@@ -354,6 +354,7 @@ files:
354
354
  - app/models/mno_enterprise/org_invite.rb
355
355
  - app/models/mno_enterprise/organization.rb
356
356
  - app/models/mno_enterprise/shared_entity.rb
357
+ - app/models/mno_enterprise/sub_tenant.rb
357
358
  - app/models/mno_enterprise/team.rb
358
359
  - app/models/mno_enterprise/tenant.rb
359
360
  - app/models/mno_enterprise/tenant_invoice.rb
@@ -595,6 +596,7 @@ files:
595
596
  - lib/mno_enterprise/testing_support/factories/invoices.rb
596
597
  - lib/mno_enterprise/testing_support/factories/org_invite.rb
597
598
  - lib/mno_enterprise/testing_support/factories/organizations.rb
599
+ - lib/mno_enterprise/testing_support/factories/sub_tenants.rb
598
600
  - lib/mno_enterprise/testing_support/factories/team.rb
599
601
  - lib/mno_enterprise/testing_support/factories/tenant.rb
600
602
  - lib/mno_enterprise/testing_support/factories/tenant_invoice.rb
@@ -604,6 +606,8 @@ files:
604
606
  - lib/mno_enterprise/testing_support/mnoe_faraday_test_adapter.rb
605
607
  - lib/mno_enterprise/testing_support/organizations_shared_helpers.rb
606
608
  - lib/mno_enterprise/testing_support/request_spec_helper.rb
609
+ - lib/mno_enterprise/testing_support/shared_contexts/jpi_v1_admin_controller.rb
610
+ - lib/mno_enterprise/testing_support/shared_contexts/jpi_v1_admin_impac_controller.rb
607
611
  - lib/mno_enterprise/testing_support/shared_contexts/rake_task.rb
608
612
  - lib/mno_enterprise/testing_support/shared_examples/jpi_v1_admin.rb
609
613
  - lib/mno_enterprise/testing_support/user_action_shared.rb
@@ -661,40 +665,40 @@ required_rubygems_version: !ruby/object:Gem::Requirement
661
665
  version: '0'
662
666
  requirements: []
663
667
  rubyforge_project:
664
- rubygems_version: 2.6.14
668
+ rubygems_version: 2.7.8
665
669
  signing_key:
666
670
  specification_version: 4
667
671
  summary: Maestrano Enterprise - Core functionnality
668
672
  test_files:
669
- - spec/models/mno_enterprise/app_spec.rb
670
- - spec/models/mno_enterprise/organization_spec.rb
671
- - spec/models/mno_enterprise/app_instance_spec.rb
672
- - spec/models/mno_enterprise/impac/dashboard_spec.rb
673
- - spec/models/mno_enterprise/credit_card_spec.rb
673
+ - spec/spec_helper.rb
674
+ - spec/config/initializers/audit_log_spec.rb
674
675
  - spec/models/mno_enterprise/deletion_request_spec.rb
675
- - spec/models/mno_enterprise/identity_spec.rb
676
+ - spec/models/mno_enterprise/credit_card_spec.rb
676
677
  - spec/models/mno_enterprise/ability_spec.rb
677
- - spec/models/mno_enterprise/invoice_spec.rb
678
+ - spec/models/mno_enterprise/app_instance_spec.rb
679
+ - spec/models/mno_enterprise/organization_spec.rb
678
680
  - spec/models/mno_enterprise/shared_entity_spec.rb
679
- - spec/models/mno_enterprise/user_spec.rb
681
+ - spec/models/mno_enterprise/identity_spec.rb
682
+ - spec/models/mno_enterprise/impac/dashboard_spec.rb
680
683
  - spec/models/mno_enterprise/base_resource_spec.rb
681
- - spec/spec_helper.rb
682
- - spec/lib/mno_enterprise/smtp_client_spec.rb
684
+ - spec/models/mno_enterprise/invoice_spec.rb
685
+ - spec/models/mno_enterprise/app_spec.rb
686
+ - spec/models/mno_enterprise/user_spec.rb
683
687
  - spec/lib/mno_enterprise/mail_adapters/smtp_adapter_spec.rb
684
- - spec/lib/mno_enterprise/mail_adapters/mandrill_adapter_spec.rb
685
- - spec/lib/mno_enterprise/mail_adapters/sparkpost_adapter_spec.rb
686
688
  - spec/lib/mno_enterprise/mail_adapters/adapter_spec.rb
687
- - spec/lib/mno_enterprise/mail_client_spec.rb
689
+ - spec/lib/mno_enterprise/mail_adapters/sparkpost_adapter_spec.rb
690
+ - spec/lib/mno_enterprise/mail_adapters/mandrill_adapter_spec.rb
688
691
  - spec/lib/mno_enterprise/core_engine_spec.rb
692
+ - spec/lib/mno_enterprise/mail_client_spec.rb
693
+ - spec/lib/mno_enterprise/smtp_client_spec.rb
689
694
  - spec/lib/mno_enterprise/impac_client_spec.rb
690
695
  - spec/lib/devise/model/remote_authenticable_spec.rb
696
+ - spec/lib/mandrill_client_spec.rb
691
697
  - spec/lib/her_extension/her_orm_adapter.rb
692
698
  - spec/lib/her_extension/model/relation_spec.rb
693
- - spec/lib/mandrill_client_spec.rb
694
- - spec/rails_helper.rb
699
+ - spec/mno_enterprise_spec.rb
695
700
  - spec/controllers/mno_enterprise/i18n_spec.rb
696
701
  - spec/controllers/mno_enterprise/angular_csrf_spec.rb
697
702
  - spec/controllers/mno_enterprise/application_controller_spec.rb
698
- - spec/config/initializers/audit_log_spec.rb
699
- - spec/mno_enterprise_spec.rb
703
+ - spec/rails_helper.rb
700
704
  - spec/helpers/image_helper_spec.rb