pg_rails 7.5.3 → 7.5.4

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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/pg_associable/spec/pg_associable/helpers_spec.rb +14 -0
  3. data/pg_engine/app/controllers/concerns/pg_engine/require_tenant_set.rb +1 -1
  4. data/pg_engine/app/controllers/pg_engine/base_controller.rb +5 -3
  5. data/pg_engine/app/controllers/pg_engine/base_public_controller.rb +4 -0
  6. data/pg_engine/app/controllers/pg_engine/health_controller.rb +0 -1
  7. data/pg_engine/app/models/email.rb +0 -1
  8. data/pg_engine/app/models/user.rb +9 -0
  9. data/pg_engine/app/models/user_account.rb +6 -2
  10. data/pg_engine/app/views/users/account_switcher/list.html.slim +20 -16
  11. data/pg_engine/config/initializers/acts_as_tenant.rb +3 -12
  12. data/pg_engine/db/seeds.rb +3 -4
  13. data/pg_engine/lib/pg_engine/utils/pg_logger.rb +5 -0
  14. data/pg_engine/spec/controllers/admin/accounts_controller_spec.rb +1 -1
  15. data/pg_engine/spec/controllers/admin/users_controller_spec.rb +1 -1
  16. data/pg_engine/spec/controllers/devise/sessions_controller_spec.rb +1 -0
  17. data/pg_engine/spec/controllers/users/registrations_controller_spec.rb +1 -1
  18. data/pg_engine/spec/factories/users.rb +5 -1
  19. data/pg_engine/spec/lib/pg_engine/mailgun/log_sync_spec.rb +4 -0
  20. data/pg_engine/spec/models/email_spec.rb +5 -0
  21. data/pg_engine/spec/requests/current_attributes_spec.rb +22 -0
  22. data/pg_engine/spec/requests/devise_spec.rb +24 -0
  23. data/pg_engine/spec/requests/users/switcher_spec.rb +11 -1
  24. data/pg_layout/app/views/devise/sessions/new.html.erb +1 -1
  25. data/pg_rails/lib/pg_rails/current_attributes_support.rb +6 -0
  26. data/pg_rails/lib/pg_rails/rspec_logger_matchers.rb +13 -1
  27. data/pg_rails/lib/version.rb +1 -1
  28. data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/edit_spec.rb +1 -1
  29. data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/index_spec.rb +1 -1
  30. data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/new_spec.rb +1 -1
  31. data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/show_spec.rb +1 -1
  32. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b312261e863e04fcc457b8b773531325d1c69f9b4ef0ca1269b39853f737844a
4
- data.tar.gz: 641bbe1b7b128e67ec7ffb874765dfeae35aac6dadf917fcbe4367b3c98939cb
3
+ metadata.gz: 0f12846cd393967f0aac07acebf37b6799a9e67983da3ee892311aac4fd8a93b
4
+ data.tar.gz: dc6a9d65a1454b891de4bcd751f5f74f1b51a27d2fdc46c0baaf216db28a9306
5
5
  SHA512:
6
- metadata.gz: 66f4093830e6a889cf66cfc39e6b0bfb015e93ad8e48c0e33a2c3292363f7511dbc1062b7b9993d0e0e2277ae49986c9eb0390572d63a2100a6057fb6b20e213
7
- data.tar.gz: dc1b35305080b8bd01dbafeea7453bcf8f7bd85fe4609ee7657f18985402b86f755c170b39ce28b55e5c3939a2f5659f57e9ba3ee8336877ef8c18712fcf01be
6
+ metadata.gz: a832616bb110d3662bc1b2f07991f4dc9015ba95a0e17584b749c36058cea9d87928ca7403cc3c46a62789f13abdaff3c827be6bce8d3468420861380bddff3b
7
+ data.tar.gz: 3c103db1aa747b5fd09757c680505d203d06afad591b46ee1903d36037a35de5b2b02ef0475f15f4f8e222accfafb21a8f75a2932b83e93f7fa6c2a82eb763b7
@@ -1,6 +1,20 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe PgAssociable::Helpers do
4
+ include ActiveSupport::CurrentAttributes::TestHelper
5
+
6
+ describe 'current attributes gets reset' do
7
+ it 'sets a current attribute' do
8
+ Current.user = 1
9
+ expect(Current.namespace).to be_nil
10
+ end
11
+
12
+ it 'the attribute gets reset' do
13
+ Current.namespace = 2
14
+ expect(Current.user).to be_nil
15
+ end
16
+ end
17
+
4
18
  # DEPRECATED
5
19
  describe '#pg_respond_buscar with query scope' do
6
20
  let(:ctrl) do
@@ -9,7 +9,7 @@ module PgEngine
9
9
  def require_tenant_set
10
10
  return if ActsAsTenant.current_tenant.present?
11
11
 
12
- redirect_to users_account_switcher_path
12
+ raise ActsAsTenant::Errors::NoTenantSet
13
13
  end
14
14
  end
15
15
  end
@@ -17,18 +17,20 @@ module PgEngine
17
17
  # if ActsAsTenant.current_tenant.blank? && !global_domain?
18
18
  # raise ActsAsTenant::Errors::NoTenantSet
19
19
  # end
20
+ # FIXME: if current_tenant.present? check it's not discarded
20
21
 
21
22
  if Current.user.present?
23
+ user_accounts = Current.user.user_accounts.kept
22
24
  if ActsAsTenant.current_tenant.present?
23
- unless Current.user.user_accounts.exists?(account: ActsAsTenant.current_tenant)
25
+ unless user_accounts.exists?(account: ActsAsTenant.current_tenant)
24
26
  sign_out(Current.user)
25
27
  throw :warden, scope: :user, message: :invalid
26
28
  end
27
29
 
28
30
  @current_tenant_set_by_domain_or_subdomain = true
29
31
  else
30
- account = if Current.user.user_accounts.count == 1
31
- Current.user.user_accounts.first.account
32
+ account = if user_accounts.count == 1
33
+ user_accounts.first.account
32
34
  elsif session['current_user_account'].present?
33
35
  UserAccount.where(id: session['current_user_account']).first&.account
34
36
  end
@@ -1,5 +1,9 @@
1
1
  module PgEngine
2
2
  class BasePublicController < ApplicationController
3
+ before_action do
4
+ Current.namespace = :public
5
+ end
6
+
3
7
  # :nocov:
4
8
  def login_as
5
9
  return head :bad_request unless dev_user_or_env?
@@ -35,7 +35,6 @@ module PgEngine
35
35
 
36
36
  def html_status(color:)
37
37
  %(<!DOCTYPE html><html><body style="background-color: #{color}"></body></html>).html_safe
38
- # rubocop:enable Rails/OutputSafety
39
38
  end
40
39
  end
41
40
  end
@@ -47,7 +47,6 @@ class Email < ApplicationRecord
47
47
  has_one_attached :encoded_eml
48
48
 
49
49
  acts_as_tenant :account, optional: true
50
-
51
50
  tenantable_belongs_to :associated, polymorphic: true, optional: true,
52
51
  assign_tenant_from_associated: true
53
52
 
@@ -71,6 +71,15 @@ class User < ApplicationRecord
71
71
 
72
72
  attr_accessor :orphan
73
73
 
74
+ def active_for_authentication?
75
+ super && kept?
76
+ end
77
+
78
+ # TODO: test
79
+ def inactive_message
80
+ kept? ? super : :locked
81
+ end
82
+
74
83
  after_create do
75
84
  create_account unless orphan
76
85
  end
@@ -32,8 +32,12 @@ class UserAccount < ApplicationRecord
32
32
  belongs_to :creado_por, optional: true, class_name: 'User'
33
33
  belongs_to :actualizado_por, optional: true, class_name: 'User'
34
34
 
35
+ # scope :kept, -> { undiscarded.joins(:account).merge(Account.kept) }
36
+ scope :kept, -> { joins(:account).merge(Account.kept) }
37
+
35
38
  enumerize :profiles, in: {
36
- admin: 1,
37
- editor: 2
39
+ administracion: 1,
40
+ operacion: 2,
41
+ lectura: 3
38
42
  }, multiple: true
39
43
  end
@@ -1,20 +1,24 @@
1
1
  h1 Cambiar a otra cuenta
2
2
 
3
- - if @current_tenant_set_by_domain_or_subdomain
4
- p Estás en el dominio de #{ActsAsTenant.current_tenant} (#{request.host})
5
- p
6
- | Para cambiar de cuenta vas a tener que iniciar sesión en el dominio
7
- |< de Bien o de la cuenta específica a la que quieras cambiar
3
+ / FIXME!: user_accounts add active column
4
+ - if @user_accounts.empty?
5
+ p No tenés ninguna cuenta disponible
6
+ - else
7
+ - if @current_tenant_set_by_domain_or_subdomain
8
+ p Estás en el dominio de #{ActsAsTenant.current_tenant} (#{request.host})
9
+ p
10
+ | Para cambiar de cuenta vas a tener que iniciar sesión en el dominio
11
+ |< de Bien o de la cuenta específica a la que quieras cambiar
8
12
 
9
- ul.m-auto.list-group style="max-width: 20em"
10
- - @user_accounts.each do |user_account|
11
- li.list-group-item
12
- - if @current_tenant_set_by_domain_or_subdomain
13
- = user_account.account
14
- - elsif user_account.account == ActsAsTenant.current_tenant
15
- b
13
+ ul.m-auto.list-group style="max-width: 20em"
14
+ - @user_accounts.each do |user_account|
15
+ li.list-group-item
16
+ - if @current_tenant_set_by_domain_or_subdomain
16
17
  = user_account.account
17
- | (Actual)
18
- - else
19
- = link_to user_account.account, users_account_switch_path(user_account),
20
- 'data-turbo-method': :post
18
+ - elsif user_account.account == ActsAsTenant.current_tenant
19
+ b
20
+ = user_account.account
21
+ | (Actual)
22
+ - else
23
+ = link_to user_account.account, users_account_switch_path(user_account),
24
+ 'data-turbo-method': :post
@@ -1,16 +1,7 @@
1
1
  ActsAsTenant.configure do |config|
2
- config.require_tenant = true
3
- # config.require_tenant = lambda do |options|
4
- # # if options[:scope] == User && true # global_domain?
5
- # # # tal vez en algunos casos de devise sí requeriría el tenant?
6
- # # # creería que no, el único lugar en donde se debería queriar
7
- # # # User es en devise y es para obtener el current_user
8
- # # # hay que ver luego qué pasa con invitable
9
- # # false
10
- # # else
11
- # # true
12
- # # end
13
- # end
2
+ config.require_tenant = lambda do
3
+ Current.namespace == :users
4
+ end
14
5
 
15
6
  # Customize the query for loading the tenant in background jobs
16
7
  # config.job_scope = ->{ all }
@@ -1,11 +1,10 @@
1
1
  DatabaseCleaner.clean_with(:truncation, except: %w(ar_internal_metadata))
2
2
 
3
-
4
3
  bien = FactoryBot.create(:account, nombre: 'Bien', subdomain: 'bien')
5
4
  rosso = FactoryBot.create(:user, email: 'mrosso10@gmail.com', nombre: 'Martín', apellido: 'Rosso', password: 'admin123',
6
5
  confirmed_at: Time.now, developer: true, orphan: true)
7
6
 
8
- bien.user_accounts.create(user: rosso, profiles: [:admin])
7
+ bien.user_accounts.create(user: rosso, profiles: [:administracion])
9
8
 
10
9
  racionalismo = FactoryBot.create(:account, nombre: 'Racionalismo', subdomain: 'racionalismo')
11
10
  baruch = FactoryBot.create(:user, email: 'baruch@bien.com', nombre: 'Baruch', apellido: 'Spinoza', password: 'admin123',
@@ -13,5 +12,5 @@ baruch = FactoryBot.create(:user, email: 'baruch@bien.com', nombre: 'Baruch', ap
13
12
  rené = FactoryBot.create(:user, email: 'rene@bien.com', nombre: 'René', apellido: 'Descartes', password: 'admin123',
14
13
  confirmed_at: Time.now, orphan: true)
15
14
 
16
- racionalismo.user_accounts.create(user: baruch, profiles: [:admin])
17
- racionalismo.user_accounts.create(user: rené, profiles: [:editor])
15
+ racionalismo.user_accounts.create(user: baruch, profiles: [:administracion])
16
+ racionalismo.user_accounts.create(user: rené, profiles: [:operacion])
@@ -36,6 +36,11 @@ def pg_log(*)
36
36
  PgEngine::PgLogger.log(*)
37
37
  end
38
38
 
39
+ # To be called inside a method or block that is deprecated
40
+ def pg_deprecation(method, message = nil, deprecator:)
41
+ deprecator.warn(deprecator.deprecation_warning(method, message), caller_locations(3))
42
+ end
43
+
39
44
  module PgEngine
40
45
  class PgLogger
41
46
  def self.test_logged_messages
@@ -42,7 +42,7 @@ RSpec.describe Admin::AccountsController do
42
42
  }
43
43
  end
44
44
 
45
- let(:user) { create :user, :admin }
45
+ let(:user) { create :user, :developer }
46
46
 
47
47
  before do
48
48
  sign_in user if user.present?
@@ -43,7 +43,7 @@ RSpec.describe Admin::UsersController do
43
43
  }
44
44
  end
45
45
 
46
- let(:logged_user) { create :user, :admin }
46
+ let(:logged_user) { create :user, :developer }
47
47
 
48
48
  before do
49
49
  sign_in logged_user
@@ -2,6 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe Devise::SessionsController do
4
4
  before do
5
+ ActsAsTenant.current_tenant = nil
5
6
  # rubocop:disable RSpec/InstanceVariable
6
7
  @request.env['devise.mapping'] = Devise.mappings[:user]
7
8
  # rubocop:enable RSpec/InstanceVariable
@@ -51,7 +51,7 @@ describe Users::RegistrationsController do
51
51
  describe '#edit' do
52
52
  subject { get :edit }
53
53
 
54
- let(:logger_user) { create :user, :admin }
54
+ let(:logger_user) { create :user, :developer }
55
55
 
56
56
  before do
57
57
  sign_in logger_user
@@ -58,7 +58,11 @@ FactoryBot.define do
58
58
  end
59
59
 
60
60
  trait :admin do
61
- developer { true }
61
+ developer do
62
+ pg_deprecation 'trait "admin"', 'use trait "developer" instead',
63
+ deprecator: PgEngine.deprecator
64
+ true
65
+ end
62
66
  end
63
67
 
64
68
  trait :developer do
@@ -5,6 +5,10 @@ describe PgEngine::Mailgun::LogSync, vcr: { cassette_name: 'mailgun/log_sync_dow
5
5
  match_requests_on: %i[method host] } do
6
6
  let(:instancia) { described_class }
7
7
 
8
+ before do
9
+ ActsAsTenant.current_tenant = nil
10
+ end
11
+
8
12
  describe '#download' do
9
13
  subject do
10
14
  instancia.download
@@ -11,6 +11,11 @@ RSpec.describe Email do
11
11
  expect(email).to be_persisted
12
12
  end
13
13
 
14
+ it 'se persiste cuando no hay tenant' do
15
+ ActsAsTenant.current_tenant = nil
16
+ expect(email).to be_persisted
17
+ end
18
+
14
19
  describe 'update_status!' do
15
20
  context 'cuando hay accepted y delivered' do
16
21
  subject do
@@ -0,0 +1,22 @@
1
+ require 'rails_helper'
2
+
3
+ describe 'current attributes' do
4
+ it 'Current gets reset between requests' do
5
+ allow(Current).to receive(:namespace=)
6
+ allow(Current.instance).to receive(:reset)
7
+ get '/contacto/new'
8
+ expect(Current).to have_received(:namespace=).with(:public)
9
+ expect(Current.instance).to have_received(:reset).at_least(:twice)
10
+ expect(Current.namespace).to be_nil
11
+ end
12
+
13
+ it 'sets a current attribute' do
14
+ Current.user = 1
15
+ expect(Current.namespace).to be_nil
16
+ end
17
+
18
+ it 'the attribute gets reset' do
19
+ Current.namespace = 2
20
+ expect(Current.user).to be_nil
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails_helper'
2
+
3
+ describe 'devise flows' do
4
+ describe 'resend confirmation' do
5
+ subject do
6
+ post '/users/confirmation', params: { user: { email: user.email } }
7
+ end
8
+
9
+ let!(:user) { create :user, confirmed_at: nil }
10
+
11
+ it do
12
+ expect { subject }.to change(ActionMailer::Base.deliveries, :length).by(1)
13
+ end
14
+
15
+ it do
16
+ subject
17
+ expect(response).to redirect_to(new_user_session_path)
18
+ end
19
+
20
+ it do
21
+ expect { subject }.not_to have_errored
22
+ end
23
+ end
24
+ end
@@ -26,6 +26,16 @@ describe 'redirection' do
26
26
  expect(response).to have_http_status(:ok)
27
27
  end
28
28
 
29
+ context 'when account is discarded' do
30
+ it do
31
+ get '/u/cosas'
32
+ expect(response.body).to include 'No hay cosos que mostrar'
33
+ logged_user.user_accounts.first.account.discard!
34
+ get '/u/cosas'
35
+ expect(response).to redirect_to users_account_switcher_path
36
+ end
37
+ end
38
+
29
39
  context 'when has been removed from account' do
30
40
  let!(:other_account) { create :account }
31
41
  let!(:other_user_account) { logged_user.user_accounts.create(account: other_account) }
@@ -48,7 +58,7 @@ describe 'redirection' do
48
58
  expect(response.body).to include other_account.to_s
49
59
  expect(response.body).to include 'No hay cosos que mostrar'
50
60
  other_user_account.destroy!
51
- get '/'
61
+ get '/u/cosas'
52
62
  expect(response).to redirect_to users_account_switcher_path
53
63
  end
54
64
  end
@@ -32,7 +32,7 @@
32
32
  <br>
33
33
  <br>
34
34
  <ul style="max-width: 500px">
35
- <% User.order(:id).each do |user| %>
35
+ <% User.kept.order(:id).each do |user| %>
36
36
  <li><%= link_to user, login_as_path(id: user.id) %></li>
37
37
  <% end %>
38
38
  </ul>
@@ -1,3 +1,9 @@
1
+ pg_deprecation(
2
+ 'requiring current_attributes_support',
3
+ 'instead use "include ActiveSupport::CurrentAttributes::TestHelper" when necessary',
4
+ deprecator: PgEngine.deprecator
5
+ )
6
+
1
7
  RSpec.configure do |config|
2
8
  config.before(:each) do
3
9
  Current.user = nil
@@ -33,6 +33,18 @@ module PgEngine
33
33
  end
34
34
  end
35
35
 
36
+ def failure_message_when_negated
37
+ msg = "expected not to #{@level || log}"
38
+ msg << "with text: #{@text}" if @text.present?
39
+ return msg unless @new_messages.any?
40
+
41
+ msg << "\nLogged messages:"
42
+ @new_messages.each do |level, message|
43
+ msg << "\n #{level}: #{message[0..500]}"
44
+ end
45
+ msg
46
+ end
47
+
36
48
  def failure_message
37
49
  msg = "expected to #{@level || log}"
38
50
  msg << "with text: #{@text}" if @text.present?
@@ -40,7 +52,7 @@ module PgEngine
40
52
 
41
53
  msg << "\nLogged messages:"
42
54
  @new_messages.each do |level, message|
43
- msg << "\n #{level}: #{message[0..200]}"
55
+ msg << "\n #{level}: #{message[0..500]}"
44
56
  end
45
57
  msg
46
58
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.5.3'
4
+ VERSION = '7.5.4'
5
5
  end
@@ -9,7 +9,7 @@ RSpec.describe "<%= ruta_vistas %>/edit", <%= type_metatag(:view) %> do
9
9
  helper <%= mountable_engine? %>::Engine.routes.url_helpers
10
10
  <% end -%>
11
11
 
12
- let(:user) { create(:user, :admin) }
12
+ let(:user) { create(:user, :developer) }
13
13
 
14
14
  before(:each) do
15
15
  sign_in user
@@ -9,7 +9,7 @@ RSpec.describe "<%= ruta_vistas %>/index", <%= type_metatag(:view) %> do
9
9
  helper <%= mountable_engine? %>::Engine.routes.url_helpers
10
10
  <% end -%>
11
11
 
12
- let(:user) { create(:user, :admin) }
12
+ let(:user) { create(:user, :developer) }
13
13
  let!(:<%= plural_name %>) { create_list(:<%= nombre_tabla_completo_singular %>, rand(10..20))}
14
14
 
15
15
  before(:each) do
@@ -9,7 +9,7 @@ RSpec.describe "<%= ruta_vistas %>/new", <%= type_metatag(:view) %> do
9
9
  helper <%= mountable_engine? %>::Engine.routes.url_helpers
10
10
  <% end -%>
11
11
 
12
- let(:user) { create(:user, :admin) }
12
+ let(:user) { create(:user, :developer) }
13
13
 
14
14
  before(:each) do
15
15
  sign_in user
@@ -9,7 +9,7 @@ RSpec.describe "<%= ruta_vistas %>/show", <%= type_metatag(:view) %> do
9
9
  helper <%= mountable_engine? %>::Engine.routes.url_helpers
10
10
  <% end -%>
11
11
 
12
- let(:user) { create(:user, :admin) }
12
+ let(:user) { create(:user, :developer) }
13
13
 
14
14
  before(:each) do
15
15
  sign_in user
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.5.3
4
+ version: 7.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martín Rosso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-12 00:00:00.000000000 Z
11
+ date: 2024-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -878,6 +878,8 @@ files:
878
878
  - pg_engine/spec/pg_engine/pdf_preview_generator_spec.rb
879
879
  - pg_engine/spec/requests/admin/eventos_spec.rb
880
880
  - pg_engine/spec/requests/base_controller_requests_spec.rb
881
+ - pg_engine/spec/requests/current_attributes_spec.rb
882
+ - pg_engine/spec/requests/devise_spec.rb
881
883
  - pg_engine/spec/requests/users/accounts_spec.rb
882
884
  - pg_engine/spec/requests/users/base_controller_spec.rb
883
885
  - pg_engine/spec/requests/users/date_jumper_spec.rb