Merge pull request #481 from abf/rosa-build:rails-4.2.1

Update rails to 4.2.1
This commit is contained in:
avokhmin 2015-06-18 23:09:34 +04:00
commit 7e3987bc91
35 changed files with 856 additions and 811 deletions

View File

@ -5,6 +5,7 @@ bundler_args: --without development
env:
- SPEC_GROUP=controllers
- SPEC_GROUP=platform_controllers
- SPEC_GROUP=api-slow
- SPEC_GROUP=api
- SPEC_GROUP=models
- SPEC_GROUP=others

View File

@ -1,10 +1,10 @@
source 'https://rubygems.org'
gem 'rails', '4.1.11'
gem 'rails'
gem 'activeadmin', github: 'activeadmin'
gem 'pg'
gem 'schema_plus', '~> 1.5'
gem 'schema_plus'
########
gem 'devise'
gem 'omniauth'
@ -50,7 +50,7 @@ gem 'sprockets'
gem 'will_paginate'
gem 'meta-tags', require: 'meta_tags'
gem 'haml-rails'
gem 'jquery-rails', '3.1.3'
gem 'jquery-rails'
gem 'jquery-migrate-rails'
gem 'ruby-haml-js'
gem 'slim'
@ -69,7 +69,7 @@ gem 'gemoji'
# AngularJS related stuff
gem 'underscore-rails'
gem 'angularjs-rails'
gem 'angularjs-rails', '~> 1.3.14'
gem 'ng-rails-csrf'
gem 'momentjs-rails'
gem 'angular-i18n'

View File

@ -10,7 +10,7 @@ GIT
GIT
remote: git://github.com/activeadmin/activeadmin.git
revision: 9c46b14ea0d9b3aaaa3d7520555c9959d06ce7f3
revision: 0ffc65a28847f46af1b707d43562eef1051b7960
specs:
activeadmin (1.0.0.pre1)
arbre (~> 1.0, >= 1.0.2)
@ -47,51 +47,60 @@ GEM
remote: https://rails-assets.org/
specs:
RedCloth (4.2.9)
actionmailer (4.1.11)
actionpack (= 4.1.11)
actionview (= 4.1.11)
actionmailer (4.2.2)
actionpack (= 4.2.2)
actionview (= 4.2.2)
activejob (= 4.2.2)
mail (~> 2.5, >= 2.5.4)
actionpack (4.1.11)
actionview (= 4.1.11)
activesupport (= 4.1.11)
rack (~> 1.5.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.2)
actionview (= 4.2.2)
activesupport (= 4.2.2)
rack (~> 1.6)
rack-test (~> 0.6.2)
actionview (4.1.11)
activesupport (= 4.1.11)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.1)
actionview (4.2.2)
activesupport (= 4.2.2)
builder (~> 3.1)
erubis (~> 2.7.0)
activemodel (4.1.11)
activesupport (= 4.1.11)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.1)
activejob (4.2.2)
activesupport (= 4.2.2)
globalid (>= 0.3.0)
activemodel (4.2.2)
activesupport (= 4.2.2)
builder (~> 3.1)
activerecord (4.1.11)
activemodel (= 4.1.11)
activesupport (= 4.1.11)
arel (~> 5.0.0)
activesupport (4.1.11)
i18n (~> 0.6, >= 0.6.9)
activerecord (4.2.2)
activemodel (= 4.2.2)
activesupport (= 4.2.2)
arel (~> 6.0)
activesupport (4.2.2)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.3.7)
airbrake (4.1.0)
addressable (2.3.8)
airbrake (4.2.1)
builder
multi_json
ancestry (2.1.0)
activerecord (>= 3.0.0)
angular-i18n (0.1.2)
angular-rails-templates (0.1.3)
angular-rails-templates (0.2.0)
railties (>= 3.1)
sprockets
sprockets (~> 2)
tilt
angular-ui-bootstrap-rails (0.12.0)
angular-ui-bootstrap-rails (0.13.0)
angularjs-rails (1.3.14)
arbre (1.0.3)
activesupport (>= 3.0.0)
arel (5.0.1.20140414130214)
attr_encrypted (1.3.3)
arel (6.0.0)
attr_encrypted (1.3.4)
encryptor (>= 1.3.0)
autoprefixer-rails (5.1.7)
autoprefixer-rails (5.2.0)
execjs
json
bcrypt (3.1.10)
@ -101,7 +110,7 @@ GEM
rack (>= 0.9.0)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
bootstrap-sass (3.3.3)
bootstrap-sass (3.3.4.1)
autoprefixer-rails (>= 5.0.0.1)
sass (>= 3.2.19)
bourbon (4.2.3)
@ -153,9 +162,9 @@ GEM
crack (0.4.2)
safe_yaml (~> 1.0.0)
creole (0.5.0)
daemons (1.1.9)
daemons (1.2.2)
debug_inspector (0.0.2)
devise (3.4.1)
devise (3.5.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
@ -179,7 +188,7 @@ GEM
railties (>= 3.0.0)
faraday (0.9.1)
multipart-post (>= 1.2, < 3)
ffi (1.9.6)
ffi (1.9.8)
font-awesome-rails (4.3.0.0)
railties (>= 3.2, < 5.0)
formtastic (3.1.3)
@ -201,7 +210,9 @@ GEM
diff-lcs (~> 1.1)
mime-types (~> 1.15)
posix-spawn (~> 0.3)
gli (2.13.0)
gli (2.13.1)
globalid (0.3.5)
activesupport (>= 4.1.0)
gollum-lib (3.0.0)
github-markup (~> 1.1.0)
gitlab-grit (~> 2.6.5)
@ -211,16 +222,16 @@ GEM
stringex (~> 2.5.1)
haml (4.0.6)
tilt
haml-rails (0.8.2)
haml-rails (0.9.0)
actionpack (>= 4.0.1)
activesupport (>= 4.0.1)
haml (>= 3.1, < 5.0)
haml (>= 4.0.6, < 5.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
has_scope (0.6.0)
actionpack (>= 3.2, < 5)
activesupport (>= 3.2, < 5)
hashie (3.4.0)
hashie (3.4.2)
highline (1.6.21)
hike (1.2.3)
hirb (0.7.3)
@ -229,6 +240,7 @@ GEM
haml (~> 4.0.0)
nokogiri (~> 1.6.0)
ruby_parser (~> 3.5)
htmlentities (4.3.3)
http-cookie (1.0.2)
domain_name (~> 0.5)
i18n (0.7.0)
@ -237,31 +249,36 @@ GEM
has_scope (~> 0.6.0.rc)
railties (>= 3.2, < 5)
responders
jbuilder (2.2.9)
its-it (1.1.1)
jbuilder (2.2.16)
activesupport (>= 3.0.0, < 5)
multi_json (~> 1.2)
jquery-migrate-rails (1.2.1)
jquery-rails (3.1.3)
railties (>= 3.0, < 5.0)
jquery-rails (4.0.4)
rails-dom-testing (~> 1.0)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.5)
railties (>= 3.2.16)
js-routes (1.0.0)
js-routes (1.0.1)
railties (>= 3.2)
sprockets-rails
json (1.8.3)
jwt (1.3.0)
jwt (1.5.0)
kaminari (0.16.3)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
key_struct (0.4.2)
libv8 (3.16.14.7)
localeapp (0.9.0)
localeapp (0.9.3)
gli
i18n
json
rack
rest-client
ya2yaml
loofah (2.0.2)
nokogiri (>= 1.5.9)
mail (2.6.3)
mime-types (>= 1.16, < 3)
mailcatcher (0.6.1)
@ -281,8 +298,11 @@ GEM
mime-types (1.25.1)
mini_portile (0.6.2)
minitest (5.7.0)
mock_redis (0.14.0)
momentjs-rails (2.9.0)
mock_redis (0.14.1)
modware (0.1.2)
its-it
key_struct (~> 0.4)
momentjs-rails (2.10.2)
railties (>= 3.1)
mono_logger (1.1.0)
multi_json (1.11.1)
@ -298,7 +318,7 @@ GEM
net-ssh-gateway (1.2.0)
net-ssh (>= 2.6.5)
netrc (0.10.3)
newrelic_rpm (3.10.0.279)
newrelic_rpm (3.12.0.288)
ng-rails-csrf (0.1.0)
ngmin-rails (0.4.0)
rails (>= 3.1)
@ -327,9 +347,7 @@ GEM
omniauth-google-oauth2 (0.2.6)
omniauth (> 1.0)
omniauth-oauth2 (~> 1.1)
omniauth-oauth2 (1.2.0)
faraday (>= 0.8, < 0.10)
multi_json (~> 1.3)
omniauth-oauth2 (1.3.0)
oauth2 (~> 1.0)
omniauth (~> 1.2)
orm_adapter (0.5.0)
@ -338,18 +356,18 @@ GEM
activesupport (>= 3.0.0)
cocaine (~> 0.5.3)
mime-types
pg (0.18.1)
pg (0.18.2)
polyamorous (1.2.0)
activerecord (>= 3.0)
posix-spawn (0.3.10)
puma (2.11.1)
posix-spawn (0.3.11)
puma (2.11.3)
rack (>= 1.1, < 2.0)
pundit (0.3.0)
pundit (1.0.1)
activesupport (>= 3.0.0)
pygments.rb (0.6.2)
pygments.rb (0.6.3)
posix-spawn (~> 0.3.6)
yajl-ruby (~> 1.2.0)
rack (1.5.4)
rack (1.6.2)
rack-contrib (1.2.0)
rack (>= 0.9.1)
rack-mini-profiler (0.9.3)
@ -362,24 +380,33 @@ GEM
rack (>= 1.0.0)
rack-utf8_sanitizer (1.3.0)
rack (~> 1.0)
rails (4.1.11)
actionmailer (= 4.1.11)
actionpack (= 4.1.11)
actionview (= 4.1.11)
activemodel (= 4.1.11)
activerecord (= 4.1.11)
activesupport (= 4.1.11)
rails (4.2.2)
actionmailer (= 4.2.2)
actionpack (= 4.2.2)
actionview (= 4.2.2)
activejob (= 4.2.2)
activemodel (= 4.2.2)
activerecord (= 4.2.2)
activesupport (= 4.2.2)
bundler (>= 1.3.0, < 2.0)
railties (= 4.1.11)
sprockets-rails (~> 2.0)
railties (= 4.2.2)
sprockets-rails
rails-assets-notifyjs (0.3.2)
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.6)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.2)
loofah (~> 2.0)
rails3-generators (1.0.0)
railties (>= 3.0.0)
rails3-jquery-autocomplete (1.0.15)
rails (>= 3.2)
railties (4.1.11)
actionpack (= 4.1.11)
activesupport (= 4.1.11)
railties (4.2.2)
actionpack (= 4.2.2)
activesupport (= 4.2.2)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (10.4.2)
@ -389,7 +416,7 @@ GEM
activesupport (>= 3.0)
i18n
polyamorous (~> 1.2)
rb-fsevent (0.9.4)
rb-fsevent (0.9.5)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
rdiscount (2.1.8)
@ -402,7 +429,7 @@ GEM
redis-activesupport (4.0.0)
activesupport (~> 4)
redis-store (~> 1.1.0)
redis-namespace (1.5.1)
redis-namespace (1.5.2)
redis (~> 3.0, >= 3.0.4)
redis-rack (1.5.0)
rack (~> 1.5)
@ -414,8 +441,8 @@ GEM
redis-store (1.1.4)
redis (>= 2.2)
ref (1.0.5)
responders (1.1.2)
railties (>= 3.2, < 4.2)
responders (2.1.0)
railties (>= 4.2.0, < 5)
resque (1.25.2)
mono_logger (~> 1.0)
multi_json (~> 1.0)
@ -427,7 +454,7 @@ GEM
redis (~> 3.0.4)
resque (~> 1.25.1)
rufus-scheduler (~> 2.0.24)
resque-status (0.4.3)
resque-status (0.5.0)
resque (~> 1.19)
resque_mailer (2.2.7)
actionmailer (>= 3.0)
@ -437,15 +464,15 @@ GEM
netrc (~> 0.7)
rouge (1.3.4)
rr (1.1.2)
rspec-core (3.2.1)
rspec-core (3.2.3)
rspec-support (~> 3.2.0)
rspec-expectations (3.2.0)
rspec-expectations (3.2.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.2.0)
rspec-mocks (3.2.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.2.0)
rspec-rails (3.2.1)
rspec-rails (3.2.2)
actionpack (>= 3.0, < 4.3)
activesupport (>= 3.0, < 4.3)
railties (>= 3.0, < 4.3)
@ -457,7 +484,7 @@ GEM
ruby-haml-js (0.0.5)
execjs
sprockets (>= 2.0.0)
ruby_parser (3.6.4)
ruby_parser (3.7.0)
sexp_processor (~> 4.1)
rufus-scheduler (2.0.24)
tzinfo (>= 0.3.22)
@ -476,11 +503,60 @@ GEM
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (~> 1.1)
schema_plus (1.8.7)
activerecord (>= 3.2, < 4.3)
schema_auto_foreign_keys (0.1.0)
schema_plus_foreign_keys (~> 0.1)
schema_plus_indexes (~> 0.2)
schema_monkey (2.1.0)
activerecord (~> 4.2)
its-it
modware (~> 0.1)
schema_plus (2.0.0)
activerecord (~> 4.2)
schema_auto_foreign_keys (~> 0.1)
schema_monkey (~> 2.1)
schema_plus_columns (~> 0.1)
schema_plus_core (~> 0.4)
schema_plus_db_default (~> 0.1)
schema_plus_default_expr (~> 0.1)
schema_plus_enums (~> 0.1)
schema_plus_foreign_keys (~> 0.1)
schema_plus_indexes (~> 0.1, >= 0.1.3)
schema_plus_pg_indexes (~> 0.1, >= 0.1.3)
schema_plus_tables (~> 0.1)
schema_plus_views (~> 0.1)
schema_plus_columns (0.1.0)
activerecord (~> 4.2)
schema_plus_indexes (~> 0.1)
schema_plus_core (0.5.0)
activerecord (~> 4.2)
schema_monkey (~> 2.1)
schema_plus_db_default (0.1.0)
activerecord (~> 4.2)
schema_plus_core (~> 0.2, >= 0.2.1)
schema_plus_default_expr (0.1.0)
activerecord (~> 4.2)
schema_plus_core (~> 0.2, >= 0.2.1)
schema_plus_enums (0.1.0)
activerecord (~> 4.2)
schema_plus_core (~> 0.2, >= 0.2.1)
schema_plus_foreign_keys (0.1.2)
activerecord (~> 4.2)
schema_plus_core (~> 0.5)
valuable
schema_plus_indexes (0.2.0)
activerecord (~> 4.2)
schema_plus_core (~> 0.1)
schema_plus_pg_indexes (0.1.4)
activerecord (~> 4.2)
schema_plus_indexes (~> 0.1, >= 0.1.3)
schema_plus_tables (0.1.0)
activerecord (~> 4.2)
schema_plus_core (~> 0.2)
schema_plus_views (0.2.0)
activerecord (~> 4.2)
schema_plus_core (~> 0.1)
scrivener (0.0.3)
sexp_processor (4.4.5)
sexp_processor (4.6.0)
shotgun (0.9.1)
rack (>= 1.0)
shoulda (3.5.0)
@ -492,10 +568,10 @@ GEM
simple_form (3.1.0.rc2)
actionpack (~> 4.0)
activemodel (~> 4.0)
sinatra (1.4.5)
sinatra (1.4.6)
rack (~> 1.4)
rack-protection (~> 1.4)
tilt (~> 1.3, >= 1.3.4)
tilt (>= 1.3, < 3)
sitemap_generator (5.0.5)
builder
skinny (0.2.3)
@ -503,7 +579,7 @@ GEM
thin (~> 1.5.0)
skype (0.2.8)
tmp_cache
slim (3.0.2)
slim (3.0.6)
temple (~> 0.7.3)
tilt (>= 1.3.3, < 2.1)
soundmanager-rails (1.0.1)
@ -528,7 +604,7 @@ GEM
temple (0.7.5)
test_after_commit (0.4.1)
activerecord (>= 3.2)
therubyracer (0.12.1)
therubyracer (0.12.2)
libv8 (~> 3.16.14.0)
ref
thin (1.5.1)
@ -541,9 +617,9 @@ GEM
time_diff (0.3.0)
activesupport
i18n
timecop (0.7.3)
timecop (0.7.4)
tmp_cache (0.1.1)
twitter-text (1.11.0)
twitter-text (1.12.0)
unf (~> 0.1.0)
tzinfo (1.2.2)
thread_safe (~> 0.1)
@ -553,20 +629,22 @@ GEM
underscore-rails (1.8.2)
unf (0.1.4)
unf_ext
unf_ext (0.0.6)
unf_ext (0.0.7.1)
valuable (0.9.9)
vegas (0.1.11)
rack (>= 1.0.0)
warden (1.2.3)
rack (>= 1.0)
webmock (1.20.4)
webmock (1.21.0)
addressable (>= 2.3.6)
crack (>= 0.3.2)
whenever (0.9.4)
chronic (>= 0.6.3)
wikicloth (0.8.2)
wikicloth (0.8.3)
builder
expression_parser
htmlentities
nokogiri
twitter-text
will_paginate (3.0.7)
ya2yaml (0.31)
@ -585,7 +663,7 @@ DEPENDENCIES
angular-i18n
angular-rails-templates
angular-ui-bootstrap-rails
angularjs-rails
angularjs-rails (~> 1.3.14)
attr_encrypted
better_errors
binding_of_caller
@ -614,7 +692,7 @@ DEPENDENCIES
hirb
jbuilder
jquery-migrate-rails
jquery-rails (= 3.1.3)
jquery-rails
js-routes
localeapp
mailcatcher
@ -639,7 +717,7 @@ DEPENDENCIES
rack-mini-profiler
rack-throttle (~> 0.3.0)
rack-utf8_sanitizer
rails (= 4.1.11)
rails
rails-assets-notifyjs!
rails3-generators
rails3-jquery-autocomplete
@ -658,7 +736,7 @@ DEPENDENCIES
russian
rvm-capistrano
sass-rails
schema_plus (~> 1.5)
schema_plus
shotgun
shoulda
shoulda-matchers

View File

@ -41,13 +41,13 @@ ActiveAdmin.register User do
f.actions
end
action_item only: %i(show edit) do
action_item(:reset_token, only: :show) do
link_to 'Reset token', reset_token_admin_user_path(resource),
'data-method' => :put,
data: { confirm: 'Are you sure you want to reset token?' }
end
action_item only: :show do
action_item(:login_as, only: :show) do
link_to 'Login as user', login_as_admin_user_path(resource)
end

View File

@ -3,8 +3,8 @@ class AdvisoriesController < ApplicationController
skip_before_action :authenticate_user! if APP_CONFIG['anonymous_access']
def index
authorize :advisories
@advisories = Advisory.includes(:platforms).search(params[:q]).uniq
authorize :advisory
@advisories = Advisory.includes(:platforms, :projects).search(params[:q]).uniq
@advisories_count = @advisories.count
@advisories = @advisories.paginate(page: current_page, per_page: Advisory.per_page)
respond_to do |format|
@ -20,7 +20,7 @@ class AdvisoriesController < ApplicationController
end
def search
authorize :advisories
authorize :advisory
@advisory = Advisory.by_update_type(params[:bl_type]).search_by_id(params[:query]).first
if @advisory.nil?
render nothing: true, status: 404

View File

@ -1,6 +1,4 @@
class Projects::CollaboratorsController < Projects::BaseController
respond_to :html, :json
before_action :authenticate_user!
before_action :authorize_collaborators
@ -9,7 +7,6 @@ class Projects::CollaboratorsController < Projects::BaseController
def index
@collaborators = Collaborator.find_by_project(@project)
respond_with @collaborators
end
def find
@ -20,7 +17,6 @@ class Projects::CollaboratorsController < Projects::BaseController
groups = groups.search(params[:term]).first(5)
end
@collaborators = (users | groups).map{|act| Collaborator.new(actor: act, project: @project)}
respond_with @collaborators
end
def create

View File

@ -23,7 +23,7 @@ class Projects::Git::TreesController < Projects::Git::BaseController
format, @treeish = params[:format], params[:treeish]
raise Grit::NoSuchPathError unless @treeish =~ /^#{@project.name}-/ &&
@treeish !~ /[\s]+/ &&
format =~ /^(zip|tar\.gz)$/
format =~ /\A(zip|tar\.gz)\z/
@treeish.gsub!(/^#{@project.name}-/, '')
sha1 = @project.build_scripts.by_active.by_treeish(@treeish).first.try(:sha1)
unless sha1

View File

@ -65,7 +65,7 @@ module MarkdownHelper
insert_piece($1)
end
sanitize text.html_safe, attributes: ActionView::Base.sanitized_allowed_attributes + %w(id class)
sanitize text.html_safe, attributes: (ActionView::Base.sanitized_allowed_attributes || []) + %w(id class)
end
private

View File

@ -8,7 +8,7 @@ module UsersHelper
if subject.try('avatar?')
subject.avatar.url(size)
elsif subject.kind_of? Group
image_path('ava-big.png')
'ava-big.png'
else
gravatar_url(subject.email, User::AVATAR_SIZES[size])
end

View File

@ -24,7 +24,6 @@ class BuildList::Package < ActiveRecord::Base
scope :like_name, ->(name) { where("#{table_name}.name ILIKE ?", "%#{name}%") if name.present? }
before_create :set_epoch
before_create :normalize_dependent_packages
def assignee
project.maintainer
@ -47,12 +46,14 @@ class BuildList::Package < ActiveRecord::Base
end
end
protected
def normalize_dependent_packages
self.dependent_packages = dependent_packages.to_s.split(/\s/).select(&:present?)
# Public: Set dependent_packages.
def dependent_packages=(v)
v = v.to_s.split(/\s/).select(&:present?) if v.is_a?(String)
write_attribute :dependent_packages, v
end
protected
def set_epoch
self.epoch = nil if epoch.blank? || epoch == 0
end

View File

@ -12,7 +12,7 @@ nav.navbar.navbar-inverse.top_menu role = "navigation"
#top-menu-navbar-collapse.collapse.navbar-collapse
ul.nav.navbar-nav
- (collection = t 'top_menu').each do |base, title|
- if policy(base).index?
- if policy(base.to_s.singularize.to_sym).index?
li class=top_menu_class(base)
a href=send("#{base}_path")
i.fa.hidden-sm class=top_menu_icon(base)

View File

@ -61,6 +61,9 @@ module Rosa
# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'
# Do not swallow errors in after_commit/after_rollback callbacks.
config.active_record.raise_in_transactional_callbacks = true
config.log_redis = false
config.angular_templates.ignore_prefix = 'angularjs/templates/'

View File

@ -1,5 +1,5 @@
# Load the rails application
# Load the Rails application.
require File.expand_path('../application', __FILE__)
# Initialize the rails application
Rosa::Application.initialize!
# Initialize the Rails application.
Rails.application.initialize!

View File

@ -14,21 +14,21 @@ class DisableAssetsLogger
end
end
Rosa::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
Rails.application.configure do
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the webserver when you make code changes.
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
config.cache_store = :redis_store, 'redis://localhost:6379/0/cache', { expires_in: 10.minutes }
# Do not eager load code on boot.
config.eager_load = false
# Show full error reports and disable caching
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
#config.action_mailer.raise_delivery_errors = true
#config.action_mailer.perform_deliveries = true
@ -36,24 +36,32 @@ Rosa::Application.configure do
config.action_mailer.smtp_settings = { host: "localhost", port: 1025 }
config.action_mailer.default_url_options = { host: 'localhost:3000' }
# Print deprecation notices to the Rails logger
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
#config.active_support.deprecation = false
# Only use best-standards-support built into browsers
config.action_dispatch.best_standards_support = :builtin
# Raise an error on page load if there are pending migrations
# Raise an error on page load if there are pending migrations.
config.active_record.migration_error = :page_load
# Do not compress assets
# Debug mode disables concatenation and preprocessing of assets.
config.assets.compress = false
# Expands the lines which load the assets
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = true
# Adds additional error checking when serving assets at runtime.
# Checks for improperly declared sprockets dependencies.
# Raises helpful error messages.
config.assets.raise_runtime_errors = true
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
config.middleware.insert_before Rails::Rack::Logger, DisableAssetsLogger
config.eager_load = false
config.log_redis = true
end

View File

@ -1,77 +1,86 @@
Rosa::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# The production environment is meant for finished, "live" apps.
# Code is not reloaded between requests
# Code is not reloaded between requests.
config.cache_classes = true
# Full error reports are disabled and caching is turned on
# 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
# Specifies the header that your server uses for sending files
# config.action_dispatch.x_sendfile_header = "X-Sendfile"
# 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
# For nginx:
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
# Disable Rails's static asset server (Apache or nginx will already do this).
config.serve_static_files = false
# If you have no front-end server that supports something like X-Sendfile,
# just comment this out and Rails will serve the files
# Compress JavaScripts and CSS.
config.assets.js_compressor = :uglifier
config.assets.css_compressor = :sass
# See everything in the log (default is :info)
# config.log_level = :debug
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
# Use a different logger for distributed setups
# config.logger = SyslogLogger.new
# Generate digests for assets URLs.
config.assets.digest = true
# Use a different cache store in production
# `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
# Set to :debug to see everything in the log.
config.log_level = :info
# 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 = :redis_store, 'redis://localhost:6379/0/cache', { expires_in: 10.minutes }
# Disable Rails's static asset server
# In production, Apache or nginx will already do this
config.serve_static_assets = false
# Enable serving of images, stylesheets, and javascripts from an asset server
# 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 = false
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
config.action_mailer.default_url_options = { host: 'abf.io' }
config.delivery_method = :sendmail
# Enable threaded mode
# config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
# the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners
# Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify
# Force SSL
# config.force_ssl = true
# Disable automatic flushing of the log to improve performance.
# config.autoflush_log = false
# Compress JavaScripts and CSS
config.assets.compress = true
# Use default logging formatter so that PID and timestamp are not suppressed.
config.log_formatter = ::Logger::Formatter.new
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
config.assets.precompile +=
%w(login.css login.js reg_session.css tour.css tour.js gollum/editor/langs/*.js moment/ru.js
codemirror_editor.js codemirror_editor.css new_application.css new_application.js angular-locale_ru-ru.js)
# Compress JavaScripts and CSS.
config.assets.js_compressor = :uglifier
config.assets.css_compressor = :sass
config.eager_load = true
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
config.assets.logger = Logger.new $stdout
end

View File

@ -29,7 +29,7 @@ Rosa::Application.configure do
# Disable Rails's static asset server
# In production, Apache or nginx will already do this
config.serve_static_assets = false
config.serve_static_files = false
# Enable serving of images, stylesheets, and javascripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"

View File

@ -1,21 +1,30 @@
Rosa::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Show full error reports and disable caching
# Do not eager load code on boot. This avoids loading your whole application
# just for the purpose of running a single test. If you are using a tool that
# preloads Rails for running tests, you may have to set it to true.
config.eager_load = false
# Configure static asset server for tests with Cache-Control for performance.
config.serve_static_files = true
config.static_cache_control = 'public, max-age=3600'
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Raise exceptions instead of rendering exception templates
# Raise exceptions instead of rendering exception templates.
config.action_dispatch.show_exceptions = false
# Disable request forgery protection in test environment
config.action_controller.allow_forgery_protection = false
# Disable request forgery protection in test environment.
config.action_controller.allow_forgery_protection = false
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
@ -23,22 +32,15 @@ Rosa::Application.configure do
config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { host: 'localhost:3000' }
# Use SQL instead of Active Record's schema dumper when creating the test database.
# This is necessary if your schema can't be completely dumped by the schema dumper,
# like if you have constraints or database-specific column types
# config.active_record.schema_format = :sql
# Randomize the order test cases are executed.
config.active_support.test_order = :random
# Print deprecation notices to the stderr
# Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr
# Configure static asset server for tests with Cache-Control for performance
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
# Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets
config.assets.allow_debugging = true
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
config.cache_store = :memory_store, { size: 64.megabytes }
config.eager_load = false
config.log_redis = true
config.log_redis = true
end

View File

@ -0,0 +1,12 @@
# Be sure to restart your server when you modify this file.
# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
Rails.application.config.assets.precompile += %w(
login.css login.js reg_session.css tour.css tour.js gollum/editor/langs/*.js
moment/ru.js codemirror_editor.js codemirror_editor.css new_application.css
new_application.js angular-locale_ru-ru.js
)

View File

@ -1,3 +1,3 @@
# Be sure to restart your server when you modify this file.
Rails.application.config.action_dispatch.cookies_serializer = :hybrid
Rails.application.config.action_dispatch.cookies_serializer = :json

View File

@ -1,10 +1,16 @@
# Be sure to restart your server when you modify this file.
# Add new inflection rules using the following format
# (all these examples are active by default):
# ActiveSupport::Inflector.inflections do |inflect|
# Add new inflection rules using the following format. Inflections
# are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.plural /^(ox)$/i, '\1en'
# inflect.singular /^(ox)en/i, '\1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
# end
# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.acronym 'RESTful'
# end

View File

@ -2,7 +2,6 @@
# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf
# Mime::Type.register_alias "text/html", :iphone
Mime::Type.register "text/plain", 'diff'
Mime::Type.register "text/plain", 'patch'

View File

@ -1,3 +1,4 @@
SchemaPlus.setup do |config|
config.foreign_keys.auto_create = false
end
SchemaPlus::ForeignKeys.setup do |config|
config.auto_create = false
# config.auto_index = true # default for schema_auto_foreign_keys
end

View File

@ -1,8 +1,3 @@
# Be sure to restart your server when you modify this file.
Rosa::Application.config.session_store :cookie_store, key: '_rosa_session'
# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with "rails generate session_migration")
# Rosa::Application.config.session_store :active_record_store
Rails.application.config.session_store :cookie_store, key: '_rosa_session'

View File

@ -1,4 +1,4 @@
Rosa::Application.routes.draw do
Rails.application.routes.draw do
# ActiveAdmin routes.
ActiveAdmin.routes(self)
@ -300,7 +300,7 @@ Rosa::Application.routes.draw do
get :mass_import
end
end
scope '*name_with_owner', constraints: { name_with_owner: Project::OWNER_AND_NAME_REGEXP } do # project
scope '*name_with_owner', name_with_owner: Project::OWNER_AND_NAME_REGEXP do # project
scope as: 'project' do
resources :wiki do
collection do

View File

@ -17,107 +17,88 @@ ActiveRecord::Schema.define(version: 20150601043133) do
enable_extension "plpgsql"
enable_extension "hstore"
create_table "activity_feeds", force: true do |t|
t.integer "user_id", null: false
create_table "activity_feeds", force: :cascade do |t|
t.integer "user_id", null: false, index: {name: "index_activity_feeds_on_user_id_and_kind", with: ["kind"]}
t.string "kind"
t.text "data"
t.datetime "created_at"
t.datetime "updated_at"
t.string "project_owner"
t.string "project_name"
t.integer "creator_id"
t.index ["creator_id"], :name => "index_activity_feeds_on_creator_id"
t.index ["project_name"], :name => "index_activity_feeds_on_project_name"
t.index ["project_owner"], :name => "index_activity_feeds_on_project_owner"
t.index ["user_id", "kind"], :name => "index_activity_feeds_on_user_id_and_kind"
t.string "project_owner", index: {name: "index_activity_feeds_on_project_owner"}
t.string "project_name", index: {name: "index_activity_feeds_on_project_name"}
t.integer "creator_id", index: {name: "index_activity_feeds_on_creator_id"}
end
create_table "advisories", force: true do |t|
t.string "advisory_id"
create_table "advisories", force: :cascade do |t|
t.string "advisory_id", index: {name: "index_advisories_on_advisory_id", unique: true}
t.text "description", default: ""
t.text "references", default: ""
t.text "update_type", default: ""
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["advisory_id"], :name => "index_advisories_on_advisory_id", :unique => true
t.index ["update_type"], :name => "index_advisories_on_update_type"
t.text "update_type", default: "", index: {name: "index_advisories_on_update_type"}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "advisories_platforms", id: false, force: true do |t|
t.integer "advisory_id"
t.integer "platform_id"
t.index ["advisory_id", "platform_id"], :name => "advisory_platform_index", :unique => true
t.index ["advisory_id"], :name => "index_advisories_platforms_on_advisory_id"
t.index ["platform_id"], :name => "index_advisories_platforms_on_platform_id"
create_table "advisories_platforms", id: false, force: :cascade do |t|
t.integer "advisory_id", index: {name: "index_advisories_platforms_on_advisory_id"}
t.integer "platform_id", index: {name: "index_advisories_platforms_on_platform_id"}
end
add_index "advisories_platforms", ["advisory_id", "platform_id"], name: "advisory_platform_index", unique: true
create_table "advisories_projects", id: false, force: true do |t|
t.integer "advisory_id"
t.integer "project_id"
t.index ["advisory_id", "project_id"], :name => "advisory_project_index", :unique => true
t.index ["advisory_id"], :name => "index_advisories_projects_on_advisory_id"
t.index ["project_id"], :name => "index_advisories_projects_on_project_id"
create_table "advisories_projects", id: false, force: :cascade do |t|
t.integer "advisory_id", index: {name: "index_advisories_projects_on_advisory_id"}
t.integer "project_id", index: {name: "index_advisories_projects_on_project_id"}
end
add_index "advisories_projects", ["advisory_id", "project_id"], name: "advisory_project_index", unique: true
create_table "arches", force: true do |t|
t.string "name", null: false
create_table "arches", force: :cascade do |t|
t.string "name", null: false, index: {name: "index_arches_on_name", unique: true}
t.datetime "created_at"
t.datetime "updated_at"
t.index ["name"], :name => "index_arches_on_name", :unique => true
end
create_table "authentications", force: true do |t|
t.integer "user_id"
t.string "provider"
create_table "authentications", force: :cascade do |t|
t.integer "user_id", index: {name: "index_authentications_on_user_id"}
t.string "provider", index: {name: "index_authentications_on_provider_and_uid", with: ["uid"], unique: true}
t.string "uid"
t.datetime "created_at"
t.datetime "updated_at"
t.index ["provider", "uid"], :name => "index_authentications_on_provider_and_uid", :unique => true
t.index ["user_id"], :name => "index_authentications_on_user_id"
end
create_table "build_list_items", force: true do |t|
create_table "build_list_items", force: :cascade do |t|
t.string "name"
t.integer "level"
t.integer "status"
t.integer "build_list_id"
t.integer "build_list_id", index: {name: "index_build_list_items_on_build_list_id"}
t.datetime "created_at"
t.datetime "updated_at"
t.string "version"
t.index ["build_list_id"], :name => "index_build_list_items_on_build_list_id"
end
create_table "build_list_packages", force: true do |t|
t.integer "build_list_id"
t.integer "project_id"
t.integer "platform_id"
create_table "build_list_packages", force: :cascade do |t|
t.integer "build_list_id", index: {name: "index_build_list_packages_on_build_list_id"}
t.integer "project_id", index: {name: "index_build_list_packages_on_project_id"}
t.integer "platform_id", index: {name: "index_build_list_packages_on_platform_id"}
t.string "fullname"
t.string "name"
t.string "name", index: {name: "index_build_list_packages_on_name_and_project_id", with: ["project_id"]}
t.string "version"
t.string "release"
t.string "package_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "actual", default: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "actual", default: false, index: {name: "index_build_list_packages_on_actual_and_platform_id", with: ["platform_id"]}
t.string "sha1"
t.integer "epoch"
t.text "dependent_packages"
t.index :name => "build_list_packages_ordering", :expression => "lower((name)::text), length((name)::text)"
t.index ["actual", "platform_id"], :name => "index_build_list_packages_on_actual_and_platform_id"
t.index ["build_list_id"], :name => "index_build_list_packages_on_build_list_id"
t.index ["name", "project_id"], :name => "index_build_list_packages_on_name_and_project_id"
t.index ["platform_id"], :name => "index_build_list_packages_on_platform_id"
t.index ["project_id"], :name => "index_build_list_packages_on_project_id"
t.index name: "build_list_packages_ordering", expression: "lower((name)::text), length((name)::text)"
end
create_table "build_lists", force: true do |t|
create_table "build_lists", force: :cascade do |t|
t.integer "status"
t.string "project_version"
t.integer "project_id"
t.integer "arch_id"
t.integer "project_id", index: {name: "index_build_lists_on_project_id"}
t.integer "arch_id", index: {name: "index_build_lists_on_arch_id"}
t.datetime "notified_at"
t.datetime "created_at"
t.datetime "updated_at"
t.datetime "updated_at", index: {name: "index_build_lists_on_updated_at", order: {"updated_at"=>:desc}}
t.boolean "is_circle", default: false
t.text "additional_repos"
t.string "name"
@ -125,14 +106,14 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.integer "build_for_platform_id"
t.integer "save_to_platform_id"
t.text "include_repos"
t.integer "user_id"
t.integer "user_id", index: {name: "index_build_lists_on_user_id"}
t.string "package_version"
t.string "commit_hash"
t.integer "priority", default: 0, null: false
t.datetime "started_at"
t.integer "duration"
t.integer "advisory_id"
t.integer "mass_build_id"
t.integer "advisory_id", index: {name: "index_build_lists_on_advisory_id"}
t.integer "mass_build_id", index: {name: "index_build_lists_on_mass_build_id_and_status", with: ["status"]}
t.integer "save_to_repository_id"
t.text "results"
t.boolean "new_core", default: true
@ -151,17 +132,11 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.boolean "use_cached_chroot", default: false, null: false
t.boolean "use_extra_tests", default: true, null: false
t.boolean "save_buildroot", default: false, null: false
t.index ["advisory_id"], :name => "index_build_lists_on_advisory_id"
t.index ["arch_id"], :name => "index_build_lists_on_arch_id"
t.index ["mass_build_id", "status"], :name => "index_build_lists_on_mass_build_id_and_status"
t.index ["project_id", "save_to_repository_id", "build_for_platform_id", "arch_id"], :name => "maintainer_search_index"
t.index ["project_id"], :name => "index_build_lists_on_project_id"
t.index ["updated_at"], :name => "index_build_lists_on_updated_at", :order => {"updated_at" => :desc}
t.index ["user_id"], :name => "index_build_lists_on_user_id"
end
add_index "build_lists", ["project_id", "save_to_repository_id", "build_for_platform_id", "arch_id"], name: "maintainer_search_index"
create_table "projects", force: true do |t|
t.string "name"
create_table "projects", force: :cascade do |t|
t.string "name", index: {name: "index_projects_on_name_and_owner_id_and_owner_type", with: ["owner_id", "owner_type"], unique: true, case_sensitive: false}
t.datetime "created_at"
t.datetime "updated_at"
t.integer "owner_id"
@ -179,47 +154,38 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.boolean "is_package", default: true, null: false
t.integer "maintainer_id"
t.boolean "publish_i686_into_x86_64", default: false
t.string "owner_uname", null: false
t.string "owner_uname", null: false
t.boolean "architecture_dependent", default: false, null: false
t.integer "autostart_status"
t.integer "alias_from_id"
t.index ["alias_from_id"], :name => "index_projects_on_alias_from_id"
t.index ["name", "owner_id", "owner_type"], :name => "index_projects_on_name_and_owner_id_and_owner_type", :unique => true, :case_sensitive => false
t.integer "alias_from_id", index: {name: "index_projects_on_alias_from_id"}
end
create_table "build_scripts", force: true do |t|
t.integer "project_id", null: false
create_table "build_scripts", force: :cascade do |t|
t.integer "project_id", null: false, index: {name: "fk__build_scripts_project_id"}, foreign_key: {references: "projects", name: "fk_build_scripts_project_id", on_update: :no_action, on_delete: :no_action}
t.string "treeish", null: false
t.string "commit"
t.string "sha1"
t.string "status"
t.datetime "created_at"
t.datetime "updated_at"
t.index ["project_id", "treeish"], :name => "index_build_scripts_on_project_id_and_treeish", :unique => true
t.index ["project_id"], :name => "fk__build_scripts_project_id"
t.foreign_key ["project_id"], "projects", ["id"], :on_update => :no_action, :on_delete => :no_action, :name => "fk_build_scripts_project_id"
end
add_index "build_scripts", ["project_id", "treeish"], name: "index_build_scripts_on_project_id_and_treeish", unique: true
create_table "comments", force: true do |t|
t.string "commentable_type"
create_table "comments", force: :cascade do |t|
t.string "commentable_type", index: {name: "index_comments_on_commentable_type"}
t.integer "user_id"
t.text "body"
t.datetime "created_at"
t.datetime "updated_at"
t.decimal "commentable_id", precision: 50, scale: 0
t.decimal "commentable_id", precision: 50, index: {name: "index_comments_on_commentable_id"}
t.integer "project_id"
t.text "data"
t.boolean "automatic", default: false
t.decimal "created_from_commit_hash", precision: 50, scale: 0
t.integer "created_from_issue_id"
t.index ["automatic"], :name => "index_comments_on_automatic"
t.index ["commentable_id"], :name => "index_comments_on_commentable_id"
t.index ["commentable_type"], :name => "index_comments_on_commentable_type"
t.index ["created_from_commit_hash"], :name => "index_comments_on_created_from_commit_hash"
t.index ["created_from_issue_id"], :name => "index_comments_on_created_from_issue_id"
t.boolean "automatic", default: false, index: {name: "index_comments_on_automatic"}
t.decimal "created_from_commit_hash", precision: 50, index: {name: "index_comments_on_created_from_commit_hash"}
t.integer "created_from_issue_id", index: {name: "index_comments_on_created_from_issue_id"}
end
create_table "event_logs", force: true do |t|
create_table "event_logs", force: :cascade do |t|
t.integer "user_id"
t.string "user_name"
t.integer "eventable_id"
@ -235,16 +201,16 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.datetime "updated_at"
end
create_table "flash_notifies", force: true do |t|
t.text "body_ru", null: false
t.text "body_en", null: false
t.string "status", null: false
create_table "flash_notifies", force: :cascade do |t|
t.text "body_ru", null: false
t.text "body_en", null: false
t.string "status", null: false
t.boolean "published", default: true, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "groups", force: true do |t|
create_table "groups", force: :cascade do |t|
t.integer "owner_id"
t.datetime "created_at"
t.datetime "updated_at"
@ -258,7 +224,7 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.string "default_branch"
end
create_table "hooks", force: true do |t|
create_table "hooks", force: :cascade do |t|
t.text "data"
t.integer "project_id"
t.string "name"
@ -266,65 +232,59 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.datetime "updated_at", null: false
end
create_table "issues", force: true do |t|
create_table "issues", force: :cascade do |t|
t.integer "serial_id"
t.integer "project_id"
t.integer "project_id", index: {name: "index_issues_on_project_id_and_serial_id", with: ["serial_id"], unique: true}
t.integer "assignee_id"
t.string "title"
t.text "body"
t.string "status", default: "open"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
t.integer "user_id", index: {name: "index_issues_on_user_id"}
t.datetime "closed_at"
t.integer "closed_by"
t.index ["project_id", "serial_id"], :name => "index_issues_on_project_id_and_serial_id", :unique => true
t.index ["user_id"], :name => "index_issues_on_user_id"
end
create_table "key_pairs", force: true do |t|
create_table "key_pairs", force: :cascade do |t|
t.text "public", null: false
t.text "encrypted_secret", null: false
t.string "key_id", null: false
t.integer "user_id", null: false
t.integer "repository_id", null: false
t.integer "repository_id", null: false, index: {name: "index_key_pairs_on_repository_id", unique: true}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["repository_id"], :name => "index_key_pairs_on_repository_id", :unique => true
end
create_table "key_pairs_backup", force: true do |t|
t.integer "repository_id", null: false
create_table "key_pairs_backup", force: :cascade do |t|
t.integer "repository_id", null: false, index: {name: "index_key_pairs_backup_on_repository_id", unique: true}
t.integer "user_id", null: false
t.string "key_id", null: false
t.text "public", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["repository_id"], :name => "index_key_pairs_backup_on_repository_id", :unique => true
end
create_table "labelings", force: true do |t|
create_table "labelings", force: :cascade do |t|
t.integer "label_id", null: false
t.integer "issue_id"
t.integer "issue_id", index: {name: "index_labelings_on_issue_id"}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["issue_id"], :name => "index_labelings_on_issue_id"
end
create_table "labels", force: true do |t|
create_table "labels", force: :cascade do |t|
t.string "name", null: false
t.string "color", null: false
t.integer "project_id"
t.integer "project_id", index: {name: "index_labels_on_project_id"}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["project_id"], :name => "index_labels_on_project_id"
end
create_table "mass_builds", force: true do |t|
t.integer "build_for_platform_id", null: false
create_table "mass_builds", force: :cascade do |t|
t.integer "build_for_platform_id", null: false
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "arch_names"
t.integer "user_id"
t.integer "build_lists_count", default: 0, null: false
@ -333,7 +293,7 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.integer "missed_projects_count", default: 0, null: false
t.text "missed_projects_list"
t.boolean "new_core", default: true
t.integer "save_to_platform_id", null: false
t.integer "save_to_platform_id", null: false
t.text "extra_repositories"
t.text "extra_build_lists"
t.boolean "increase_release_tag", default: false, null: false
@ -348,20 +308,20 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.string "external_nodes"
end
create_table "users", force: true do |t|
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email", default: "", null: false
t.string "email", default: "", null: false, index: {name: "index_users_on_email", unique: true}
t.string "encrypted_password", limit: 128, default: "", null: false
t.string "reset_password_token"
t.string "reset_password_token", index: {name: "index_users_on_reset_password_token", unique: true}
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.datetime "created_at"
t.datetime "updated_at"
t.text "ssh_key"
t.string "uname"
t.string "uname", index: {name: "index_users_on_uname", unique: true}
t.string "role"
t.string "language", default: "en"
t.integer "own_projects_count", default: 0, null: false
t.string "language", default: "en"
t.integer "own_projects_count", default: 0, null: false
t.text "professional_experience"
t.string "site"
t.string "company"
@ -370,48 +330,39 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.string "avatar_content_type"
t.integer "avatar_file_size"
t.datetime "avatar_updated_at"
t.integer "failed_attempts", default: 0
t.string "unlock_token"
t.integer "failed_attempts", default: 0
t.string "unlock_token", index: {name: "index_users_on_unlock_token", unique: true}
t.datetime "locked_at"
t.string "confirmation_token"
t.string "confirmation_token", index: {name: "index_users_on_confirmation_token", unique: true}
t.datetime "confirmed_at"
t.datetime "confirmation_sent_at"
t.string "authentication_token"
t.integer "build_priority", default: 50
t.boolean "sound_notifications", default: true
t.boolean "hide_email", default: true, null: false
t.index ["authentication_token"], :name => "index_users_on_authentication_token"
t.index ["confirmation_token"], :name => "index_users_on_confirmation_token", :unique => true
t.index ["email"], :name => "index_users_on_email", :unique => true
t.index ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true
t.index ["uname"], :name => "index_users_on_uname", :unique => true
t.index ["unlock_token"], :name => "index_users_on_unlock_token", :unique => true
t.string "authentication_token", index: {name: "index_users_on_authentication_token"}
t.integer "build_priority", default: 50
t.boolean "sound_notifications", default: true
t.boolean "hide_email", default: true, null: false
end
create_table "node_instructions", force: true do |t|
t.integer "user_id", null: false
create_table "node_instructions", force: :cascade do |t|
t.integer "user_id", null: false, index: {name: "fk__node_instructions_user_id"}, foreign_key: {references: "users", name: "fk_node_instructions_user_id", on_update: :no_action, on_delete: :no_action}
t.text "encrypted_instruction", null: false
t.text "output"
t.string "status"
t.datetime "created_at"
t.datetime "updated_at"
t.index ["user_id"], :name => "fk__node_instructions_user_id"
t.foreign_key ["user_id"], "users", ["id"], :on_update => :no_action, :on_delete => :no_action, :name => "fk_node_instructions_user_id"
end
create_table "platform_arch_settings", force: true do |t|
t.integer "platform_id", null: false
create_table "platform_arch_settings", force: :cascade do |t|
t.integer "platform_id", null: false, index: {name: "index_platform_arch_settings_on_platform_id_and_arch_id", with: ["arch_id"], unique: true}
t.integer "arch_id", null: false
t.integer "time_living", null: false
t.boolean "default"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["platform_id", "arch_id"], :name => "index_platform_arch_settings_on_platform_id_and_arch_id", :unique => true
end
create_table "platforms", force: true do |t|
create_table "platforms", force: :cascade do |t|
t.string "description"
t.string "name", null: false
t.string "name", null: false, index: {name: "index_platforms_on_name", unique: true, case_sensitive: false}
t.integer "parent_platform_id"
t.datetime "created_at"
t.datetime "updated_at"
@ -420,19 +371,18 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.string "owner_type"
t.string "visibility", default: "open", null: false
t.string "platform_type", default: "main", null: false
t.string "distrib_type", null: false
t.string "distrib_type", null: false
t.integer "status"
t.datetime "last_regenerated_at"
t.integer "last_regenerated_status"
t.string "last_regenerated_log_sha1"
t.string "automatic_metadata_regeneration"
t.string "default_branch", null: false
t.index ["name"], :name => "index_platforms_on_name", :unique => true, :case_sensitive => false
t.string "default_branch", null: false
end
create_table "product_build_lists", force: true do |t|
t.integer "product_id"
t.integer "status", null: false
create_table "product_build_lists", force: :cascade do |t|
t.integer "product_id", index: {name: "index_product_build_lists_on_product_id"}
t.integer "status", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.integer "project_id"
@ -446,10 +396,9 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.integer "user_id"
t.boolean "not_delete", default: false
t.boolean "autostarted", default: false
t.index ["product_id"], :name => "index_product_build_lists_on_product_id"
end
create_table "products", force: true do |t|
create_table "products", force: :cascade do |t|
t.string "name", null: false
t.integer "platform_id", null: false
t.datetime "created_at"
@ -463,28 +412,26 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.string "project_version"
end
create_table "project_imports", force: true do |t|
create_table "project_imports", force: :cascade do |t|
t.integer "project_id"
t.string "name"
t.string "name", index: {name: "index_project_imports_on_name_and_platform_id", with: ["platform_id"], unique: true, case_sensitive: false}
t.string "version"
t.datetime "file_mtime"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "platform_id"
t.index ["name", "platform_id"], :name => "index_project_imports_on_name_and_platform_id", :unique => true, :case_sensitive => false
end
create_table "project_statistics", force: true do |t|
create_table "project_statistics", force: :cascade do |t|
t.integer "average_build_time", default: 0, null: false
t.integer "build_count", default: 0, null: false
t.integer "arch_id", null: false
t.integer "project_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["project_id", "arch_id"], :name => "index_project_statistics_on_project_id_and_arch_id", :unique => true
t.integer "arch_id", null: false
t.integer "project_id", null: false, index: {name: "index_project_statistics_on_project_id_and_arch_id", with: ["arch_id"], unique: true}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "project_tags", force: true do |t|
create_table "project_tags", force: :cascade do |t|
t.integer "project_id"
t.string "commit_id"
t.string "sha1"
@ -494,32 +441,28 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.datetime "updated_at", null: false
end
create_table "project_to_repositories", force: true do |t|
create_table "project_to_repositories", force: :cascade do |t|
t.integer "project_id"
t.integer "repository_id"
t.integer "repository_id", index: {name: "index_project_to_repositories_on_repository_id_and_project_id", with: ["project_id"], unique: true}
t.datetime "created_at"
t.datetime "updated_at"
t.hstore "autostart_options"
t.index ["repository_id", "project_id"], :name => "index_project_to_repositories_on_repository_id_and_project_id", :unique => true
end
create_table "pull_requests", force: true do |t|
t.integer "issue_id", null: false
t.integer "to_project_id", null: false
t.integer "from_project_id", null: false
create_table "pull_requests", force: :cascade do |t|
t.integer "issue_id", null: false, index: {name: "index_pull_requests_on_issue_id"}
t.integer "to_project_id", null: false, index: {name: "index_pull_requests_on_base_project_id"}
t.integer "from_project_id", null: false, index: {name: "index_pull_requests_on_head_project_id"}
t.string "to_ref", null: false
t.string "from_ref", null: false
t.string "from_project_owner_uname"
t.string "from_project_name"
t.index ["from_project_id"], :name => "index_pull_requests_on_head_project_id"
t.index ["issue_id"], :name => "index_pull_requests_on_issue_id"
t.index ["to_project_id"], :name => "index_pull_requests_on_base_project_id"
end
create_table "register_requests", force: true do |t|
create_table "register_requests", force: :cascade do |t|
t.string "name"
t.string "email"
t.string "token"
t.string "email", index: {name: "index_register_requests_on_email", unique: true, case_sensitive: false}
t.string "token", index: {name: "index_register_requests_on_token", unique: true, case_sensitive: false}
t.boolean "approved", default: false
t.boolean "rejected", default: false
t.datetime "created_at"
@ -527,48 +470,42 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.string "interest"
t.text "more"
t.string "language"
t.index ["email"], :name => "index_register_requests_on_email", :unique => true, :case_sensitive => false
t.index ["token"], :name => "index_register_requests_on_token", :unique => true, :case_sensitive => false
end
create_table "relations", force: true do |t|
create_table "relations", force: :cascade do |t|
t.integer "actor_id"
t.string "actor_type"
t.string "actor_type", index: {name: "index_relations_on_actor_type_and_actor_id", with: ["actor_id"]}
t.integer "target_id"
t.string "target_type"
t.string "target_type", index: {name: "index_relations_on_target_type_and_target_id", with: ["target_id"]}
t.datetime "created_at"
t.datetime "updated_at"
t.string "role"
t.index ["actor_type", "actor_id"], :name => "index_relations_on_actor_type_and_actor_id"
t.index ["target_type", "target_id"], :name => "index_relations_on_target_type_and_target_id"
end
create_table "repositories", force: true do |t|
t.string "description", null: false
t.integer "platform_id", null: false
create_table "repositories", force: :cascade do |t|
t.string "description", null: false
t.integer "platform_id", null: false, index: {name: "index_repositories_on_platform_id"}
t.datetime "created_at"
t.datetime "updated_at"
t.string "name", null: false
t.string "name", null: false
t.boolean "publish_without_qa", default: true
t.boolean "synchronizing_publications", default: false, null: false
t.string "publish_builds_only_from_branch"
t.index ["platform_id"], :name => "index_repositories_on_platform_id"
end
create_table "repository_statuses", force: true do |t|
t.integer "repository_id", null: false
t.integer "platform_id", null: false
create_table "repository_statuses", force: :cascade do |t|
t.integer "repository_id", null: false, index: {name: "index_repository_statuses_on_repository_id_and_platform_id", with: ["platform_id"], unique: true}
t.integer "platform_id", null: false
t.integer "status", default: 0
t.datetime "last_regenerated_at"
t.integer "last_regenerated_status"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "last_regenerated_log_sha1"
t.index ["repository_id", "platform_id"], :name => "index_repository_statuses_on_repository_id_and_platform_id", :unique => true
end
create_table "settings_notifiers", force: true do |t|
t.integer "user_id", null: false
create_table "settings_notifiers", force: :cascade do |t|
t.integer "user_id", null: false
t.boolean "can_notify", default: true
t.boolean "new_comment", default: true
t.boolean "new_comment_reply", default: true
@ -584,66 +521,57 @@ ActiveRecord::Schema.define(version: 20150601043133) do
t.boolean "update_code", default: false
end
create_table "ssh_keys", force: true do |t|
create_table "ssh_keys", force: :cascade do |t|
t.string "name"
t.text "key", null: false
t.string "fingerprint", null: false
t.integer "user_id", null: false
t.string "fingerprint", null: false, index: {name: "index_ssh_keys_on_fingerprint", unique: true}
t.integer "user_id", null: false, index: {name: "index_ssh_keys_on_user_id"}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["fingerprint"], :name => "index_ssh_keys_on_fingerprint", :unique => true
t.index ["user_id"], :name => "index_ssh_keys_on_user_id"
end
create_table "statistics", force: true do |t|
t.integer "user_id", null: false
t.string "email", null: false
t.integer "project_id", null: false
t.string "project_name_with_owner", null: false
t.string "key", null: false
create_table "statistics", force: :cascade do |t|
t.integer "user_id", null: false, index: {name: "index_statistics_on_user_id"}
t.string "email", null: false
t.integer "project_id", null: false, index: {name: "index_statistics_on_project_id"}
t.string "project_name_with_owner", null: false
t.string "key", null: false, index: {name: "index_statistics_on_key"}
t.integer "counter", default: 0, null: false
t.datetime "activity_at", null: false
t.datetime "activity_at", null: false, index: {name: "index_statistics_on_activity_at"}
t.datetime "created_at"
t.datetime "updated_at"
t.index ["activity_at"], :name => "index_statistics_on_activity_at"
t.index ["key", "activity_at"], :name => "index_statistics_on_key_and_activity_at"
t.index ["key"], :name => "index_statistics_on_key"
t.index ["project_id", "key", "activity_at"], :name => "index_statistics_on_project_id_and_key_and_activity_at"
t.index ["project_id"], :name => "index_statistics_on_project_id"
t.index ["user_id", "key", "activity_at"], :name => "index_statistics_on_user_id_and_key_and_activity_at"
t.index ["user_id", "project_id", "key", "activity_at"], :name => "index_statistics_on_all_keys", :unique => true
t.index ["user_id"], :name => "index_statistics_on_user_id"
end
add_index "statistics", ["key", "activity_at"], name: "index_statistics_on_key_and_activity_at"
add_index "statistics", ["project_id", "key", "activity_at"], name: "index_statistics_on_project_id_and_key_and_activity_at"
add_index "statistics", ["user_id", "key", "activity_at"], name: "index_statistics_on_user_id_and_key_and_activity_at"
add_index "statistics", ["user_id", "project_id", "key", "activity_at"], name: "index_statistics_on_all_keys", unique: true
create_table "subscribes", force: true do |t|
create_table "subscribes", force: :cascade do |t|
t.string "subscribeable_type"
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "status", default: true
t.boolean "status", default: true
t.integer "project_id"
t.decimal "subscribeable_id", precision: 50, scale: 0
t.decimal "subscribeable_id", precision: 50
end
create_table "tokens", force: true do |t|
t.integer "subject_id", null: false
t.string "subject_type", null: false
t.integer "creator_id", null: false
create_table "tokens", force: :cascade do |t|
t.integer "subject_id", null: false, index: {name: "index_tokens_on_subject_id_and_subject_type", with: ["subject_type"]}
t.string "subject_type", null: false
t.integer "creator_id", null: false
t.integer "updater_id"
t.string "status", default: "active"
t.text "description"
t.string "authentication_token", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["authentication_token"], :name => "index_tokens_on_authentication_token", :unique => true
t.index ["subject_id", "subject_type"], :name => "index_tokens_on_subject_id_and_subject_type"
t.string "authentication_token", null: false, index: {name: "index_tokens_on_authentication_token", unique: true}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "user_builds_settings", force: true do |t|
t.integer "user_id", null: false
create_table "user_builds_settings", force: :cascade do |t|
t.integer "user_id", null: false, index: {name: "index_user_builds_settings_on_user_id", unique: true}
t.text "platforms", default: [], null: false, array: true
t.string "external_nodes"
t.index ["user_id"], :name => "index_user_builds_settings_on_user_id", :unique => true
end
end

View File

@ -6,5 +6,10 @@ describe AdvisoriesController, type: :controller do
get :search
expect(response).to_not redirect_to(forbidden_path)
end
it "should be able to perform index action" do
get :index
expect(response).to be_success
end
end
end

View File

@ -1,74 +1,64 @@
require 'spec_helper'
describe Api::V1::IssuesController, type: :controller do
let(:user) { FactoryGirl.create(:user) }
let(:project) { FactoryGirl.create(:project_with_commit) }
let(:issue) { FactoryGirl.create(:issue, project: project, user: user) }
let(:open_project) { FactoryGirl.create(:project) }
let(:open_issue) { FactoryGirl.create(:issue, project: open_project) }
let(:own_hidden_project) { FactoryGirl.create(:project, owner: user, visibility: 'hidden') }
let(:own_hidden_issue) { FactoryGirl.create(:issue, project: own_hidden_project, assignee: user) }
let(:hidden_project) { FactoryGirl.create(:project, visibility: 'hidden') }
let(:hidden_issue) { FactoryGirl.create(:issue, project: hidden_project) }
let(:create_params) { {issue: {title: 'title', body: 'body'}, project_id: project.id, format: :json} }
let(:update_params) { {issue: {title: 'new title'}, project_id: project.id, id: issue.serial_id, format: :json} }
before do
stub_symlink_methods
allow_any_instance_of(Project).to receive(:versions).and_return(%w(v1.0 v2.0))
@project = FactoryGirl.create(:project_with_commit)
@issue = FactoryGirl.create(:issue, project: @project)
@membered_issue = FactoryGirl.create(:issue)
@membered_project = @membered_issue.project
create_relation(@membered_project, @issue.user, 'reader')
@open_issue = FactoryGirl.create(:issue)
@open_project = @open_issue.project
@own_hidden_project = FactoryGirl.create(:project, owner: @issue.user)
@own_hidden_project.update_column :visibility, 'hidden'
@own_hidden_issue = FactoryGirl.create(:issue, project: @own_hidden_project, assignee: @issue.user)
@hidden_issue = FactoryGirl.create(:issue)
@hidden_project = @hidden_issue.project
@hidden_project.update_column :visibility, 'hidden'
@create_params = {issue: {title: 'title', body: 'body'}, project_id: @project.id, format: :json}
@update_params = {issue: {title: 'new title'}, project_id: @project.id, id: @issue.serial_id, format: :json}
@pull = @project.pull_requests.new issue_attributes: {title: 'test', body: 'testing'}
@pull.issue.user, @pull.issue.project = @project.owner, @pull.to_project
@pull.to_ref = 'master'
@pull.from_project, @pull.from_ref = @project, 'non_conflicts'
@pull.save
end
context 'read and accessible abilities' do
context 'for user' do
before do
http_login(@issue.user)
http_login(user)
end
it 'can show issue in own project' do
get :show, project_id: @project.id, id: @issue.serial_id, format: :json
get :show, project_id: project.id, id: issue.serial_id, format: :json
expect(response).to be_success
end
it 'should render right template for show action' do
get :show, project_id: @project.id, id: @issue.serial_id, format: :json
get :show, project_id: project.id, id: issue.serial_id, format: :json
expect(response).to render_template('api/v1/issues/show')
end
it 'can show issue in open project' do
get :show, project_id: @open_project.id, id: @open_issue.serial_id, format: :json
get :show, project_id: open_project.id, id: open_issue.serial_id, format: :json
expect(response).to be_success
end
it 'can show issue in own hidden project' do
get :show, project_id: @own_hidden_project.id, id: @own_hidden_issue.serial_id, format: :json
get :show, project_id: own_hidden_project.id, id: own_hidden_issue.serial_id, format: :json
expect(response).to be_success
end
it "can't show issue in hidden project" do
get :show, project_id: @hidden_project.id, id: @hidden_issue.serial_id, format: :json
get :show, project_id: hidden_project.id, id: hidden_issue.serial_id, format: :json
expect(response.code).to eq '403'
end
it 'should return three issues' do
membered_issue = FactoryGirl.create(:issue)
membered_project = membered_issue.project
create_relation(membered_project, issue.user, 'reader')
issue && own_hidden_issue # init
get :all_index, filter: 'all', format: :json
expect(assigns[:issues]).to include(@issue)
expect(assigns[:issues]).to include(@own_hidden_issue)
expect(assigns[:issues]).to include(@membered_issue)
expect(assigns[:issues]).to include(issue)
expect(assigns[:issues]).to include(own_hidden_issue)
expect(assigns[:issues]).to include(membered_issue)
end
it 'should render right template for all index action' do
@ -77,8 +67,9 @@ describe Api::V1::IssuesController, type: :controller do
end
it 'should return only assigned issue' do
own_hidden_issue # init
get :user_index, format: :json
expect(assigns[:issues]).to include(@own_hidden_issue)
expect(assigns[:issues]).to include(own_hidden_issue)
expect(assigns[:issues].count).to eq 1
end
@ -88,24 +79,30 @@ describe Api::V1::IssuesController, type: :controller do
end
it 'should return 404' do
get :show, project_id: @project.id, id: 999999, format: :json
get :show, project_id: project.id, id: 999999, format: :json
expect(response.code).to eq '404'
end
it 'should redirect to pull request page' do
get :show, project_id: @project.id, id: @pull.reload.serial_id, format: :json
expect(response).to redirect_to(api_v1_project_pull_request_path(@project.id, @pull.serial_id))
pull = project.pull_requests.new issue_attributes: {title: 'test', body: 'testing'}
pull.issue.user, pull.issue.project = project.owner, pull.to_project
pull.to_ref = 'master'
pull.from_project, pull.from_ref = project, 'non_conflicts'
pull.save
get :show, project_id: project.id, id: pull.reload.serial_id, format: :json
expect(response).to redirect_to(api_v1_project_pull_request_path(project.id, pull.serial_id))
end
end
context 'for anonymous user' do
it 'can show issue in open project', anonymous_access: true do
get :show, project_id: @project.id, id: @issue.serial_id, format: :json
get :show, project_id: project.id, id: issue.serial_id, format: :json
expect(response).to be_success
end
it "can't show issue in hidden project", anonymous_access: true do
get :show, project_id: @hidden_project.id, id: @hidden_issue.serial_id, format: :json
get :show, project_id: hidden_project.id, id: hidden_issue.serial_id, format: :json
expect(response.code).to eq '403'
end
@ -119,54 +116,54 @@ describe Api::V1::IssuesController, type: :controller do
context 'create accessibility' do
context 'for user' do
before do
http_login(@issue.user)
http_login(user)
end
it 'can create issue in own project' do
expect do
post :create, @create_params
post :create, create_params
end.to change(Issue, :count).by(1)
end
it 'can create issue in own hidden project' do
expect do
post :create, @create_params.merge(project_id: @own_hidden_project.id)
post :create, create_params.merge(project_id: own_hidden_project.id)
end.to change(Issue, :count).by(1)
end
it 'can create issue in open project' do
expect do
post :create, @create_params.merge(project_id: @open_project.id)
post :create, create_params.merge(project_id: open_project.id)
end.to change(Issue, :count).by(1)
end
it "can't create issue in hidden project" do
expect do
post :create, @create_params.merge(project_id: @hidden_project.id)
post :create, create_params.merge(project_id: hidden_project.id)
end.to change(Issue, :count).by(0)
end
it 'can assignee issue in own project' do
post :create, @create_params.deep_merge(project_id: @own_hidden_project.id, issue: {assignee_id: @issue.user.id})
expect(@own_hidden_project.issues.order(:id).last.assignee.id).to eq @issue.user.id
post :create, create_params.deep_merge(project_id: own_hidden_project.id, issue: {assignee_id: user.id})
expect(own_hidden_project.issues.order(:id).last.assignee.id).to eq user.id
end
it "can't assignee issue in open project" do
post :create, @create_params.deep_merge(project_id: @open_project.id, issue: {assignee_id: @issue.user.id})
expect(@open_project.issues.order(:id).last.assignee).to be_nil
post :create, create_params.deep_merge(project_id: open_project.id, issue: {assignee_id: user.id})
expect(open_project.issues.order(:id).last.assignee).to be_nil
end
end
context 'for anonymous user' do
it "can't create issue in project", anonymous_access: true do
expect do
post :create, @create_params
post :create, create_params
end.to change(Issue, :count).by(0)
end
it "can't create issue in hidden project", anonymous_access: true do
expect do
post :create, @create_params.merge(project_id: @hidden_project.id)
post :create, create_params.merge(project_id: hidden_project.id)
end.to change(Issue, :count).by(0)
end
end
@ -175,48 +172,48 @@ describe Api::V1::IssuesController, type: :controller do
context 'update accessibility' do
context 'for user' do
before(:each) do
http_login(@issue.user)
http_login(user)
end
it 'can update issue in own project' do
put :update, @update_params
expect(@issue.reload.title).to eq 'new title'
put :update, update_params
expect(issue.reload.title).to eq 'new title'
end
it 'can update issue in own hidden project' do
put :update, @update_params.merge(project_id: @own_hidden_project.id, id: @own_hidden_issue.serial_id)
expect(@own_hidden_issue.reload.title).to eq 'new title'
put :update, update_params.merge(project_id: own_hidden_project.id, id: own_hidden_issue.serial_id)
expect(own_hidden_issue.reload.title).to eq 'new title'
end
it "can't update issue in open project" do
put :update, @update_params.merge(project_id: @open_project.id, id: @open_issue.serial_id)
expect(@open_issue.reload.title).to_not eq 'new title'
put :update, update_params.merge(project_id: open_project.id, id: open_issue.serial_id)
expect(open_issue.reload.title).to_not eq 'new title'
end
it "can't update issue in hidden project" do
put :update, @update_params.merge(project_id: @hidden_project.id, id: @hidden_issue.serial_id)
expect(@hidden_issue.reload.title).to_not eq 'title'
put :update, update_params.merge(project_id: hidden_project.id, id: hidden_issue.serial_id)
expect(hidden_issue.reload.title).to_not eq 'title'
end
it "can't assignee issue in open project" do
post :create, @update_params.deep_merge(project_id: @open_project.id, issue: {assignee_id: @issue.user.id})
expect(@open_issue.reload.assignee.id).to_not eq @issue.user.id
post :create, update_params.deep_merge(project_id: open_project.id, issue: {assignee_id: user.id})
expect(open_issue.reload.assignee.id).to_not eq issue.user.id
end
it 'can assignee issue in own project' do
post :create, @update_params.deep_merge(issue: {assignee_id: @issue.user.id})
expect(@issue.reload.assignee.id).to_not eq @issue.user.id
post :create, update_params.deep_merge(issue: {assignee_id: issue.user.id})
expect(issue.reload.assignee.id).to_not eq issue.user.id
end
end
context 'for anonymous user' do
it "can't update issue in project", anonymous_access: true do
put :update, @update_params
put :update, update_params
expect(response.code).to eq '401'
end
it "can't update issue in hidden project", anonymous_access: true do
put :update, @update_params.merge(project_id: @hidden_project.id, id: @hidden_issue.serial_id)
put :update, update_params.merge(project_id: hidden_project.id, id: hidden_issue.serial_id)
expect(response.code).to eq '401'
end
end

View File

@ -5,16 +5,16 @@ shared_examples_for "api projects user with reader rights" do
end
shared_examples_for "api projects user with reader rights for hidden project" do
before(:each) do
@project.update_column(:visibility, 'hidden')
before do
project.update_column(:visibility, 'hidden')
end
it_should_behave_like 'api projects user with show rights'
end
shared_examples_for "api projects user without reader rights for hidden project" do
before(:each) do
@project.update_column(:visibility, 'hidden')
before do
project.update_column(:visibility, 'hidden')
end
it_should_behave_like 'api projects user without show rights'
@ -22,98 +22,92 @@ end
shared_examples_for "api projects user without show rights" do
it "to show access violation instead of project data" do
get :show, id: @project.id, format: :json
get :show, id: project.id, format: :json
expect(response).to_not be_success
end
it "to show access violation instead of project refs_list" do
get :refs_list, id: @project.id, format: :json
get :refs_list, id: project.id, format: :json
expect(response).to_not be_success
end
it "to access violation instead of project data by get_id" do
get :get_id, name: @project.name, owner: @project.owner_uname, format: :json
get :get_id, name: project.name, owner: project.owner_uname, format: :json
expect(response).to_not be_success
end
it "to show access violation instead of project members data" do
get :members, id: @project.id, format: :json
get :members, id: project.id, format: :json
expect(response).to_not be_success
end
end
shared_examples_for 'api projects user without fork rights' do
before { project } # init
it 'to not be able to perform fork action' do
post :fork, id: @project.id, format: :json
expect(response).to_not be_success
end
it 'ensures that project has not been forked' do
expect do
post :fork, id: @project.id, format: :json
post :fork, id: project.id, format: :json
end.to_not change(Project, :count)
expect(response).to_not be_success
end
end
shared_examples_for 'api projects user with fork rights' do
before { project } # init
it 'to be able to perform fork action' do
post :fork, id: @project.id, format: :json
expect(response).to be_success
end
it 'ensures that project has been forked' do
expect do
post :fork, id: @project.id, format: :json
post :fork, id: project.id, format: :json
end.to change(Project, :count).by(1)
expect(response).to be_success
end
it 'to be able to perform fork action with different name' do
post :fork, id: @project.id, fork_name: (@project.name + '_forked'), format: :json
expect(response).to be_success
end
it 'ensures that project has been forked' do
new_name = @project.name + '_forked'
new_name = project.name + '_forked'
expect do
post :fork, id: @project.id, fork_name: new_name, format: :json
post :fork, id: project.id, fork_name: new_name, format: :json
end.to change{ Project.where(name: new_name).count }.by(1)
expect(response).to be_success
end
end
shared_examples_for 'api projects user with fork rights for hidden project' do
before { @project.update_column(:visibility, 'hidden') }
before { project.update_column(:visibility, 'hidden') }
it_should_behave_like 'api projects user with fork rights'
end
shared_examples_for 'api projects user without fork rights for hidden project' do
before { @project.update_column(:visibility, 'hidden') }
before { project.update_column(:visibility, 'hidden') }
it_should_behave_like 'api projects user without fork rights'
end
shared_examples_for "api projects user with show rights" do
it "to show project data" do
get :show, id: @project.id, format: :json
get :show, id: project.id, format: :json
expect(response).to render_template(:show)
end
it "to show refs_list of project" do
get :refs_list, id: @project.id, format: :json
get :refs_list, id: project.id, format: :json
expect(response).to render_template(:refs_list)
end
context 'project find by get_id' do
it "to find project by name and owner name" do
@project.reload
get :get_id, name: @project.name, owner: @project.owner_uname, format: :json
expect(assigns[:project].id).to eq @project.id
project.reload
get :get_id, name: project.name, owner: project.owner_uname, format: :json
expect(assigns[:project].id).to eq project.id
end
it "to not find project by non existing name and owner name" do
get :get_id, name: 'NONE_EXISTING_NAME', owner: @project.owner_uname, format: :json
get :get_id, name: 'NONE_EXISTING_NAME', owner: project.owner_uname, format: :json
expect(assigns :project).to be_blank
end
it "to render 404 for non existing name and owner name" do
get :get_id, name: 'NONE_EXISTING_NAME', owner: @project.owner_uname, format: :json
get :get_id, name: 'NONE_EXISTING_NAME', owner: project.owner_uname, format: :json
expect(response.body).to eq({status: 404, message: I18n.t("flash.404_message")}.to_json)
end
end
@ -122,68 +116,60 @@ end
shared_examples_for 'api projects user with admin rights' do
it "to be able to perform members action" do
get :members, id: @project.id, format: :json
get :members, id: project.id, format: :json
expect(response).to be_success
end
it 'to not set a wrong maintainer_id' do
put :update, project: { maintainer_id: -1 }, id: @project.id, format: :json
put :update, project: { maintainer_id: -1 }, id: project.id, format: :json
expect(response).to_not be_success
end
context 'api project user with update rights' do
before do
put :update, project: { description: 'new description' }, id: @project.id, format: :json
put :update, project: { description: 'new description' }, id: project.id, format: :json
end
it 'to be able to perform update action' do
expect(response).to be_success
end
it 'ensures that description has been updated' do
expect(@project.reload.description).to eq 'new description'
expect(project.reload.description).to eq 'new description'
end
end
context 'api project user with add_member rights' do
let(:member) { FactoryGirl.create(:user) }
before do
put :add_member, member_id: member.id, type: 'User', role: 'admin', id: @project.id, format: :json
put :add_member, member_id: member.id, type: 'User', role: 'admin', id: project.id, format: :json
end
it 'to be able to perform add_member action' do
expect(response).to be_success
end
it 'ensures that new member has been added to project' do
expect(@project.members).to include(member)
expect(project.members).to include(member)
end
end
context 'api project user with remove_member rights' do
let(:member) { FactoryGirl.create(:user) }
before do
@project.add_member(member)
delete :remove_member, member_id: member.id, type: 'User', id: @project.id, format: :json
project.add_member(member)
delete :remove_member, member_id: member.id, type: 'User', id: project.id, format: :json
end
it 'to be able to perform remove_member action' do
expect(response).to be_success
end
it 'ensures that member has been removed from project' do
expect(@project.members).to_not include(member)
expect(project.members).to_not include(member)
end
end
context 'api group user with update_member rights' do
let(:member) { FactoryGirl.create(:user) }
before do
@project.add_member(member)
put :update_member, member_id: member.id, type: 'User', role: 'reader', id: @project.id, format: :json
project.add_member(member)
put :update_member, member_id: member.id, type: 'User', role: 'reader', id: project.id, format: :json
end
it 'to be able to perform update_member action' do
expect(response).to be_success
end
it 'ensures that member role has been updated in project' do
role = @project.relations.by_actor(member).first.role
role = project.relations.by_actor(member).first.role
expect(role).to eq 'reader'
end
end
@ -192,112 +178,106 @@ end
shared_examples_for 'api projects user without admin rights' do
it "to not be able to perform members action" do
get :members, id: @project.id, format: :json
get :members, id: project.id, format: :json
expect(response).to_not be_success
end
context 'api project user without update_member rights' do
let(:member) { FactoryGirl.create(:user) }
before do
@project.add_member(member)
put :update_member, member_id: member.id, type: 'User', role: 'reader', id: @project.id, format: :json
project.add_member(member)
put :update_member, member_id: member.id, type: 'User', role: 'reader', id: project.id, format: :json
end
it 'to not be able to perform update_member action' do
expect(response).to_not be_success
end
it 'ensures that member role has not been updated in project' do
role = @project.relations.by_actor(member).first.role
role = project.relations.by_actor(member).first.role
expect(role).to_not eq 'reader'
end
end
context 'api project user without update rights' do
before do
put :update, project: {description: 'new description'}, id: @project.id, format: :json
put :update, project: {description: 'new description'}, id: project.id, format: :json
end
it 'to not be able to perform update action' do
expect(response).to_not be_success
end
it 'ensures that project has not been updated' do
expect(@project.reload.description).to_not eq 'new description'
expect(project.reload.description).to_not eq 'new description'
end
end
context 'api project user without add_member rights' do
let(:member) { FactoryGirl.create(:user) }
before do
put :add_member, member_id: member.id, type: 'User', role: 'admin', id: @project.id, format: :json
put :add_member, member_id: member.id, type: 'User', role: 'admin', id: project.id, format: :json
end
it 'to not be able to perform add_member action' do
expect(response).to_not be_success
end
it 'ensures that new member has not been added to project' do
expect(@project.members).to_not include(member)
expect(project.members).to_not include(member)
end
end
context 'api project user without remove_member rights' do
let(:member) { FactoryGirl.create(:user) }
before do
@project.add_member(member)
delete :remove_member, member_id: member.id, type: 'User', id: @project.id, format: :json
project.add_member(member)
delete :remove_member, member_id: member.id, type: 'User', id: project.id, format: :json
end
it 'to be able to perform update action' do
expect(response).to_not be_success
end
it 'ensures that member has not been removed from project' do
expect(@project.members).to include(member)
expect(project.members).to include(member)
end
end
end
shared_examples_for 'api projects user with owner rights' do
before { project } # init
context 'api project user with destroy rights' do
it 'to be able to perform destroy action' do
delete :destroy, id: @project.id, format: :json
expect(response).to be_success
end
it 'ensures that project has been destroyed' do
expect do
delete :destroy, id: @project.id, format: :json
delete :destroy, id: project.id, format: :json
end.to change(Project, :count).by(-1)
expect(response).to be_success
end
end
end
shared_examples_for 'api projects user without owner rights' do
before { project } # init
context 'api project user with destroy rights' do
it 'to not be able to perform destroy action' do
delete :destroy, id: @project.id, format: :json
expect(response).to_not be_success
end
it 'ensures that project has not been destroyed' do
expect do
delete :destroy, id: @project.id, format: :json
delete :destroy, id: project.id, format: :json
end.to_not change(Project, :count)
expect(response).to_not be_success
end
end
end
describe Api::V1::ProjectsController, type: :controller do
before(:each) do
let(:project) { FactoryGirl.create(:project) }
let(:hidden_project) { FactoryGirl.create(:project) }
let(:another_user) { FactoryGirl.create(:user) }
before do
stub_symlink_methods
@project = FactoryGirl.create(:project)
@hidden_project = FactoryGirl.create(:project)
@another_user = FactoryGirl.create(:user)
# project = FactoryGirl.create(:project)
# hidden_project = FactoryGirl.create(:project)
# another_user = FactoryGirl.create(:user)
end
context 'for guest' do
[:index, :members].each do |action|
it "to not be able to perform #{action} action" do
get action, id: @project.id, format: :json
get action, id: project.id, format: :json
expect(response).to_not be_success
end
end
@ -315,9 +295,10 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'for simple user' do
before(:each) do
@user = FactoryGirl.create(:user)
http_login(@user)
let(:user) { FactoryGirl.create(:user) }
before do
http_login(user)
end
it 'to be able to perform index action' do
@ -326,7 +307,7 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'api project user with create rights' do
let(:params) { {project: {name: 'test_name', owner_id: @user.id, owner_type: 'User', visibility: 'open'}, format: :json} }
let(:params) { {project: {name: 'test_name', owner_id: user.id, owner_type: 'User', visibility: 'open'}, format: :json} }
it 'to be able to perform create action' do
post :create, params, format: :json
expect(response).to be_success
@ -339,7 +320,7 @@ describe Api::V1::ProjectsController, type: :controller do
it 'writer group to be able to create project for their group' do
group = FactoryGirl.create(:group)
create_actor_relation(group, @user, 'writer')
create_actor_relation(group, user, 'writer')
expect do
post :create, params.deep_merge({project: {owner_type: 'Group', owner_id: group.id}})
end.to change(Project, :count).by(1)
@ -347,7 +328,7 @@ describe Api::V1::ProjectsController, type: :controller do
it 'reader group to not be able to create project for their group' do
group = FactoryGirl.create(:group)
create_actor_relation(group, @user, 'reader')
create_actor_relation(group, user, 'reader')
expect do
post :create, params.deep_merge({project: {owner_type: 'Group', owner_id: group.id}})
end.to_not change(Project, :count)
@ -362,48 +343,53 @@ describe Api::V1::ProjectsController, type: :controller do
it_should_behave_like 'api projects user without owner rights'
context 'group writer' do
before { project } # init
it 'to be able to fork project to their group' do
group = FactoryGirl.create(:group)
create_actor_relation(group, @user, 'writer')
create_actor_relation(group, user, 'writer')
expect do
post :fork, id: @project.id, group_id: group.id, format: :json
post :fork, id: project.id, group_id: group.id, format: :json
end.to change(Project, :count).by(1)
end
it 'to be able to fork project with different name to their group' do
group = FactoryGirl.create(:group)
create_actor_relation(group, @user, 'writer')
new_name = @project.name + '_forked'
create_actor_relation(group, user, 'writer')
new_name = project.name + '_forked'
expect do
post :fork, id: @project.id, group_id: group.id, fork_name: new_name, format: :json
post :fork, id: project.id, group_id: group.id, fork_name: new_name, format: :json
end.to change { Project.where(name: new_name).count }.by(1)
end
end
context 'group reader' do
before { project } # init
it 'to not be able to fork project to their group' do
group = FactoryGirl.create(:group)
create_actor_relation(group, @user, 'reader')
create_actor_relation(group, user, 'reader')
expect do
post :fork, id: @project.id, group_id: group.id, format: :json
post :fork, id: project.id, group_id: group.id, format: :json
end.to_not change(Project, :count)
end
it 'to not be able to fork project with different name to their group' do
group = FactoryGirl.create(:group)
new_name = @project.name + '_forked'
create_actor_relation(group, @user, 'reader')
new_name = project.name + '_forked'
create_actor_relation(group, user, 'reader')
expect do
post :fork, id: @project.id, group_id: group.id, fork_name: new_name, format: :json
post :fork, id: project.id, group_id: group.id, fork_name: new_name, format: :json
end.to_not change{ Project.where(name: new_name).count }
end
end
end
context 'for admin' do
before(:each) do
@admin = FactoryGirl.create(:admin)
http_login(@admin)
let(:admin) { FactoryGirl.create(:admin) }
before do
http_login(admin)
end
it_should_behave_like 'api projects user with reader rights'
@ -415,10 +401,11 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'for owner user' do
before(:each) do
@user = FactoryGirl.create(:user)
http_login(@user)
@project = FactoryGirl.create(:project, owner: @user)
let(:user) { FactoryGirl.create(:user) }
let(:project) { FactoryGirl.create(:project, owner: user) }
before do
http_login(user)
end
it_should_behave_like 'api projects user with reader rights'
@ -430,10 +417,11 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'for reader user' do
before(:each) do
@user = FactoryGirl.create(:user)
http_login(@user)
create_relation(@project, @user, 'reader')
let(:user) { FactoryGirl.create(:user) }
before do
http_login(user)
create_relation(project, user, 'reader')
end
it_should_behave_like 'api projects user with reader rights'
@ -445,10 +433,11 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'for writer user' do
before(:each) do
@user = FactoryGirl.create(:user)
http_login(@user)
create_relation(@project, @user, 'writer')
let(:user) { FactoryGirl.create(:user) }
before do
http_login(user)
create_relation(project, user, 'writer')
end
it_should_behave_like 'api projects user with reader rights'
@ -460,11 +449,12 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'for group' do
before(:each) do
@group = FactoryGirl.create(:group)
@group_user = FactoryGirl.create(:user)
# @project.relations.destroy_all
http_login(@group_user)
let(:group) { FactoryGirl.create(:group) }
let(:group_user) { FactoryGirl.create(:user) }
before do
# project.relations.destroy_all
http_login(group_user)
end
context 'with no relations to project' do
@ -477,12 +467,10 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'owner of the project' do
before(:each) do
@project = FactoryGirl.create(:project, owner: @group)
end
let(:project) { FactoryGirl.create(:project, owner: group) }
context 'reader user' do
before(:each) { create_actor_relation(@group, @group_user, 'reader') }
before { create_actor_relation(group, group_user, 'reader') }
it_should_behave_like 'api projects user with reader rights'
it_should_behave_like 'api projects user with reader rights for hidden project'
@ -493,7 +481,7 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'admin user' do
before(:each) { create_actor_relation(@group, @group_user, 'admin') }
before { create_actor_relation(group, group_user, 'admin') }
it_should_behave_like 'api projects user with reader rights'
it_should_behave_like 'api projects user with reader rights for hidden project'
@ -506,12 +494,12 @@ describe Api::V1::ProjectsController, type: :controller do
context 'member of the project' do
context 'with admin rights' do
before(:each) do
create_relation(@project, @group, 'admin')
before do
create_relation(project, group, 'admin')
end
context 'reader user' do
before(:each) { create_actor_relation(@group, @group_user, 'reader') }
before { create_actor_relation(group, group_user, 'reader') }
it_should_behave_like 'api projects user with reader rights'
it_should_behave_like 'api projects user with reader rights for hidden project'
@ -522,7 +510,7 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'admin user' do
before(:each) { create_actor_relation(@group, @group_user, 'admin') }
before { create_actor_relation(group, group_user, 'admin') }
it_should_behave_like 'api projects user with reader rights'
it_should_behave_like 'api projects user with reader rights for hidden project'
@ -534,10 +522,10 @@ describe Api::V1::ProjectsController, type: :controller do
end
context 'with reader rights' do
before(:each) { create_relation(@project, @group, 'reader') }
before { create_relation(project, group, 'reader') }
context 'reader user' do
before(:each) { create_actor_relation(@group, @group_user, 'reader') }
before { create_actor_relation(group, group_user, 'reader') }
it_should_behave_like 'api projects user with reader rights'
it_should_behave_like 'api projects user with reader rights for hidden project'
@ -547,7 +535,7 @@ describe Api::V1::ProjectsController, type: :controller do
it_should_behave_like 'api projects user without owner rights'
context 'user should has best role' do
before(:each) { create_relation(@project, @group_user, 'admin') }
before { create_relation(project, group_user, 'admin') }
it_should_behave_like 'api projects user with reader rights'
it_should_behave_like 'api projects user with fork rights'
@ -557,8 +545,9 @@ describe Api::V1::ProjectsController, type: :controller do
end
end
context 'admin user' do
before(:each) { create_actor_relation(@group, @group_user, 'admin') }
before { create_actor_relation(group, group_user, 'admin') }
it_should_behave_like 'api projects user with reader rights'
it_should_behave_like 'api projects user with reader rights for hidden project'

View File

@ -1,6 +1,6 @@
require 'spec_helper'
def create_pull to_ref, from_ref, owner, project = @project
def create_pull to_ref, from_ref, owner, project
pull = project.pull_requests.build issue_attributes: {title: 'test', body: 'testing'}
pull.issue.user, pull.issue.project = owner, pull.to_project
pull.to_ref, pull.from_ref, pull.from_project = to_ref, from_ref, project
@ -9,74 +9,81 @@ def create_pull to_ref, from_ref, owner, project = @project
end
describe Api::V1::PullRequestsController, type: :controller do
let(:user) { FactoryGirl.create(:user) }
let(:project) { FactoryGirl.create(:project_with_commit, owner: user) }
let(:issue) { FactoryGirl.create(:issue, project: project) }
let(:pull) { create_pull 'master', 'non_conflicts', user, project }
let(:another_project) { FactoryGirl.create(:project_with_commit) }
let(:another_pull) { create_pull 'master', 'non_conflicts', another_project.owner, another_project }
let(:hidden_project) { FactoryGirl.create(:project_with_commit, visibility: 'hidden') }
let(:hidden_pull) { create_pull 'master', 'non_conflicts', hidden_project.owner, hidden_project }
let(:own_hidden_project) { FactoryGirl.create(:project_with_commit, owner: user, visibility: 'hidden') }
let(:own_hidden_pull) { create_pull 'master', 'non_conflicts', user, own_hidden_project }
let(:membered_project) { FactoryGirl.create(:project_with_commit) }
let(:membered_pull) { create_pull 'master', 'non_conflicts', membered_project.owner, membered_project }
let(:create_params) { {
pull_request: {
title: 'title',
body: 'body',
from_ref: 'conflicts',
to_ref: 'master'
},
project_id: project.id,
format: :json
} }
let(:update_params) { {
pull_request: {
title: 'new title'
},
project_id: project.id,
id: pull.serial_id,
format: :json
} }
before do
stub_symlink_methods
@project = FactoryGirl.create(:project_with_commit)
@pull = create_pull 'master', 'non_conflicts', @project.owner
@another_project = FactoryGirl.create(:project_with_commit)
@another_pull = create_pull 'master', 'non_conflicts', @another_project.owner, @another_project
@hidden_project = FactoryGirl.create(:project_with_commit)
@hidden_project.update_column :visibility, 'hidden'
@hidden_pull = create_pull 'master', 'non_conflicts', @hidden_project.owner, @hidden_project
@own_hidden_project = FactoryGirl.create(:project_with_commit, owner: @project.owner)
@own_hidden_project.update_column :visibility, 'hidden'
@own_hidden_pull = create_pull 'master', 'non_conflicts', @own_hidden_project.owner, @own_hidden_project
@own_hidden_pull.issue.update_column :assignee_id, @project.owner.id
@membered_project = FactoryGirl.create(:project_with_commit)
@membered_pull = create_pull 'master', 'non_conflicts', @membered_project.owner, @membered_project
create_relation(@membered_project, @pull.user, 'reader')
@create_params = {pull_request: {title: 'title', body: 'body',
from_ref: 'conflicts', to_ref: 'master'},
project_id: @project.id, format: :json}
@update_params = {pull_request: {title: 'new title'},
project_id: @project.id, id: @pull.serial_id, format: :json}
@issue = FactoryGirl.create(:issue, project: @project)
own_hidden_pull.issue.update_column :assignee_id, user.id
create_relation(membered_project, user, 'reader')
end
context 'read and accessible abilities' do
context 'for user' do
before do
http_login(@project.owner)
http_login(user)
end
it 'can show pull request in own project' do
get :show, project_id: @project.id, id: @pull.serial_id, format: :json
get :show, project_id: project.id, id: pull.serial_id, format: :json
expect(response).to be_success
end
it 'should render right template for show action' do
get :show, project_id: @project.id, id: @pull.serial_id, format: :json
get :show, project_id: project.id, id: pull.serial_id, format: :json
expect(response).to render_template('api/v1/pull_requests/show')
end
it 'can show pull request in open project' do
get :show, project_id: @another_project.id, id: @another_pull.serial_id, format: :json
get :show, project_id: another_project.id, id: another_pull.serial_id, format: :json
expect(response).to be_success
end
it 'can show pull request in own hidden project' do
get :show, project_id: @own_hidden_project.id, id: @own_hidden_pull.serial_id, format: :json
get :show, project_id: own_hidden_project.id, id: own_hidden_pull.serial_id, format: :json
expect(response).to be_success
end
it 'cant show pull request in hidden project' do
get :show, project_id: @hidden_project.id, id: @hidden_pull.serial_id, format: :json
get :show, project_id: hidden_project.id, id: hidden_pull.serial_id, format: :json
expect(response.status).to eq 403
end
it 'should return three pull requests' do
pull && own_hidden_pull && membered_pull # init
get :all_index, filter: 'all', format: :json
expect(assigns[:pulls]).to include(@pull)
expect(assigns[:pulls]).to include(@own_hidden_pull)
expect(assigns[:pulls]).to include(@membered_pull)
expect(assigns[:pulls]).to include(pull)
expect(assigns[:pulls]).to include(own_hidden_pull)
expect(assigns[:pulls]).to include(membered_pull)
end
it 'should render right template for all index action' do
@ -85,8 +92,9 @@ describe Api::V1::PullRequestsController, type: :controller do
end
it 'should return only assigned pull request' do
own_hidden_pull # init
get :user_index, format: :json
expect(assigns[:pulls]).to include(@own_hidden_pull)
expect(assigns[:pulls]).to include(own_hidden_pull)
expect(assigns[:pulls].count).to eq 1
end
@ -97,41 +105,41 @@ describe Api::V1::PullRequestsController, type: :controller do
%w(commits files).each do |action|
it "can show pull request #{action} in own project" do
get action, project_id: @project.id, id: @pull.serial_id, format: :json
get action, project_id: project.id, id: pull.serial_id, format: :json
expect(response).to be_success
end
it "should render right template for commits action" do
get action, project_id: @project.id, id: @pull.serial_id, format: :json
get action, project_id: project.id, id: pull.serial_id, format: :json
expect(response).to render_template("api/v1/pull_requests/#{action}")
end
it "can't show pull request #{action} in hidden project" do
get action, project_id: @hidden_project.id, id: @hidden_pull.serial_id, format: :json
get action, project_id: hidden_project.id, id: hidden_pull.serial_id, format: :json
expect(response).to_not be_success
end
end
it 'should return 404' do
get :show, project_id: @project.id, id: 999999, format: :json
get :show, project_id: project.id, id: 999999, format: :json
expect(response.status).to eq 404
end
it 'should redirect to issue page' do
get :show, project_id: @project.id, id: @issue.serial_id, format: :json
expect(response).to redirect_to(api_v1_project_issue_path(@project.id, @issue.serial_id))
get :show, project_id: project.id, id: issue.serial_id, format: :json
expect(response).to redirect_to(api_v1_project_issue_path(project.id, issue.serial_id))
end
end
context 'for anonymous user' do
it 'can show pull request in open project', anonymous_access: true do
get :show, project_id: @project.id, id: @pull.serial_id, format: :json
get :show, project_id: project.id, id: pull.serial_id, format: :json
expect(response).to be_success
end
it 'cant show pull request in hidden project', anonymous_access: true do
@project.update_column :visibility, 'hidden'
get :show, project_id: @project.id, id: @pull.serial_id, format: :json
# project.update_column :visibility, 'hidden'
get :show, project_id: hidden_project.id, id: hidden_pull.serial_id, format: :json
expect(response.status).to eq 403
end
@ -142,17 +150,17 @@ describe Api::V1::PullRequestsController, type: :controller do
%w(commits files).each do |action|
it "can show pull request #{action} in project", anonymous_access: true do
get action, project_id: @project.id, id: @pull.serial_id, format: :json
get action, project_id: project.id, id: pull.serial_id, format: :json
expect(response).to be_success
end
it "should render right template for commits action", anonymous_access: true do
get action, project_id: @project.id, id: @pull.serial_id, format: :json
get action, project_id: project.id, id: pull.serial_id, format: :json
expect(response).to render_template("api/v1/pull_requests/#{action}")
end
it "can't show pull request #{action} in hidden project", anonymous_access: true do
get action, project_id: @hidden_project.id, id: @hidden_pull.serial_id, format: :json
get action, project_id: hidden_project.id, id: hidden_pull.serial_id, format: :json
expect(response).to_not be_success
end
end
@ -162,30 +170,30 @@ describe Api::V1::PullRequestsController, type: :controller do
context 'create accessibility' do
context 'for user' do
before(:each) do
http_login(@pull.user)
http_login(user)
end
it 'can create pull request in own project' do
expect do
post :create, @create_params
post :create, create_params
end.to change(PullRequest, :count).by(1)
end
it 'can create pull request in own hidden project' do
expect do
post :create, @create_params.merge(project_id: @own_hidden_project.id)
post :create, create_params.merge(project_id: own_hidden_project.id)
end.to change(PullRequest, :count).by(1)
end
it 'can create pull request in open project' do
expect do
post :create, @create_params.merge(project_id: @another_project.id)
post :create, create_params.merge(project_id: another_project.id)
end.to change(PullRequest, :count).by(1)
end
it 'cant create pull request in hidden project' do
expect do
post :create, @create_params.merge(project_id: @hidden_project.id)
post :create, create_params.merge(project_id: hidden_project.id)
end.to_not change(PullRequest, :count)
end
end
@ -193,13 +201,13 @@ describe Api::V1::PullRequestsController, type: :controller do
context 'for anonymous user' do
it 'cant create pull request in project', anonymous_access: true do
expect do
post :create, @create_params
post :create, create_params
end.to_not change(PullRequest, :count)
end
it 'cant create pull request in hidden project', anonymous_access: true do
expect do
post :create, @create_params.merge(project_id: @hidden_project.id)
post :create, create_params.merge(project_id: hidden_project.id)
end.to_not change(PullRequest, :count)
end
end
@ -208,110 +216,112 @@ describe Api::V1::PullRequestsController, type: :controller do
context 'update accessibility' do
context 'for user' do
before(:each) do
http_login(@project.owner)
http_login(project.owner)
end
it 'can update pull request in own project' do
put :update, @update_params
expect(@pull.reload.title).to eq 'new title'
put :update, update_params
expect(pull.reload.title).to eq 'new title'
end
it 'can update pull request in own hidden project' do
put :update, @update_params.merge(project_id: @own_hidden_project.id, id: @own_hidden_pull.serial_id)
expect(@own_hidden_pull.reload.title).to eq 'new title'
put :update, update_params.merge(project_id: own_hidden_project.id, id: own_hidden_pull.serial_id)
expect(own_hidden_pull.reload.title).to eq 'new title'
end
it 'cant update pull request in open project' do
put :update, @update_params.merge(project_id: @another_project.id, id: @another_pull.serial_id)
expect(@another_pull.reload.title).to_not eq 'new title'
put :update, update_params.merge(project_id: another_project.id, id: another_pull.serial_id)
expect(another_pull.reload.title).to_not eq 'new title'
end
it 'cant update pull request in hidden project' do
put :update, @update_params.merge(project_id: @hidden_project.id, id: @hidden_pull.serial_id)
expect(@hidden_pull.reload.title).to_not eq 'title'
put :update, update_params.merge(project_id: hidden_project.id, id: hidden_pull.serial_id)
expect(hidden_pull.reload.title).to_not eq 'title'
end
it 'can merge pull request in own project' do
put :merge, project_id: @project.id, id: @pull.serial_id, format: :json
expect(@pull.reload.status).to eq 'merged'
put :merge, project_id: project.id, id: pull.serial_id, format: :json
expect(pull.reload.status).to eq 'merged'
expect(response).to be_success
end
it 'can merge pull request in own hidden project' do
put :merge, project_id: @own_hidden_project.id, id: @own_hidden_pull.serial_id, format: :json
expect(@own_hidden_pull.reload.status).to eq 'merged'
put :merge, project_id: own_hidden_project.id, id: own_hidden_pull.serial_id, format: :json
expect(own_hidden_pull.reload.status).to eq 'merged'
expect(response).to be_success
end
it 'cant merge pull request in open project' do
put :merge, project_id: @another_project.id, id: @another_pull.serial_id, format: :json
expect(@another_pull.reload.status).to eq 'ready'
put :merge, project_id: another_project.id, id: another_pull.serial_id, format: :json
expect(another_pull.reload.status).to eq 'ready'
expect(response.status).to eq 403
end
it 'cant merge pull request in hidden project' do
put :merge, project_id: @hidden_project.id, id: @hidden_pull.serial_id, format: :json
expect(@hidden_pull.reload.status).to eq 'ready'
put :merge, project_id: hidden_project.id, id: hidden_pull.serial_id, format: :json
expect(hidden_pull.reload.status).to eq 'ready'
expect(response.status).to eq 403
end
end
context 'for anonymous user' do
it 'cant update pull request in project', anonymous_access: true do
put :update, @update_params
put :update, update_params
expect(response.status).to eq 401
end
it 'cant update pull request in hidden project', anonymous_access: true do
put :update, @update_params.merge(project_id: @hidden_project.id, id: @hidden_pull.serial_id)
put :update, update_params.merge(project_id: hidden_project.id, id: hidden_pull.serial_id)
expect(response.status).to eq 401
end
it 'cant merge pull request in open project' do
put :merge, project_id: @another_project.id, id: @another_pull.serial_id, format: :json
expect(@another_pull.reload.status).to eq 'ready'
put :merge, project_id: another_project.id, id: another_pull.serial_id, format: :json
expect(another_pull.reload.status).to eq 'ready'
expect(response.status).to eq 401
end
it 'cant merge pull request in hidden project' do
put :merge, project_id: @hidden_project.id, id: @hidden_pull.serial_id, format: :json
expect(@hidden_pull.reload.status).to eq 'ready'
put :merge, project_id: hidden_project.id, id: hidden_pull.serial_id, format: :json
expect(hidden_pull.reload.status).to eq 'ready'
expect(response.status).to eq 401
end
end
end
context 'send email messages' do
before do
@project_reader = FactoryGirl.create :user
create_relation(@project, @project_reader, 'reader')
@project_admin = FactoryGirl.create :user
create_relation(@project, @project_admin, 'admin')
@project_writer = FactoryGirl.create :user
create_relation(@project, @project_writer, 'writer')
let(:project_reader) { FactoryGirl.create :user }
let(:project_writer) { FactoryGirl.create :user }
let(:project_admin) { FactoryGirl.create :user }
http_login(@project_writer)
before do
create_relation(project, project_reader, 'reader')
create_relation(project, project_admin, 'admin')
create_relation(project, project_writer, 'writer')
http_login(project_writer)
pull # init
ActionMailer::Base.deliveries = []
end
it 'should send two email messages to all project members' do
post :create, @create_params
post :create, create_params
expect(ActionMailer::Base.deliveries.count).to eq 3 # project owner + reader + admin
end
it 'should send two email messages to admins and one to assignee' do
post :create, @create_params.deep_merge(pull_request: {assignee_id: @project_reader.id})
post :create, create_params.deep_merge(pull_request: {assignee_id: project_reader.id})
expect(ActionMailer::Base.deliveries.count).to eq 3
end
it 'should send email message to new assignee' do
http_login(@project_admin)
put :update, @update_params.deep_merge(pull_request: {assignee_id: @project_reader.id})
http_login(project_admin)
put :update, update_params.deep_merge(pull_request: {assignee_id: project_reader.id})
expect(ActionMailer::Base.deliveries.count).to eq 1
end
it 'should not duplicate email message' do
post :create, @create_params.deep_merge(pull_request: {assignee_id: @project_admin.id})
post :create, create_params.deep_merge(pull_request: {assignee_id: project_admin.id})
expect(ActionMailer::Base.deliveries.count).to eq 3 # send to all project members
expect(ActionMailer::Base.deliveries.map(&:to).uniq).to match_array(ActionMailer::Base.deliveries.map(&:to))
end

View File

@ -57,12 +57,10 @@ describe Projects::Git::TreesController, type: :controller do
expect { get :archive, @params.merge(format: 'tar.gz') }.to raise_error(ActionController::RoutingError)
end
it 'should not be able to injection code with format' do
expect { get :archive, @params.merge(format: "tar.gz master > /dev/null; echo 'I am hacker!';\#") }.to raise_error(ActionController::RoutingError)
end
it 'should not be able to injection code with treeish' do
expect { get :archive, @params.merge(treeish: "master > /dev/null; echo 'I am hacker!';\#") }.to raise_error(ActionController::RoutingError)
expect do
get :archive, @params.merge(format: 'tar.gz', treeish: "master > /dev/null; echo 'I am hacker!';\#")
end.to raise_error(ActionController::RoutingError)
end
it 'should be able to perform archive action' do

View File

@ -40,83 +40,83 @@ describe ApiDefender, type: :request do
context 'for anonymous user' do
it "should return the total limit" do
get_request
response.headers['X-RateLimit-Limit'].should == @rate_limit.to_s
expect(response.headers['X-RateLimit-Limit']).to eq @rate_limit.to_s
end
it "should return the correct limit usage for anonymous user" do
get_request
response.headers['X-RateLimit-Remaining'].should == (@rate_limit-1).to_s
expect(response.headers['X-RateLimit-Remaining']).to eq (@rate_limit-1).to_s
end
it "should return the correct limit usage for anonymous user after authenticated access" do
get_request @user
get_request
response.headers['X-RateLimit-Remaining'].should == (@rate_limit-2).to_s
expect(response.headers['X-RateLimit-Remaining']).to eq (@rate_limit-2).to_s
end
it "should forbidden anonymous user after exceeding limit rate" do
(@rate_limit+1).times {get_request}
response.status.should == 403
expect(response.status).to eq 403
end
end
else
it "should forbidden anonymous access" do
get_request
response.status.should == 401
expect(response.status).to eq 401
end
end
context 'for user' do
it "should return the correct limit usage for auth user" do
get_request @user
response.headers['X-RateLimit-Remaining'].should == (@rate_limit-1).to_s
expect(response.headers['X-RateLimit-Remaining']).to eq (@rate_limit-1).to_s
end
it "should allow auth by uname and password" do
(@rate_limit+1).times {get_request2}
get_request @user
response.headers['X-RateLimit-Remaining'].should == (@rate_limit-1).to_s
expect(response.headers['X-RateLimit-Remaining']).to eq (@rate_limit-1).to_s
end
it "should allow auth by email and password" do
(@rate_limit+1).times {get_request2}
get_request @user, false, true
response.headers['X-RateLimit-Remaining'].should == (@rate_limit-1).to_s
expect(response.headers['X-RateLimit-Remaining']).to eq (@rate_limit-1).to_s
end
it "should allow auth by token" do
(@rate_limit+1).times {get_request2}
get_request @user, true
response.headers['X-RateLimit-Remaining'].should == (@rate_limit-1).to_s
expect(response.headers['X-RateLimit-Remaining']).to eq (@rate_limit-1).to_s
end
it "should return the correct limit usage for auth user after other user" do
get_request2
get_request @user
response.headers['X-RateLimit-Remaining'].should == (@rate_limit-1).to_s
expect(response.headers['X-RateLimit-Remaining']).to eq (@rate_limit-1).to_s
end
it "should forbidden user after exceeding limit rate" do
(@rate_limit+1).times {get_request @user}
response.status.should == 403
expect(response.status).to eq 403
end
it "should not forbidden user after exceeding limit rate of the other user" do
(@rate_limit+1).times {get_request2}
get_request @user
response.status.should == 200
expect(response.status).to eq 200
end
end
context 'for system user' do
it "should not return the limit usage for system user" do
get_request @system_user, true
response.headers['X-RateLimit-Limit'].should_not == @rate_limit.to_s
expect(response.headers['X-RateLimit-Limit']).to_not eq @rate_limit.to_s
end
it "should not forbidden system user" do
(@rate_limit+1).times {get_request @system_user, true}
response.status.should == 200
expect(response.status).to eq 200
end
end
@ -124,12 +124,12 @@ describe ApiDefender, type: :request do
let(:remote_addr) { APP_CONFIG['allowed_addresses'].first }
it 'should not return the limit usage for allowed address' do
get "/api/v1/users/#{@user.id}.json", {}, {'REMOTE_ADDR' => remote_addr }
response.headers['X-RateLimit-Limit'].should_not == @rate_limit.to_s
expect(response.headers['X-RateLimit-Limit']).to_not eq @rate_limit.to_s
end
it 'should not forbidden allowed address' do
(@rate_limit+1).times { get "/api/v1/users/#{@user.id}.json", {}, {'REMOTE_ADDR' => remote_addr } }
response.status.should == 200
expect(response.status).to eq 200
end
end

View File

@ -20,6 +20,7 @@ describe BuildLists::DependentPackagesJob do
allow(Project).to receive_message_chain(:where, :to_a).and_return([project])
allow(Arch).to receive_message_chain(:where, :to_a).and_return([build_list.arch])
allow_any_instance_of(BuildList).to receive(:update_statistic)
allow_any_instance_of(BuildListPolicy).to receive(:show?).and_return(true)
allow_any_instance_of(ProjectPolicy).to receive(:write?).and_return(true)
allow_any_instance_of(BuildListPolicy).to receive(:create?).and_return(true)

View File

@ -3,100 +3,95 @@ require "spec_helper"
describe UserMailer do
context 'On Issue create' do
let(:project) { FactoryGirl.build(:project) }
let(:issue_user) { FactoryGirl.build(:user) }
let(:issue) { FactoryGirl.build(:issue, project: project, assignee: issue_user, user: issue_user) }
let(:email) { UserMailer.new_issue_notification(issue.id, issue_user.id).deliver! }
before do
stub_symlink_methods
@project = FactoryGirl.create(:project)
@issue_user = FactoryGirl.create(:user)
allow_any_instance_of(Project).to receive(:versions).and_return(%w(v1.0 v2.0))
@issue = FactoryGirl.create(:issue, project: @project, assignee: @issue_user, user: @issue_user)
@email = UserMailer.new_issue_notification(@issue, @issue_user).deliver!
allow(User).to receive(:find) { issue_user }
allow(Issue).to receive(:find) { issue }
end
it 'should have correct subject' do
@email.subject.should == "[#{@issue.project.name}] #{@issue.title} (##{@issue.serial_id})"
expect(email.subject).to eq "[#{issue.project.name}] #{issue.title} (##{issue.serial_id})"
end
it 'should render receiver email' do
@email.to.should == [@issue_user.email]
expect(email.to).to eq [issue_user.email]
end
it 'should render the sender email' do
@email.from.should == [APP_CONFIG['do-not-reply-email']]
expect(email.from).to eq [APP_CONFIG['do-not-reply-email']]
end
it 'should assign issue project name' do
@email.body.encoded.should match(@issue.project.name)
expect(email.body.encoded).to match(issue.project.name)
end
it 'should assign issue body' do
@email.body.encoded.should match(@issue.body)
expect(email.body.encoded).to match(issue.body)
end
end
context 'On Issue assign' do
before(:each) do
let(:project) { FactoryGirl.build(:project) }
let(:issue_user) { FactoryGirl.build(:user) }
let(:user) { FactoryGirl.build(:user) }
let(:issue) { FactoryGirl.build(:issue, project: project, assignee: issue_user, user: issue_user) }
let(:email) { UserMailer.issue_assign_notification(issue, user).deliver! }
before do
stub_symlink_methods
@project = FactoryGirl.create(:project)
@issue_user = FactoryGirl.create(:user)
@user = FactoryGirl.create(:user)
allow_any_instance_of(Project).to receive(:versions).and_return(%w(v1.0 v2.0))
@issue = FactoryGirl.create(:issue, project_id: @project.id, assignee_id: @issue_user.id, user: @issue_user)
@email = UserMailer.issue_assign_notification(@issue, @user).deliver!
end
it 'should have correct subject' do
@email.subject.should == "Re: [#{@issue.project.name}] #{@issue.title} (##{@issue.serial_id})"
expect(email.subject).to eq "Re: [#{issue.project.name}] #{issue.title} (##{issue.serial_id})"
end
it 'should render receiver email' do
@email.to.should == [@user.email]
expect(email.to).to eq [user.email]
end
it 'should render the sender email' do
@email.from.should == [APP_CONFIG['do-not-reply-email']]
expect(email.from).to eq [APP_CONFIG['do-not-reply-email']]
end
it 'should assign issue title' do
@email.body.encoded.should match(@issue.title)
expect(email.body.encoded).to match(issue.title)
end
end
context 'On Comment create' do
let(:project) { FactoryGirl.build(:project) }
let(:issue_user) { FactoryGirl.build(:user) }
let(:user) { FactoryGirl.build(:user) }
let(:issue) { FactoryGirl.build(:issue, project: project, assignee: issue_user, user: issue_user) }
let(:comment) { FactoryGirl.build(:comment, commentable: issue, user: user, project: project) }
let(:email) { UserMailer.new_comment_notification(comment, issue_user.id).deliver! }
before do
stub_symlink_methods
@project = FactoryGirl.create(:project)
@issue_user = FactoryGirl.create(:user)
@user = FactoryGirl.create(:user)
allow_any_instance_of(Project).to receive(:versions).and_return(%w(v1.0 v2.0))
@issue = FactoryGirl.create(:issue, project: @project, assignee: @issue_user, user: @issue_user)
@comment = FactoryGirl.create(:comment, commentable: @issue, user: @user, project: @project)
@email = UserMailer.new_comment_notification(@comment, @issue_user.id).deliver!
allow(User).to receive(:find) { issue_user }
end
it 'should have correct subject' do
@email.subject.should == "Re: [#{@issue.project.name}] #{@issue.title} (##{@issue.serial_id})"
expect(email.subject).to eq "Re: [#{issue.project.name}] #{issue.title} (##{issue.serial_id})"
end
it 'should render receiver email' do
@email.to.should == [@issue_user.email]
expect(email.to).to eq [issue_user.email]
end
it 'should render the sender email' do
@email.from.should == [APP_CONFIG['do-not-reply-email']]
expect(email.from).to eq [APP_CONFIG['do-not-reply-email']]
end
it 'should assign comment body' do
@email.body.encoded.should match(@comment.body)
expect(email.body.encoded).to match(comment.body)
end
end
end

View File

@ -4,17 +4,18 @@ describe BuildList::Package do
before { stub_symlink_methods }
it 'is valid' do
FactoryGirl.create(:build_list_package).should be_persisted
expect(FactoryGirl.create(:build_list_package)).to be_persisted
end
context '#set_epoch' do
describe '#set_epoch' do
let(:package) { FactoryGirl.build(:build_list_package) }
['', '(none)'].each do |epoch|
it "ensures that epoch is set to nil when epoch is '#{epoch}'" do
package.epoch = epoch
package.save
package.epoch.should be_nil
expect(package.epoch).to be_nil
end
end
@ -22,9 +23,16 @@ describe BuildList::Package do
it "ensures that valid epoch has been setted" do
package.epoch = '55'
package.save
package.epoch.should == 55
expect(package.epoch).to eq 55
end
end
describe '#dependent_packages=' do
it 'sets a packages' do
package = FactoryGirl.build(:build_list_package, dependent_packages: 'x y z')
expect(package).to be_valid
expect(package.dependent_packages).to eq %w(x y z)
end
end
end

View File

@ -8,14 +8,17 @@ then
elif [ $SPEC_GROUP = 'platform_controllers' ]
then
$rspec spec/controllers/platforms/
elif [ $SPEC_GROUP = 'api-slow' ]
then
$rspec spec/controllers/api/v1/ --pattern build_lists*
elif [ $SPEC_GROUP = 'api' ]
then
$rspec spec/controllers/api/
$rspec spec/controllers/api/v1/ --exclude-pattern build_lists*
elif [ $SPEC_GROUP = 'models' ]
then
$rspec spec/models/ spec/jobs/
elif [ $SPEC_GROUP = 'others' ]
then
# $rspec spec/helpers/ spec/integration/ spec/lib/ spec/mailers/ spec/mailers/ spec/routing/
$rspec spec/integration/ spec/services/ spec/mailers/ spec/mailers/ spec/routing/
# $rspec spec/helpers/ spec/integration/ spec/lib/ spec/mailers/ spec/mailers/ spec/routing/
$rspec spec/integration/ spec/services/ spec/mailers/ spec/mailers/ spec/routing/
fi