Merge pull request #324 from coopdevs/develop
Release February 2018 / 1
This commit is contained in:
1
Capfile
1
Capfile
@ -16,6 +16,7 @@ require 'capistrano/deploy'
|
||||
# https://github.com/capistrano/passenger
|
||||
#
|
||||
require 'capistrano/rails'
|
||||
require 'capistrano/rbenv'
|
||||
|
||||
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
|
||||
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
|
||||
|
||||
2
Gemfile
2
Gemfile
@ -26,6 +26,7 @@ gem 'prawn-table'
|
||||
gem 'bundler', '>= 1.10.6'
|
||||
gem 'elasticsearch-model'
|
||||
gem 'elasticsearch-rails'
|
||||
gem 'skylight'
|
||||
|
||||
# Assets
|
||||
gem 'jquery-rails', '4.0.4'
|
||||
@ -46,6 +47,7 @@ group :development do
|
||||
gem 'web-console', '2.1.3'
|
||||
gem 'capistrano', '~> 3.1'
|
||||
gem 'capistrano-rails', '~> 1.1'
|
||||
gem 'capistrano-rbenv', '~> 2.1'
|
||||
gem 'airbrussh', require: false
|
||||
gem "quiet_assets"
|
||||
gem 'localeapp', '2.1.1', require: false
|
||||
|
||||
@ -93,6 +93,9 @@ GEM
|
||||
capistrano-rails (1.1.5)
|
||||
capistrano (~> 3.1)
|
||||
capistrano-bundler (~> 1.1)
|
||||
capistrano-rbenv (2.1.3)
|
||||
capistrano (~> 3.1)
|
||||
sshkit (~> 1.3)
|
||||
capybara (2.4.4)
|
||||
mime-types (>= 1.16)
|
||||
nokogiri (>= 1.3.3)
|
||||
@ -327,6 +330,8 @@ GEM
|
||||
simple_form (3.1.0)
|
||||
actionpack (~> 4.0)
|
||||
activemodel (~> 4.0)
|
||||
skylight (1.5.0)
|
||||
activesupport (>= 3.0.0)
|
||||
sprockets (3.7.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
@ -382,6 +387,7 @@ DEPENDENCIES
|
||||
byebug
|
||||
capistrano (~> 3.1)
|
||||
capistrano-rails (~> 1.1)
|
||||
capistrano-rbenv (~> 2.1)
|
||||
capybara (~> 2.4.4)
|
||||
coffee-rails
|
||||
dalli
|
||||
@ -421,6 +427,7 @@ DEPENDENCIES
|
||||
select2-rails
|
||||
shoulda (>= 3.5)
|
||||
simple_form (>= 3.0.0)
|
||||
skylight
|
||||
thin
|
||||
uglifier (= 2.7.2)
|
||||
unicorn
|
||||
|
||||
@ -18,4 +18,11 @@ class OffersController < PostsController
|
||||
offers[category] = list if list.present?
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
super
|
||||
|
||||
member = @offer.user.members.find_by(organization: current_organization)
|
||||
@destination_account = member.account if member
|
||||
end
|
||||
end
|
||||
|
||||
@ -43,7 +43,6 @@ class Post < ActiveRecord::Base
|
||||
belongs_to :user
|
||||
belongs_to :organization
|
||||
belongs_to :publisher, class_name: "User", foreign_key: "publisher_id"
|
||||
# belongs_to :member, class_name: "Member", foreign_key: "user_id"
|
||||
has_many :user_members, class_name: "Member", through: :user, source: :members
|
||||
has_many :transfers
|
||||
has_many :movements, through: :transfers
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if current_user and @offer.user != current_user %>
|
||||
<%= link_to new_transfer_path(id: @offer.user.id, offer: @offer.id),
|
||||
<%= link_to new_transfer_path(id: @offer.user.id, offer: @offer.id, destination_account_id: @destination_account.id),
|
||||
class: "btn btn-success" do %>
|
||||
<%= glyph :time %>
|
||||
<%= t ".give_time_for" %>
|
||||
|
||||
@ -25,6 +25,10 @@ test:
|
||||
<<: *defaults
|
||||
database: <%= ENV.fetch('DATABASE_NAME', 'timeoverflow_test') %>
|
||||
|
||||
staging:
|
||||
<<: *defaults
|
||||
database: <%= ENV.fetch('DATABASE_NAME', 'timeoverflow_staging') %>
|
||||
|
||||
production:
|
||||
# Set DATABASE_URL environment variable
|
||||
url: <%= ENV['DATABASE_URL'] %>
|
||||
|
||||
@ -4,8 +4,10 @@ lock '3.4.0'
|
||||
set :application, 'timeoverflow'
|
||||
set :repo_url, 'git@github.com:coopdevs/timeoverflow.git'
|
||||
|
||||
set :rbenv_type, :user
|
||||
|
||||
# Default branch is :master
|
||||
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
|
||||
ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
|
||||
|
||||
# Default deploy_to directory is /var/www/my_app_name
|
||||
# set :deploy_to, '/var/www/my_app_name'
|
||||
|
||||
@ -0,0 +1 @@
|
||||
server 'staging.timeoverflow.org', user: 'timeoverflow', roles: %w(app db web)
|
||||
|
||||
98
config/environments/staging.rb
Normal file
98
config/environments/staging.rb
Normal file
@ -0,0 +1,98 @@
|
||||
Rails.application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb.
|
||||
|
||||
# Code is not reloaded between requests.
|
||||
config.cache_classes = true
|
||||
|
||||
# Eager load code on boot. This eager loads most of Rails and
|
||||
# your application in memory, allowing both threaded web servers
|
||||
# and those relying on copy on write to perform better.
|
||||
# Rake tasks automatically ignore this option for performance.
|
||||
config.eager_load = true
|
||||
|
||||
# Full error reports are disabled and caching is turned on.
|
||||
config.consider_all_requests_local = false
|
||||
config.action_controller.perform_caching = true
|
||||
|
||||
# Enable Rack::Cache to put a simple HTTP cache in front of your application
|
||||
# Add `rack-cache` to your Gemfile before enabling this.
|
||||
# For large-scale production use, consider using a caching reverse proxy like
|
||||
# NGINX, varnish or squid.
|
||||
# config.action_dispatch.rack_cache = true
|
||||
|
||||
# Disable serving static files from the `/public` folder by default since
|
||||
# Apache or NGINX already handles this.
|
||||
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
|
||||
|
||||
# Compress JavaScripts and CSS.
|
||||
config.assets.js_compressor = :uglifier
|
||||
# config.assets.css_compressor = :sass
|
||||
|
||||
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
||||
config.assets.compile = true # false
|
||||
|
||||
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
|
||||
# yet still be able to expire them through the digest params.
|
||||
config.assets.digest = true
|
||||
|
||||
# `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
|
||||
|
||||
# Specifies the header that your server uses for sending files.
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
|
||||
|
||||
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
||||
config.force_ssl = true
|
||||
|
||||
# Use the lowest log level to ensure availability of diagnostic information
|
||||
# when problems arise.
|
||||
config.log_level = :debug
|
||||
|
||||
# Prepend all log lines with the following tags.
|
||||
# config.log_tags = [ :subdomain, :uuid ]
|
||||
|
||||
# Use a different logger for distributed setups.
|
||||
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
||||
|
||||
# Use a different cache store in production.
|
||||
# config.cache_store = :mem_cache_store
|
||||
config.cache_store = :dalli_store
|
||||
|
||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
||||
# config.action_controller.asset_host = 'http://assets.example.com'
|
||||
|
||||
# Ignore bad email addresses and do not raise email delivery errors.
|
||||
# Set this to true and configure the email server for immediate delivery to raise delivery errors.
|
||||
config.action_mailer.raise_delivery_errors = true
|
||||
|
||||
config.action_mailer.delivery_method = :smtp
|
||||
config.action_mailer.default_url_options = {
|
||||
host: ENV["MAIL_LINK_HOST"],
|
||||
protocol: (ENV["MAIL_LINK_PROTO"] || "https")
|
||||
}
|
||||
|
||||
# Retrieve SMTP configuration from environment variables
|
||||
# starting with `SMTP_`
|
||||
smtp_env = Hash[ENV.map do |k,v|
|
||||
if /^SMTP_(.*)$/ === k
|
||||
[$1.downcase.to_sym, YAML.load(v)]
|
||||
end
|
||||
end.compact]
|
||||
|
||||
if smtp_env.present?
|
||||
config.action_mailer.smtp_settings = smtp_env
|
||||
end
|
||||
|
||||
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
||||
# the I18n.default_locale when a translation cannot be found).
|
||||
config.i18n.fallbacks = true
|
||||
|
||||
# Send deprecation notices to registered listeners.
|
||||
config.active_support.deprecation = :notify
|
||||
|
||||
# Use default logging formatter so that PID and timestamp are not suppressed.
|
||||
config.log_formatter = ::Logger::Formatter.new
|
||||
|
||||
# Do not dump schema after migrations.
|
||||
config.active_record.dump_schema_after_migration = false
|
||||
end
|
||||
@ -4,5 +4,8 @@ development:
|
||||
test:
|
||||
secret_key_base: fde628fa241d74a55d7b0fc8fe1b650091e296d6a4d1e51beba3bfa2ed5c143801c28aaadf318aaefc4423bca781f9715441298052b4f704a8c44f97968feb00
|
||||
|
||||
staging:
|
||||
secret_key_base: <%= ENV['SECRET_TOKEN'] %>
|
||||
|
||||
production:
|
||||
secret_key_base: <%= ENV['SECRET_TOKEN'] %>
|
||||
|
||||
@ -1,18 +1,20 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe OffersController, type: :controller do
|
||||
let (:test_organization) { Fabricate(:organization) }
|
||||
let (:member) { Fabricate(:member, organization: test_organization) }
|
||||
let (:another_member) { Fabricate(:member, organization: test_organization) }
|
||||
let (:yet_another_member) { Fabricate(:member) }
|
||||
let (:test_category) { Fabricate(:category) }
|
||||
let! (:offer) do
|
||||
let(:test_organization) { Fabricate(:organization) }
|
||||
let(:member) { Fabricate(:member, organization: test_organization) }
|
||||
let(:another_member) { Fabricate(:member, organization: test_organization) }
|
||||
let(:yet_another_member) { Fabricate(:member) }
|
||||
let(:test_category) { Fabricate(:category) }
|
||||
let!(:offer) do
|
||||
Fabricate(:offer,
|
||||
user: member.user,
|
||||
organization: test_organization,
|
||||
category: test_category)
|
||||
end
|
||||
|
||||
include_context "stub browser locale"
|
||||
|
||||
before { set_browser_locale("ca") }
|
||||
|
||||
describe "GET #index" do
|
||||
@ -60,16 +62,22 @@ describe OffersController, type: :controller do
|
||||
describe "GET #show" do
|
||||
context "with valid params" do
|
||||
context "with a logged user" do
|
||||
it "assigns the requested offer to @offer" do
|
||||
login(another_member.user)
|
||||
before { login(another_member.user) }
|
||||
|
||||
get "show", id: offer.id
|
||||
it "assigns the requested offer to @offer" do
|
||||
get :show, id: offer.id
|
||||
expect(assigns(:offer)).to eq(offer)
|
||||
end
|
||||
|
||||
it 'assigns the account destination of the transfer' do
|
||||
get :show, id: offer.id
|
||||
expect(assigns(:destination_account)).to eq(member.account)
|
||||
end
|
||||
end
|
||||
|
||||
context "without a logged in user" do
|
||||
it "assigns the requested offer to @offer" do
|
||||
get "show", id: offer.id
|
||||
get :show, id: offer.id
|
||||
expect(assigns(:offer)).to eq(offer)
|
||||
end
|
||||
end
|
||||
|
||||
2
spec/fabricators/account_fabricator.rb
Normal file
2
spec/fabricators/account_fabricator.rb
Normal file
@ -0,0 +1,2 @@
|
||||
Fabricator(:account) do
|
||||
end
|
||||
75
spec/views/offers/show.html.erb_spec.rb
Normal file
75
spec/views/offers/show.html.erb_spec.rb
Normal file
@ -0,0 +1,75 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe 'offers/show' do
|
||||
let(:organization) { Fabricate(:organization) }
|
||||
let(:member) { Fabricate(:member, organization: organization) }
|
||||
let(:offer) { Fabricate(:offer, user: member.user, organization: organization) }
|
||||
let(:destination_account) { Fabricate(:account) }
|
||||
|
||||
before do
|
||||
allow(view).to receive(:admin?).and_return(false)
|
||||
allow(view).to receive(:current_organization) { organization }
|
||||
|
||||
allow(offer).to receive(:member).and_return(member)
|
||||
end
|
||||
|
||||
context 'when there is logged in' do
|
||||
let(:logged_user) { Fabricate(:user) }
|
||||
|
||||
before do
|
||||
Fabricate(
|
||||
:member,
|
||||
organization: organization,
|
||||
user: logged_user
|
||||
)
|
||||
|
||||
allow(view).to receive(:current_user).and_return(logged_user)
|
||||
end
|
||||
|
||||
it 'renders a link to the transfer page' do
|
||||
assign :offer, offer
|
||||
assign :destination_account, destination_account
|
||||
render template: 'offers/show'
|
||||
|
||||
expect(rendered).to have_link(
|
||||
t('offers.show.give_time_for'),
|
||||
href: new_transfer_path(
|
||||
id: offer.user.id,
|
||||
offer: offer.id,
|
||||
destination_account_id: destination_account.id
|
||||
)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context 'where is a guest user' do
|
||||
before do
|
||||
allow(view).to receive(:current_user).and_return(nil)
|
||||
end
|
||||
|
||||
it 'does not render a link to the transfer page' do
|
||||
assign :offer, offer
|
||||
assign :destination_account, destination_account
|
||||
render template: 'offers/show'
|
||||
|
||||
expect(rendered).not_to have_link(
|
||||
t('offers.show.give_time_for'),
|
||||
href: new_transfer_path(
|
||||
id: offer.user.id,
|
||||
offer: offer.id,
|
||||
destination_account_id: destination_account.id
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
it 'renders a link to the login page' do
|
||||
assign :offer, offer
|
||||
render template: 'offers/show'
|
||||
|
||||
expect(rendered).to have_link(
|
||||
t('layouts.application.login'),
|
||||
href: new_user_session_path
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user