Skip to content

Commit

Permalink
Merge pull request #563 from coopdevs/develop
Browse files Browse the repository at this point in the history
v2.3.0
  • Loading branch information
sauloperez authored Apr 23, 2020
2 parents da19296 + 37f32a5 commit 3b61294
Show file tree
Hide file tree
Showing 10 changed files with 79 additions and 102 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ group :development, :test do
end

group :test do
gem "rspec-rails", '~> 3.8.2'
gem "rspec-rails", '~> 3.9'
gem "database_cleaner", '1.6.2'
gem 'shoulda-matchers', '~> 3.1.2'
gem 'fabrication', '~> 2.20'
Expand Down
26 changes: 13 additions & 13 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -288,23 +288,23 @@ GEM
rexml (3.2.4)
rollbar (2.8.3)
multi_json
rspec-core (3.8.0)
rspec-support (~> 3.8.0)
rspec-expectations (3.8.2)
rspec-core (3.9.1)
rspec-support (~> 3.9.1)
rspec-expectations (3.9.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-mocks (3.8.0)
rspec-support (~> 3.9.0)
rspec-mocks (3.9.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-rails (3.8.2)
rspec-support (~> 3.9.0)
rspec-rails (3.9.0)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.8.0)
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-support (~> 3.8.0)
rspec-support (3.8.0)
rspec-core (~> 3.9.0)
rspec-expectations (~> 3.9.0)
rspec-mocks (~> 3.9.0)
rspec-support (~> 3.9.0)
rspec-support (3.9.2)
rubocop (0.80.0)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
Expand Down Expand Up @@ -433,7 +433,7 @@ DEPENDENCIES
rails-i18n
rdiscount
rollbar (= 2.8.3)
rspec-rails (~> 3.8.2)
rspec-rails (~> 3.9)
rubocop (~> 0.80.0)
sass-rails (~> 5.0.7)
select2-rails
Expand Down
18 changes: 16 additions & 2 deletions app/jobs/organization_notifier_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#
# Strategy: go throught all organizations and take latest active posts from last week
# posted by active members. Send an email to all active and online members
# with the email notifications enabled with those posts.
# with the email notifications enabled with those posts. Group emails by user's locale.

# Schedule defined in config/schedule.yml file.

Expand All @@ -12,9 +12,23 @@ class OrganizationNotifierJob < ActiveJob::Base
def perform
Organization.all.find_each do |org|
posts = org.posts.active.of_active_members.from_last_week

if posts.present?
OrganizationNotifier.recent_posts(posts).deliver_now
users_by_locale(org).each do |locale, users|
OrganizationNotifier.recent_posts(posts, locale, users).deliver_now
end
end
end
end

private

def users_by_locale(organization)
with_notifications = organization.users.online_active.actives.notifications
org_locales = with_notifications.pluck(:locale).uniq

org_locales.each_with_object({}) do |locale, hash|
hash[locale] = with_notifications.where(locale: locale)
end
end
end
18 changes: 4 additions & 14 deletions app/mailers/organization_notifier.rb
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
class OrganizationNotifier < ActionMailer::Base
default from: "\"TimeOverflow\" <[email protected]>"

# Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup:
#
# en.organization_notifier.recent_posts.subject
#
def recent_posts(posts)
def recent_posts(posts, locale, users)
# last 10 posts of offers and inquiries
@offers = posts.where(type: "Offer").take(10)
@inquiries = posts.where(type: "Inquiry").take(10)

@organization_name = posts.take.organization.name

mail(bcc: emails_newsletter(posts))
end

private

def emails_newsletter(posts)
posts.take.organization.users.online_active.actives.
notifications.pluck(:email)
I18n.with_locale(locale) do
mail(bcc: users.map(&:email))
end
end
end
4 changes: 2 additions & 2 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -347,8 +347,8 @@ en:
mailers_globals:
footer:
text: "%{organization_name} from"
text_donation: The ADBdT association offers TimeOverflow for free to Time Banks. With a donation of %{href} you can help maintain and improve the platform.
text_donation_link: 1€ a month
text_donation: The ADBdT association offers TimeOverflow for free to Time Banks. If you want to help maintain and improve the platform %{href}.
text_donation_link: visit this website
offers:
edit:
submit: Change offer
Expand Down
21 changes: 1 addition & 20 deletions spec/controllers/offers_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,6 @@
get :show, id: offer.id
expect(assigns(:destination_account)).to eq(member.account)
end

it 'displays the offer\'s user details' do
get :show, id: offer.id
expect(response.body).to include(offer.user.email)
end
end
end
end
Expand All @@ -118,11 +113,6 @@
allow(controller).to receive(:@current_organization).and_return(another_organization)
end

it 'displays the offer\'s user details' do
get :show, id: offer.id
expect(response.body).to include(offer.user.email)
end

it 'sets the offer\'s organization as user\'s current organization' do
get :show, id: offer.id
expect(session[:current_organization_id]).to eq(offer.organization_id)
Expand All @@ -136,23 +126,14 @@
let(:another_user) { Fabricate(:user) }

before { login(another_user) }

it 'doesn\'t display the offer\'s user details' do
get :show, id: offer.id
expect(response.body).to_not include(offer.user.email)
end
end

context 'when the user is not logged in' do
it 'assigns the requested offer to @offer' do
get :show, id: offer.id
expect(assigns(:offer)).to eq(offer)
end

it 'doesn\'t display the offer\'s user details' do
get :show, id: offer.id
expect(response.body).to_not include(offer.user.email)
end

end
end

Expand Down
19 changes: 9 additions & 10 deletions spec/controllers/organizations_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,6 @@
let(:member) { Fabricate(:member, organization: organization) }
let(:user) { member.user }

describe 'GET #show' do
it 'displays the organization page' do
get 'show', id: organization.id

expect(assigns(:organization)).to eq(organization)
expect(response.status).to eq(200)
expect(response.body).to include(organization.name)
end
end

describe 'GET #index' do
it 'populates and array of organizations' do
get :index
Expand All @@ -23,6 +13,15 @@
end
end

describe 'GET #show' do
it 'displays the organization page' do
get 'show', id: organization.id

expect(assigns(:organization)).to eq(organization)
expect(response.status).to eq(200)
end
end

describe 'POST #create' do
it 'only superdamins are authorized create to new organizations' do
login(member.user)
Expand Down
19 changes: 19 additions & 0 deletions spec/jobs/organization_notifier_job_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
require 'spec_helper'

RSpec.describe OrganizationNotifierJob, type: :job do
let!(:org) { Fabricate(:organization) }
let!(:user) { Fabricate(:user, locale: :en, sign_in_count: 1) }
let!(:member) { Fabricate(:member, organization: org, user: user) }
let!(:user2) { Fabricate(:user, locale: :ca, sign_in_count: 2) }
let!(:member2) { Fabricate(:member, organization: org, user: user2) }
let!(:offer) { Fabricate(:offer, organization: org, user: user) }
let!(:inquiry) { Fabricate(:inquiry, organization: org, user: user2) }

describe '#perform' do
it "should send emails in user's locale" do
expect {
OrganizationNotifierJob.perform_now
}.to change { ActionMailer::Base.deliveries.count }.by(2)
end
end
end
50 changes: 10 additions & 40 deletions spec/mailers/organization_notifier_spec.rb
Original file line number Diff line number Diff line change
@@ -1,60 +1,30 @@
require "spec_helper"

RSpec.describe OrganizationNotifier do
let (:test_organization) { Fabricate(:organization) }
let! (:offer) { Fabricate(:offer, organization: test_organization) }
let! (:inquiry) { Fabricate(:inquiry, organization: test_organization) }
let (:user) do
Fabricate(:user, sign_in_count: 2, email: "[email protected]")
end
let (:another_user) { Fabricate(:user, sign_in_count: 1) }
let (:yet_another_user) { Fabricate(:user, sign_in_count: 0) }
let! (:member) do
Fabricate(:member,
organization: test_organization,
user: user,
active: true)
end
let! (:another_member) do
Fabricate(:member,
organization: test_organization,
user: another_user,
active: false)
end
let! (:yet_another_member) do
Fabricate(:member,
organization: test_organization,
user: yet_another_user,
active: true)
end

before(:each) do
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.deliveries = []
OrganizationNotifier.recent_posts(test_organization.posts).deliver_now
end

after(:each) do
ActionMailer::Base.deliveries.clear
end
let(:test_organization) { Fabricate(:organization) }
let!(:offer) { Fabricate(:offer, organization: test_organization) }
let!(:inquiry) { Fabricate(:inquiry, organization: test_organization) }
let(:user) { Fabricate(:user, email: "[email protected]", locale: :en) }
let(:member) { Fabricate(:member, organization: test_organization, user: user) }

describe "send an email" do
it "should send an email" do
expect(ActionMailer::Base.deliveries.count).to eq(1)
expect {
OrganizationNotifier.recent_posts(test_organization.posts, :en, [user]).deliver_now
}.to change { ActionMailer::Base.deliveries.count }.by(1)
end
end

describe "recent posts" do
let(:mail) { OrganizationNotifier.recent_posts(test_organization.posts) }
let(:mail) { OrganizationNotifier.recent_posts(test_organization.posts, :en, [user]) }

it "receive email only active and online users" do
expect(mail.bcc).to eql(["[email protected]"])
end
it "to should be null" do
expect(mail.to).to be_nil
end
it "assigns @organization_name" do
it "body contains organization name" do
expect(mail.body.encoded).to match(test_organization.name)
end
end
Expand Down
4 changes: 4 additions & 0 deletions spec/views/organizations/show.html.erb_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,9 @@
it 'diplays the movements section' do
expect(rendered).to match t('shared.movements.movements')
end

it 'displays the organization page' do
expect(rendered).to match(organization.name)
end
end
end

0 comments on commit 3b61294

Please sign in to comment.