diff options
162 files changed, 1357 insertions, 941 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4a9574be053..5524c9a7fcb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,35 +9,57 @@ before_script: - touch log/test.log - bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}" - bundle exec rake db:create RAILS_ENV=test -Rspec: + +spec:feature: + script: + - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature + tags: + - ruby + - mysql + +spec:api: + script: + - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:api + tags: + - ruby + - mysql + +spec:other: + script: + - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:other + tags: + - ruby + - mysql + +spinach:project: script: - - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec + - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project tags: - ruby - mysql -Spinach: +spinach:other: script: - - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach + - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other tags: - ruby - mysql -Jasmine: +jasmine:ci: script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake jasmine:ci tags: - ruby - mysql -Rubocop: +rubocop: script: - bundle exec rubocop tags: - ruby - mysql -Brakeman: +brakeman: script: - bundle exec rake brakeman tags: diff --git a/.rubocop.yml b/.rubocop.yml index 0cc729d3b08..ea4d365761e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -993,8 +993,6 @@ Rails/Validation: AllCops: RunRailsCops: true Exclude: - - 'spec/**/*' - - 'features/**/*' - 'vendor/**/*' - 'db/**/*' - 'tmp/**/*' diff --git a/CHANGELOG b/CHANGELOG index 53258e7fd1a..f353a444fba 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ Please view this file on the master branch, on stable branches it's out of date. v 7.13.0 (unreleased) + - Fix invalid timestamps in RSS feeds (Rowan Wookey) + - Fix error when deleting a user who has projects (Stan Hu) + - Fix downloading of patches on public merge requests when user logged out (Stan Hu) - Update maintenance documentation to explain no need to recompile asssets for omnibus installations (Stan Hu) - Support commenting on diffs in side-by-side mode (Stan Hu) - Fix JavaScript error when clicking on the comment button on a diff line that has a comment already (Stan Hu) @@ -8,8 +11,11 @@ v 7.13.0 (unreleased) - Rename "Design" profile settings page to "Preferences". - Allow users to customize their default Dashboard page. - Update ssl_ciphers in Nginx example to remove DHE settings. This will deny forward secrecy for Android 2.3.7, Java 6 and OpenSSL 0.9.8 + - Admin can edit and remove user identities - Convert CRLF newlines to LF when committing using the web editor. - API request /projects/:project_id/merge_requests?state=closed will return only closed merge requests without merged one. If you need ones that were merged - use state=merged. + - Allow Administrators to filter the user list by those with or without Two-factor Authentication enabled. + - Show a user's Two-factor Authentication status in the administration area. v 7.12.0 (unreleased) - Fix Error 500 when one user attempts to access a personal, internal snippet (Stan Hu) diff --git a/README.md b/README.md index 85ea5c876af..52a483aa532 100644 --- a/README.md +++ b/README.md @@ -101,4 +101,4 @@ Please see [Getting help for GitLab](https://about.gitlab.com/getting-help/) on ## Is it awesome? Thanks for [asking this question](https://twitter.com/supersloth/status/489462789384056832) Joshua. -[These people](https://twitter.com/gitlab/favorites) seem to like it.
\ No newline at end of file +[These people](https://twitter.com/gitlab/favorites) seem to like it. @@ -1 +1 @@ -7.12.0.pre
\ No newline at end of file +7.13.0.pre diff --git a/app/assets/stylesheets/generic/header.scss b/app/assets/stylesheets/generic/header.scss index 26eb7ab1a12..8faae893a51 100644 --- a/app/assets/stylesheets/generic/header.scss +++ b/app/assets/stylesheets/generic/header.scss @@ -3,6 +3,8 @@ * */ header { + transition-duration: .3s; + &.navbar-empty { background: #FFF; border-bottom: 1px solid #EEE; @@ -67,28 +69,34 @@ header { float: left; height: $header-height; width: $sidebar_width; + transition-duration: .3s; a { float: left; height: $header-height; width: 100%; padding: ($header-height - 36 ) / 2 8px; - - h3 { - width: 158px; - float: left; - margin: 0; - margin-left: 14px; - font-size: 18px; - line-height: $header-height - 14; - font-weight: normal; - } + overflow: hidden; img { width: 36px; height: 36px; float: left; } + + .gitlab-text-container { + width: 230px; + + h3 { + width: 158px; + float: left; + margin: 0; + margin-left: 14px; + font-size: 18px; + line-height: $header-height - 14; + font-weight: normal; + } + } } &:hover { diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 65e06e14c73..add0d1b04ad 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -4,12 +4,14 @@ top: 0; left: 0; height: 100%; + transition-duration: .3s; } } .sidebar-wrapper { z-index: 99; background: $background-color; + transition-duration: .3s; } .content-wrapper { @@ -19,8 +21,10 @@ } .nav-sidebar { + transition-duration: .3s; margin: 0; list-style: none; + overflow: hidden; &.navbar-collapse { padding: 0px !important; @@ -35,9 +39,6 @@ } .nav-sidebar li { -} - -.nav-sidebar li { &.separate-item { padding-top: 10px; margin-top: 10px; @@ -48,7 +49,7 @@ display: block; text-decoration: none; padding: 8px 15px; - font-size: 13px; + font-size: 14px; line-height: 20px; padding-left: 16px; @@ -79,6 +80,7 @@ @mixin expanded-sidebar { padding-left: $sidebar_width; + transition-duration: .3s; .sidebar-wrapper { width: $sidebar_width; @@ -89,6 +91,10 @@ top: $header-height; width: $sidebar_width; } + + .nav-sidebar li a{ + width: 230px; + } } .content-wrapper { @@ -98,6 +104,7 @@ @mixin folded-sidebar { padding-left: 50px; + transition-duration: .3s; .sidebar-wrapper { width: $sidebar_collapsed_width; @@ -109,10 +116,10 @@ width: $sidebar_collapsed_width; li a { - padding-left: 18px; font-size: 14px; padding: 8px 15px; - text-align: center; + text-align: left; + padding-left: 16px; & > span { @@ -144,6 +151,7 @@ height: 28px; text-align: center; line-height: 28px; + transition-duration: .3s; } .collapse-nav a:hover { @@ -180,8 +188,10 @@ bottom: 0; width: 100%; padding: 10px; + overflow: hidden; .username { margin-top: 5px; + width: 230px; } } diff --git a/app/controllers/admin/identities_controller.rb b/app/controllers/admin/identities_controller.rb new file mode 100644 index 00000000000..d28614731f9 --- /dev/null +++ b/app/controllers/admin/identities_controller.rb @@ -0,0 +1,41 @@ +class Admin::IdentitiesController < Admin::ApplicationController + before_action :user + before_action :identity, except: :index + + def index + @identities = @user.identities + end + + def edit + end + + def update + if @identity.update_attributes(identity_params) + redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully updated.' + else + render :edit + end + end + + def destroy + if @identity.destroy + redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully removed.' + else + redirect_to admin_user_identities_path(@user), alert: 'Failed to remove user identity.' + end + end + + protected + + def user + @user ||= User.find_by!(username: params[:user_id]) + end + + def identity + @identity ||= user.identities.find(params[:id]) + end + + def identity_params + params.require(:identity).permit(:provider, :extern_uid) + end +end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 06d6d61e907..ec29c320654 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -1,5 +1,5 @@ class Admin::UsersController < Admin::ApplicationController - before_action :user, only: [:show, :edit, :update, :destroy] + before_action :user, except: [:index, :new, :create] def index @users = User.order_name_asc.filter(params[:filter]) @@ -9,8 +9,17 @@ class Admin::UsersController < Admin::ApplicationController end def show + end + + def projects @personal_projects = user.personal_projects @joined_projects = user.projects.joined(@user) + end + + def groups + end + + def keys @keys = user.keys end @@ -86,7 +95,7 @@ class Admin::UsersController < Admin::ApplicationController end def destroy - DeleteUserService.new.execute(user) + DeleteUserService.new(current_user).execute(user) respond_to do |format| format.html { redirect_to admin_users_path } diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 6ccc7934f2f..3b3dc86cb68 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -6,7 +6,7 @@ class RegistrationsController < Devise::RegistrationsController end def destroy - DeleteUserService.new.execute(current_user) + DeleteUserService.new(current_user).execute(current_user) respond_to do |format| format.html { redirect_to new_user_session_path, notice: "Account successfully removed." } diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index d440da050e1..8428281f8f6 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -189,7 +189,7 @@ module EventsHelper xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" xml.link href: event_link xml.title truncate(event_title, length: 80) - xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%S%Z") + xml.updated event.created_at.xmlschema xml.media :thumbnail, width: "40", height: "40", url: avatar_icon(event.author_email) xml.author do |author| xml.name event.author_name diff --git a/app/models/identity.rb b/app/models/identity.rb index 756d19adec7..ad60154be71 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -14,6 +14,7 @@ class Identity < ActiveRecord::Base include Sortable belongs_to :user + validates :provider, presence: true validates :extern_uid, allow_blank: true, uniqueness: { scope: :provider } validates :user_id, uniqueness: { scope: :provider } end diff --git a/app/models/user.rb b/app/models/user.rb index 29f43051464..22cd15bf971 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -50,12 +50,12 @@ # bitbucket_access_token :string(255) # bitbucket_access_token_secret :string(255) # location :string(255) -# public_email :string(255) default(""), not null # encrypted_otp_secret :string(255) # encrypted_otp_secret_iv :string(255) # encrypted_otp_secret_salt :string(255) -# otp_required_for_login :boolean +# otp_required_for_login :boolean default(FALSE), not null # otp_backup_codes :text +# public_email :string(255) default(""), not null # dashboard :integer default(0) # @@ -80,6 +80,7 @@ class User < ActiveRecord::Base devise :two_factor_authenticatable, otp_secret_encryption_key: File.read(Rails.root.join('.secret')).chomp + alias_attribute :two_factor_enabled, :otp_required_for_login devise :two_factor_backupable, otp_number_of_backup_codes: 10 serialize :otp_backup_codes, JSON @@ -193,11 +194,13 @@ class User < ActiveRecord::Base mount_uploader :avatar, AvatarUploader # Scopes - scope :admins, -> { where(admin: true) } + scope :admins, -> { where(admin: true) } scope :blocked, -> { with_state(:blocked) } scope :active, -> { with_state(:active) } scope :not_in_project, ->(project) { project.users.present? ? where("id not in (:ids)", ids: project.users.map(&:id) ) : all } scope :without_projects, -> { where('id NOT IN (SELECT DISTINCT(user_id) FROM members)') } + scope :with_two_factor, -> { where(two_factor_enabled: true) } + scope :without_two_factor, -> { where(two_factor_enabled: false) } # # Class methods @@ -247,9 +250,16 @@ class User < ActiveRecord::Base def filter(filter_name) case filter_name - when "admins"; self.admins - when "blocked"; self.blocked - when "wop"; self.without_projects + when 'admins' + self.admins + when 'blocked' + self.blocked + when 'two_factor_disabled' + self.without_two_factor + when 'two_factor_enabled' + self.with_two_factor + when 'wop' + self.without_projects else self.active end @@ -316,18 +326,6 @@ class User < ActiveRecord::Base @reset_token end - # Check if the user has enabled Two-factor Authentication - def two_factor_enabled? - otp_required_for_login - end - - # Set whether or not Two-factor Authentication is enabled for the current user - # - # setting - Boolean - def two_factor_enabled=(setting) - self.otp_required_for_login = setting - end - def namespace_uniq namespace_name = self.username existing_namespace = Namespace.by_path(namespace_name) diff --git a/app/services/delete_user_service.rb b/app/services/delete_user_service.rb index 9017a63af3b..e622fd5ea5d 100644 --- a/app/services/delete_user_service.rb +++ b/app/services/delete_user_service.rb @@ -1,4 +1,10 @@ class DeleteUserService + attr_accessor :current_user + + def initialize(current_user) + @current_user = current_user + end + def execute(user) if user.solo_owned_groups.present? user.errors[:base] << 'You must transfer ownership or delete groups before you can remove user' diff --git a/app/views/admin/identities/_form.html.haml b/app/views/admin/identities/_form.html.haml new file mode 100644 index 00000000000..b405aa6e8e3 --- /dev/null +++ b/app/views/admin/identities/_form.html.haml @@ -0,0 +1,19 @@ += form_for [:admin, @user, @identity], html: { class: 'form-horizontal fieldset-form' } do |f| + - if @identity.errors.any? + #error_explanation + .alert.alert-danger + - @identity.errors.full_messages.each do |msg| + %p= msg + + .form-group + = f.label :provider, class: 'control-label' + .col-sm-10 + = f.select :provider, Gitlab::OAuth::Provider.names, { allow_blank: false }, class: 'form-control' + .form-group + = f.label :extern_uid, "Identifier", class: 'control-label' + .col-sm-10 + = f.text_field :extern_uid, required: true, class: 'form-control', required: true + + .form-actions + = f.submit 'Save changes', class: "btn btn-save" + diff --git a/app/views/admin/identities/_identity.html.haml b/app/views/admin/identities/_identity.html.haml new file mode 100644 index 00000000000..671c4fbc677 --- /dev/null +++ b/app/views/admin/identities/_identity.html.haml @@ -0,0 +1,12 @@ +%tr + %td + = identity.provider + %td + = identity.extern_uid + %td + = link_to edit_admin_user_identity_path(@user, identity), class: 'btn btn-xs btn-grouped' do + Edit + = link_to [:admin, @user, identity], method: :delete, + class: 'btn btn-xs btn-danger', + data: { confirm: "Are you sure you want to remove this identity?" } do + Delete diff --git a/app/views/admin/identities/edit.html.haml b/app/views/admin/identities/edit.html.haml new file mode 100644 index 00000000000..515d46b0f29 --- /dev/null +++ b/app/views/admin/identities/edit.html.haml @@ -0,0 +1,6 @@ +- page_title "Edit", @identity.provider, "Identities", @user.name, "Users" +%h3.page-title + Edit identity for #{@user.name} +%hr + += render 'form' diff --git a/app/views/admin/identities/index.html.haml b/app/views/admin/identities/index.html.haml new file mode 100644 index 00000000000..ae57e3adc4d --- /dev/null +++ b/app/views/admin/identities/index.html.haml @@ -0,0 +1,13 @@ +- page_title "Identities", @user.name, "Users" += render 'admin/users/head' + +- if @identities.present? + %table.table + %thead + %tr + %th Provider + %th Identifier + %th + = render @identities +- else + %h4 This user has no identities diff --git a/app/views/admin/users/_head.html.haml b/app/views/admin/users/_head.html.haml new file mode 100644 index 00000000000..9d5e934c8ba --- /dev/null +++ b/app/views/admin/users/_head.html.haml @@ -0,0 +1,23 @@ +%h3.page-title + = @user.name + - if @user.blocked? + %span.cred (Blocked) + - if @user.admin + %span.cred (Admin) + + .pull-right + = link_to edit_admin_user_path(@user), class: "btn btn-grouped" do + %i.fa.fa-pencil-square-o + Edit +%hr +%ul.nav.nav-tabs + = nav_link(path: 'users#show') do + = link_to "Account", admin_user_path(@user) + = nav_link(path: 'users#groups') do + = link_to "Groups", groups_admin_user_path(@user) + = nav_link(path: 'users#projects') do + = link_to "Projects", projects_admin_user_path(@user) + = nav_link(path: 'users#keys') do + = link_to "SSH keys", keys_admin_user_path(@user) + = nav_link(controller: :identities) do + = link_to "Identities", admin_user_identities_path(@user) diff --git a/app/views/admin/users/groups.html.haml b/app/views/admin/users/groups.html.haml new file mode 100644 index 00000000000..dbecb7bbfd6 --- /dev/null +++ b/app/views/admin/users/groups.html.haml @@ -0,0 +1,19 @@ +- page_title "Groups", @user.name, "Users" += render 'admin/users/head' + +- if @user.group_members.present? + .panel.panel-default + .panel-heading Groups: + %ul.well-list + - @user.group_members.each do |group_member| + - group = group_member.group + %li.group_member + %span{class: ("list-item-name" unless group_member.owner?)} + %strong= link_to group.name, admin_group_path(group) + .pull-right + %span.light= group_member.human_access + - unless group_member.owner? + = link_to group_group_member_path(group, group_member), data: { confirm: remove_user_from_group_message(group, group_member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do + %i.fa.fa-times.fa-inverse +- else + .nothing-here-block This user has no groups. diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 45dee86b017..9c1bec7c84d 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -13,6 +13,14 @@ = link_to admin_users_path(filter: "admins") do Admins %small.pull-right= User.admins.count + %li.filter-two-factor-enabled{class: "#{'active' if params[:filter] == 'two_factor_enabled'}"} + = link_to admin_users_path(filter: 'two_factor_enabled') do + 2FA Enabled + %small.pull-right= User.with_two_factor.count + %li.filter-two-factor-disabled{class: "#{'active' if params[:filter] == 'two_factor_disabled'}"} + = link_to admin_users_path(filter: 'two_factor_disabled') do + 2FA Disabled + %small.pull-right= User.without_two_factor.count %li{class: "#{'active' if params[:filter] == "blocked"}"} = link_to admin_users_path(filter: "blocked") do Blocked diff --git a/app/views/admin/users/keys.html.haml b/app/views/admin/users/keys.html.haml new file mode 100644 index 00000000000..07110717082 --- /dev/null +++ b/app/views/admin/users/keys.html.haml @@ -0,0 +1,3 @@ +- page_title "Keys", @user.name, "Users" += render 'admin/users/head' += render 'profiles/keys/key_table', admin: true diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml new file mode 100644 index 00000000000..0d7a1a25a80 --- /dev/null +++ b/app/views/admin/users/projects.html.haml @@ -0,0 +1,43 @@ +- page_title "Projects", @user.name, "Users" += render 'admin/users/head' + +- if @user.groups.any? + .panel.panel-default + .panel-heading Group projects + %ul.well-list + - @user.groups.each do |group| + %li + %strong= group.name + – access to + #{pluralize(group.projects.count, 'project')} + +.row + .col-md-6 + - if @personal_projects.present? + = render 'users/projects', projects: @personal_projects + - else + .nothing-here-block This user has no personal projects. + + + .col-md-6 + .panel.panel-default + .panel-heading Joined projects (#{@joined_projects.count}) + %ul.well-list + - @joined_projects.sort_by(&:name_with_namespace).each do |project| + - member = project.team.find_member(@user.id) + %li.project_member + .list-item-name + = link_to admin_namespace_project_path(project.namespace, project), class: dom_class(project) do + = project.name_with_namespace + + - if member + .pull-right + - if member.owner? + %span.light Owner + - else + %span.light= member.human_access + + - if member.respond_to? :project + = link_to namespace_project_project_member_path(project.namespace, project, member), data: { confirm: remove_from_project_team_message(project, member) }, remote: true, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove user from project' do + %i.fa.fa-times + diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 48cd22fc34b..2662b3569ec 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -1,240 +1,154 @@ - page_title @user.name, "Users" -%h3.page-title - User: - = @user.name - - if @user.blocked? - %span.cred (Blocked) - - if @user.admin - %span.cred (Admin) - - .pull-right - = link_to edit_admin_user_path(@user), class: "btn btn-grouped" do - %i.fa.fa-pencil-square-o - Edit -%hr -%ul.nav.nav-tabs - %li.active - %a{"data-toggle" => "tab", href: "#account"} Account - %li - %a{"data-toggle" => "tab", href: "#profile"} Profile - %li - %a{"data-toggle" => "tab", href: "#groups"} Groups - %li - %a{"data-toggle" => "tab", href: "#projects"} Projects - %li - %a{"data-toggle" => "tab", href: "#ssh-keys"} SSH keys - -.tab-content - #account.tab-pane.active - .row - .col-md-6 - .panel.panel-default - .panel-heading - Account: - %ul.well-list - %li - %span.light Name: - %strong= @user.name - %li - %span.light Username: - %strong - = @user.username - %li - %span.light Email: - %strong - = mail_to @user.email - - @user.emails.each do |email| - %li - %span.light Secondary email: - %strong= email.email - = link_to remove_email_admin_user_path(@user, email), data: { confirm: "Are you sure you want to remove #{email.email}?" }, method: :delete, class: "btn-xs btn btn-remove pull-right", title: 'Remove secondary email', id: "remove_email_#{email.id}" do - %i.fa.fa-times - - %li.two-factor-status - %span.light Two-factor Authentication: - %strong{class: @user.two_factor_enabled? ? 'cgreen' : 'cred'} - - if @user.two_factor_enabled? - Enabled - - else - Disabled - - %li - %span.light Can create groups: - %strong - = @user.can_create_group ? "Yes" : "No" - %li - %span.light Personal projects limit: - %strong - = @user.projects_limit - %li - %span.light Member since: - %strong - = @user.created_at.stamp("Nov 12, 2031") - - if @user.confirmed_at - %li - %span.light Confirmed at: - %strong - = @user.confirmed_at.stamp("Nov 12, 2031") += render 'admin/users/head' + +.row + .col-md-6 + .panel.panel-default + .panel-heading + = @user.name + %ul.well-list + %li + = image_tag avatar_icon(@user.email, 60), class: "avatar s60" + %li + %span.light Profile page: + %strong + = link_to user_path(@user) do + = @user.username + = render 'users/profile', user: @user + + .panel.panel-default + .panel-heading + Account: + %ul.well-list + %li + %span.light Name: + %strong= @user.name + %li + %span.light Username: + %strong + = @user.username + %li + %span.light Email: + %strong + = mail_to @user.email + - @user.emails.each do |email| + %li + %span.light Secondary email: + %strong= email.email + = link_to remove_email_admin_user_path(@user, email), data: { confirm: "Are you sure you want to remove #{email.email}?" }, method: :delete, class: "btn-xs btn btn-remove pull-right", title: 'Remove secondary email', id: "remove_email_#{email.id}" do + %i.fa.fa-times + + %li.two-factor-status + %span.light Two-factor Authentication: + %strong{class: @user.two_factor_enabled? ? 'cgreen' : 'cred'} + - if @user.two_factor_enabled? + Enabled - else - %li - %span.light Confirmed: - %strong.cred - No - - %li - %span.light Current sign-in at: - %strong - - if @user.current_sign_in_at - = @user.current_sign_in_at.stamp("Nov 12, 2031") - - else - never - - %li - %span.light Last sign-in at: - %strong - - if @user.last_sign_in_at - = @user.last_sign_in_at.stamp("Nov 12, 2031") - - else - never - - %li - %span.light Sign-in count: - %strong - = @user.sign_in_count - - - if @user.ldap_user? - %li - %span.light LDAP uid: - %strong - = @user.ldap_identity.extern_uid - - - if @user.created_by - %li - %span.light Created by: - %strong - = link_to @user.created_by.name, [:admin, @user.created_by] - - .col-md-6 - - unless @user == current_user - - if @user.blocked? - .panel.panel-info - .panel-heading - This user is blocked - .panel-body - %p Blocking user has the following effects: - %ul - %li User will not be able to login - %li User will not be able to access git repositories - %li Personal projects will be left - %li Owned groups will be left - %br - = link_to 'Unblock user', unblock_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } - - else - .panel.panel-warning - .panel-heading - Block this user - .panel-body - %p Blocking user has the following effects: - %ul - %li User will not be able to login - %li User will not be able to access git repositories - %li User will be removed from joined projects and groups - %li Personal projects will be left - %li Owned groups will be left - %br - = link_to 'Block user', block_admin_user_path(@user), data: { confirm: 'USER WILL BE BLOCKED! Are you sure?' }, method: :put, class: "btn btn-warning" - - .panel.panel-danger - .panel-heading - Remove user - .panel-body - - if @user.can_be_removed? - %p Deleting a user has the following effects: - %ul - %li All user content like authored issues, snippets, comments will be removed - - rp = @user.personal_projects.count - - unless rp.zero? - %li #{pluralize rp, 'personal project'} will be removed and cannot be restored - %br - = link_to 'Remove user', [:admin, @user], data: { confirm: "USER #{@user.name} WILL BE REMOVED! Are you sure?" }, method: :delete, class: "btn btn-remove" - - else - - if @user.solo_owned_groups.present? - %p - This user is currently an owner in these groups: - %strong #{@user.solo_owned_groups.map(&:name).join(', ')} - %p - You must transfer ownership or delete these groups before you can delete this user. + Disabled + + %li + %span.light Can create groups: + %strong + = @user.can_create_group ? "Yes" : "No" + %li + %span.light Personal projects limit: + %strong + = @user.projects_limit + %li + %span.light Member since: + %strong + = @user.created_at.stamp("Nov 12, 2031") + - if @user.confirmed_at + %li + %span.light Confirmed at: + %strong + = @user.confirmed_at.stamp("Nov 12, 2031") + - else + %li + %span.light Confirmed: + %strong.cred + No + + %li + %span.light Current sign-in at: + %strong + - if @user.current_sign_in_at + = @user.current_sign_in_at.stamp("Nov 12, 2031") + - else + never - #profile.tab-pane - .row - .col-md-6 - .panel.panel-default + %li + %span.light Last sign-in at: + %strong + - if @user.last_sign_in_at + = @user.last_sign_in_at.stamp("Nov 12, 2031") + - else + never + + %li + %span.light Sign-in count: + %strong + = @user.sign_in_count + + - if @user.ldap_user? + %li + %span.light LDAP uid: + %strong + = @user.ldap_identity.extern_uid + + - if @user.created_by + %li + %span.light Created by: + %strong + = link_to @user.created_by.name, [:admin, @user.created_by] + + .col-md-6 + - unless @user == current_user + - if @user.blocked? + .panel.panel-info .panel-heading - = @user.name - %ul.well-list - %li - = image_tag avatar_icon(@user.email, 60), class: "avatar s60" - %li - %span.light Profile page: - %strong - = link_to user_path(@user) do - = @user.username - .col-md-6 - = render 'users/profile', user: @user - - #groups.tab-pane - - if @user.group_members.present? - .panel.panel-default - .panel-heading Groups: - %ul.well-list - - @user.group_members.each do |group_member| - - group = group_member.group - %li.group_member - %span{class: ("list-item-name" unless group_member.owner?)} - %strong= link_to group.name, admin_group_path(group) - .pull-right - %span.light= group_member.human_access - - unless group_member.owner? - = link_to group_group_member_path(group, group_member), data: { confirm: remove_user_from_group_message(group, group_member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do - %i.fa.fa-times.fa-inverse - - else - .nothing-here-block This user has no groups. - - #projects.tab-pane - - if @user.groups.any? - .panel.panel-default - .panel-heading Group projects - %ul.well-list - - @user.groups.each do |group| - %li - %strong= group.name - – access to - #{pluralize(group.projects.count, 'project')} - - .row - .col-md-6 - = render 'users/projects', projects: @personal_projects - - .col-md-6 - .panel.panel-default - .panel-heading Joined projects (#{@joined_projects.count}) - %ul.well-list - - @joined_projects.sort_by(&:name_with_namespace).each do |project| - - member = project.team.find_member(@user.id) - %li.project_member - .list-item-name - = link_to admin_namespace_project_path(project.namespace, project), class: dom_class(project) do - = project.name_with_namespace - - - if member - .pull-right - - if member.owner? - %span.light Owner - - else - %span.light= member.human_access - - - if member.respond_to? :project - = link_to namespace_project_project_member_path(project.namespace, project, member), data: { confirm: remove_from_project_team_message(project, member) }, remote: true, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove user from project' do - %i.fa.fa-times - #ssh-keys.tab-pane - = render 'profiles/keys/key_table', admin: true + This user is blocked + .panel-body + %p Blocking user has the following effects: + %ul + %li User will not be able to login + %li User will not be able to access git repositories + %li Personal projects will be left + %li Owned groups will be left + %br + = link_to 'Unblock user', unblock_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } + - else + .panel.panel-warning + .panel-heading + Block this user + .panel-body + %p Blocking user has the following effects: + %ul + %li User will not be able to login + %li User will not be able to access git repositories + %li User will be removed from joined projects and groups + %li Personal projects will be left + %li Owned groups will be left + %br + = link_to 'Block user', block_admin_user_path(@user), data: { confirm: 'USER WILL BE BLOCKED! Are you sure?' }, method: :put, class: "btn btn-warning" + + .panel.panel-danger + .panel-heading + Remove user + .panel-body + - if @user.can_be_removed? + %p Deleting a user has the following effects: + %ul + %li All user content like authored issues, snippets, comments will be removed + - rp = @user.personal_projects.count + - unless rp.zero? + %li #{pluralize rp, 'personal project'} will be removed and cannot be restored + %br + = link_to 'Remove user', [:admin, @user], data: { confirm: "USER #{@user.name} WILL BE REMOVED! Are you sure?" }, method: :delete, class: "btn btn-remove" + - else + - if @user.solo_owned_groups.present? + %p + This user is currently an owner in these groups: + %strong #{@user.solo_owned_groups.map(&:name).join(', ')} + %p + You must transfer ownership or delete these groups before you can delete this user. diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 1403b86f377..b3cd7b0e37b 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -3,7 +3,8 @@ .header-logo = link_to root_path, class: 'home', title: 'Dashboard', id: 'js-shortcuts-home', data: {toggle: 'tooltip', placement: 'bottom'} do = brand_header_logo - %h3 GitLab + .gitlab-text-container + %h3 GitLab .header-content %button.navbar-toggle{type: 'button'} %span.sr-only Toggle navigation diff --git a/app/views/layouts/header/_public.html.haml b/app/views/layouts/header/_public.html.haml index 2c5884a5b6d..15c2e292be3 100644 --- a/app/views/layouts/header/_public.html.haml +++ b/app/views/layouts/header/_public.html.haml @@ -3,7 +3,8 @@ .header-logo = link_to explore_root_path, class: "home" do = brand_header_logo - %h3 GitLab + .gitlab-text-container + %h3 GitLab .header-content - unless current_controller?('sessions') .pull-right diff --git a/config/routes.rb b/config/routes.rb index d60bc796fdb..33f55dde476 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -149,7 +149,12 @@ Gitlab::Application.routes.draw do namespace :admin do resources :users, constraints: { id: /[a-zA-Z.\/0-9_\-]+/ } do resources :keys, only: [:show, :destroy] + resources :identities, only: [:index, :edit, :update, :destroy] + member do + get :projects + get :keys + get :groups put :team_update put :block put :unblock diff --git a/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb b/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb new file mode 100644 index 00000000000..8eed8678b2f --- /dev/null +++ b/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb @@ -0,0 +1,11 @@ +class AddDefaultOtpRequiredForLoginValue < ActiveRecord::Migration + def up + execute %q{UPDATE users SET otp_required_for_login = FALSE WHERE otp_required_for_login IS NULL} + + change_column :users, :otp_required_for_login, :boolean, default: false, null: false + end + + def down + change_column :users, :otp_required_for_login, :boolean, null: true + end +end diff --git a/db/schema.rb b/db/schema.rb index f063a4868b1..3a5af6a76d4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150610065936) do +ActiveRecord::Schema.define(version: 20150620233230) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -499,7 +499,7 @@ ActiveRecord::Schema.define(version: 20150610065936) do t.string "encrypted_otp_secret" t.string "encrypted_otp_secret_iv" t.string "encrypted_otp_secret_salt" - t.boolean "otp_required_for_login" + t.boolean "otp_required_for_login", default: false, null: false t.text "otp_backup_codes" t.string "public_email", default: "", null: false t.integer "dashboard", default: 0 diff --git a/doc/README.md b/doc/README.md index 28459613252..424b9e9a47e 100644 --- a/doc/README.md +++ b/doc/README.md @@ -4,6 +4,7 @@ - [API](api/README.md) Automate GitLab via a simple and powerful API. - [GitLab as OAuth2 authentication service provider](integration/oauth_provider.md). It allows you to login to other applications from GitLab. +- [GitLab Basics](gitlab_basics/README.md) Find step by step how to start working on your commandline and on GitLab. - [Importing to GitLab](workflow/importing/README.md). - [Markdown](markdown/markdown.md) GitLab's advanced formatting system. - [Permissions](permissions/permissions.md) Learn what each role in a project (guest/reporter/developer/master/owner) can do. diff --git a/features/admin/users.feature b/features/admin/users.feature index 1a8720dd77e..6755645778a 100644 --- a/features/admin/users.feature +++ b/features/admin/users.feature @@ -28,7 +28,7 @@ Feature: Admin Users When I submit modified user Then I see user attributes changed -@javascript + @javascript Scenario: Remove users secondary email Given I visit admin users page And I view the user with secondary email @@ -40,8 +40,26 @@ Feature: Admin Users Given user "Pete" with ssh keys And I visit admin users page And click on user "Pete" + And click on ssh keys tab Then I should see key list And I click on the key title Then I should see key details And I click on remove key Then I should see the key removed + + Scenario: Show user identities + Given user "Pete" with twitter account + And I visit "Pete" identities page in admin + Then I should see twitter details + + Scenario: Update user identities + Given user "Pete" with twitter account + And I visit "Pete" identities page in admin + And I modify twitter identity + Then I should see twitter details updated + + Scenario: Remove user identities + Given user "Pete" with twitter account + And I visit "Pete" identities page in admin + And I remove twitter identity + Then I should not see twitter details diff --git a/features/project/merge_requests.feature b/features/project/merge_requests.feature index d043badbc46..35ffa9fc6e1 100644 --- a/features/project/merge_requests.feature +++ b/features/project/merge_requests.feature @@ -41,6 +41,18 @@ Feature: Project Merge Requests And I submit new merge request "Wiki Feature" Then I should see merge request "Wiki Feature" + Scenario: I download a diff on a public merge request + Given public project "Community" + And "John Doe" owns public project "Community" + And project "Community" has "Bug CO-01" open merge request with diffs inside + Given I logout directly + And I visit merge request page "Bug CO-01" + And I click on "Email Patches" + Then I should see a patch diff + And I visit merge request page "Bug CO-01" + And I click on "Plain Diff" + Then I should see a patch diff + @javascript Scenario: I comment on a merge request Given I visit merge request page "Bug NS-04" diff --git a/features/project/source/browse_files.feature b/features/project/source/browse_files.feature index 90b966dd645..af68cb96ed9 100644 --- a/features/project/source/browse_files.feature +++ b/features/project/source/browse_files.feature @@ -45,7 +45,7 @@ Feature: Project Source Browse Files Then I am redirected to the new file on new branch And I should see its new content - @javascript @tricky + @javascript Scenario: I can create file in empty repo Given I own an empty project And I visit my empty project page diff --git a/features/steps/admin/users.rb b/features/steps/admin/users.rb index 34a3ed9f615..6c4b91586d6 100644 --- a/features/steps/admin/users.rb +++ b/features/steps/admin/users.rb @@ -114,4 +114,45 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps step 'I should see the key removed' do expect(page).not_to have_content 'ssh-rsa Key2' end + + step 'user "Pete" with twitter account' do + @user = create(:user, name: 'Pete') + @user.identities.create!(extern_uid: '123456', provider: 'twitter') + end + + step 'I visit "Pete" identities page in admin' do + allow(Gitlab::OAuth::Provider).to receive(:names).and_return(%w(twitter twitter_updated)) + visit admin_user_identities_path(@user) + end + + step 'I should see twitter details' do + expect(page).to have_content 'Pete' + expect(page).to have_content 'twitter' + end + + step 'I modify twitter identity' do + find('.table').find(:link, 'Edit').click + fill_in 'identity_extern_uid', with: '654321' + select 'twitter_updated', from: 'identity_provider' + click_button 'Save changes' + end + + step 'I should see twitter details updated' do + expect(page).to have_content 'Pete' + expect(page).to have_content 'twitter_updated' + expect(page).to have_content '654321' + end + + step 'I remove twitter identity' do + click_link 'Delete' + end + + step 'I should not see twitter details' do + expect(page).to have_content 'Pete' + expect(page).to_not have_content 'twitter' + end + + step 'click on ssh keys tab' do + click_link 'SSH keys' + end end diff --git a/features/steps/dashboard/dashboard.rb b/features/steps/dashboard/dashboard.rb index 945bf35ff27..cb3a80cac29 100644 --- a/features/steps/dashboard/dashboard.rb +++ b/features/steps/dashboard/dashboard.rb @@ -28,7 +28,7 @@ class Spinach::Features::Dashboard < Spinach::FeatureSteps end step 'user with name "John Doe" joined project "Shop"' do - user = create(:user, {name: "John Doe"}) + user = create(:user, { name: "John Doe" }) project.team << [user, :master] Event.create( project: project, diff --git a/features/steps/dashboard/event_filters.rb b/features/steps/dashboard/event_filters.rb index 834afa439a0..726b37cfde5 100644 --- a/features/steps/dashboard/event_filters.rb +++ b/features/steps/dashboard/event_filters.rb @@ -52,7 +52,7 @@ class Spinach::Features::EventFilters < Spinach::FeatureSteps end step 'this project has new member event' do - user = create(:user, {name: "John Doe"}) + user = create(:user, { name: "John Doe" }) Event.create( project: @project, author_id: user.id, diff --git a/features/steps/explore/projects.rb b/features/steps/explore/projects.rb index 49c2f6a1253..8b498e7b4a6 100644 --- a/features/steps/explore/projects.rb +++ b/features/steps/explore/projects.rb @@ -145,4 +145,3 @@ class Spinach::Features::ExploreProjects < Spinach::FeatureSteps @public_merge_request ||= MergeRequest.find_by!(title: 'Bug fix for public project') end end - diff --git a/features/steps/groups.rb b/features/steps/groups.rb index 6221163ac54..2812c5473e9 100644 --- a/features/steps/groups.rb +++ b/features/steps/groups.rb @@ -128,14 +128,14 @@ class Spinach::Features::Groups < Spinach::FeatureSteps end step 'I change group "Owned" avatar' do - attach_file(:group_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) + attach_file(:group_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')) click_button "Save group" Group.find_by(name: "Owned").reload end step 'I should see new group "Owned" avatar' do expect(Group.find_by(name: "Owned").avatar).to be_instance_of AvatarUploader - expect(Group.find_by(name: "Owned").avatar.url).to eq "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/gitlab_logo.png" + expect(Group.find_by(name: "Owned").avatar.url).to eq "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/banana_sample.gif" end step 'I should see the "Remove avatar" button' do @@ -143,7 +143,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps end step 'I have group "Owned" avatar' do - attach_file(:group_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) + attach_file(:group_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')) click_button "Save group" Group.find_by(name: "Owned").reload end diff --git a/features/steps/profile/profile.rb b/features/steps/profile/profile.rb index 3f19bed8a0b..11e1163c352 100644 --- a/features/steps/profile/profile.rb +++ b/features/steps/profile/profile.rb @@ -27,14 +27,14 @@ class Spinach::Features::Profile < Spinach::FeatureSteps end step 'I change my avatar' do - attach_file(:user_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) + attach_file(:user_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')) click_button "Save changes" @user.reload end step 'I should see new avatar' do expect(@user.avatar).to be_instance_of AvatarUploader - expect(@user.avatar.url).to eq "/uploads/user/avatar/#{ @user.id }/gitlab_logo.png" + expect(@user.avatar.url).to eq "/uploads/user/avatar/#{ @user.id }/banana_sample.gif" end step 'I should see the "Remove avatar" button' do @@ -42,7 +42,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps end step 'I have an avatar' do - attach_file(:user_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) + attach_file(:user_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')) click_button "Save changes" @user.reload end diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb index 5684d661527..f11edb659d5 100644 --- a/features/steps/project/merge_requests.rb +++ b/features/steps/project/merge_requests.rb @@ -6,6 +6,7 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps include SharedPaths include SharedMarkdown include SharedDiffNote + include SharedUser step 'I click link "New Merge Request"' do click_link "New Merge Request" @@ -108,6 +109,15 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps author: project.users.first) end + step 'project "Community" has "Bug CO-01" open merge request with diffs inside' do + project = Project.find_by(name: "Community") + create(:merge_request_with_diffs, + title: "Bug CO-01", + source_project: project, + target_project: project, + author: project.users.first) + end + step 'I switch to the diff tab' do visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request) end @@ -326,6 +336,18 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps expect(page).to have_content 'Target branch changed from master to feature' end + step 'I click on "Email Patches"' do + click_link "Email Patches" + end + + step 'I click on "Plain Diff"' do + click_link "Plain Diff" + end + + step 'I should see a patch diff' do + expect(page).to have_content('diff --git') + end + def merge_request @merge_request ||= MergeRequest.find_by!(title: "Bug NS-05") end diff --git a/features/steps/project/project.rb b/features/steps/project/project.rb index e4465a1c3b7..b4a0ba1e27f 100644 --- a/features/steps/project/project.rb +++ b/features/steps/project/project.rb @@ -28,7 +28,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps step 'I change the project avatar' do attach_file( :project_avatar, - File.join(Rails.root, 'public', 'gitlab_logo.png') + File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif') ) click_button 'Save changes' @project.reload @@ -37,7 +37,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps step 'I should see new project avatar' do expect(@project.avatar).to be_instance_of AvatarUploader url = @project.avatar.url - expect(url).to eq "/uploads/project/avatar/#{ @project.id }/gitlab_logo.png" + expect(url).to eq "/uploads/project/avatar/#{ @project.id }/banana_sample.gif" end step 'I should see the "Remove avatar" button' do @@ -47,7 +47,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps step 'I have an project avatar' do attach_file( :project_avatar, - File.join(Rails.root, 'public', 'gitlab_logo.png') + File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif') ) click_button 'Save changes' @project.reload diff --git a/features/steps/project/snippets.rb b/features/steps/project/snippets.rb index eedb4e1b74a..db8ad08bb9e 100644 --- a/features/steps/project/snippets.rb +++ b/features/steps/project/snippets.rb @@ -52,8 +52,8 @@ class Spinach::Features::ProjectSnippets < Spinach::FeatureSteps end step 'I submit new snippet "Snippet three"' do - fill_in "project_snippet_title", :with => "Snippet three" - fill_in "project_snippet_file_name", :with => "my_snippet.rb" + fill_in "project_snippet_title", with: "Snippet three" + fill_in "project_snippet_file_name", with: "my_snippet.rb" page.within('.file-editor') do find(:xpath, "//input[@id='project_snippet_content']").set 'Content of snippet three' end @@ -66,7 +66,7 @@ class Spinach::Features::ProjectSnippets < Spinach::FeatureSteps end step 'I submit new title "Snippet new title"' do - fill_in "project_snippet_title", :with => "Snippet new title" + fill_in "project_snippet_title", with: "Snippet new title" click_button "Save" end diff --git a/features/steps/shared/admin.rb b/features/steps/shared/admin.rb index b6072995677..fbaa408226e 100644 --- a/features/steps/shared/admin.rb +++ b/features/steps/shared/admin.rb @@ -9,4 +9,3 @@ module SharedAdmin 2.times { create(:user) } end end - diff --git a/features/steps/shared/issuable.rb b/features/steps/shared/issuable.rb index 41db2612f26..e6d1b8b8efc 100644 --- a/features/steps/shared/issuable.rb +++ b/features/steps/shared/issuable.rb @@ -2,7 +2,7 @@ module SharedIssuable include Spinach::DSL def edit_issuable - find(:css, '.issuable-edit').click + find(:css, '.issuable-edit').click end step 'I click link "Edit" for the merge request' do diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index 3bd0d60281c..4cc01443c8b 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -20,43 +20,43 @@ module SharedPaths # ---------------------------------------- step 'I visit group "Owned" page' do - visit group_path(Group.find_by(name:"Owned")) + visit group_path(Group.find_by(name: "Owned")) end step 'I visit group "Owned" issues page' do - visit issues_group_path(Group.find_by(name:"Owned")) + visit issues_group_path(Group.find_by(name: "Owned")) end step 'I visit group "Owned" merge requests page' do - visit merge_requests_group_path(Group.find_by(name:"Owned")) + visit merge_requests_group_path(Group.find_by(name: "Owned")) end step 'I visit group "Owned" members page' do - visit group_group_members_path(Group.find_by(name:"Owned")) + visit group_group_members_path(Group.find_by(name: "Owned")) end step 'I visit group "Owned" settings page' do - visit edit_group_path(Group.find_by(name:"Owned")) + visit edit_group_path(Group.find_by(name: "Owned")) end step 'I visit group "Guest" page' do - visit group_path(Group.find_by(name:"Guest")) + visit group_path(Group.find_by(name: "Guest")) end step 'I visit group "Guest" issues page' do - visit issues_group_path(Group.find_by(name:"Guest")) + visit issues_group_path(Group.find_by(name: "Guest")) end step 'I visit group "Guest" merge requests page' do - visit merge_requests_group_path(Group.find_by(name:"Guest")) + visit merge_requests_group_path(Group.find_by(name: "Guest")) end step 'I visit group "Guest" members page' do - visit group_group_members_path(Group.find_by(name:"Guest")) + visit group_group_members_path(Group.find_by(name: "Guest")) end step 'I visit group "Guest" settings page' do - visit edit_group_path(Group.find_by(name:"Guest")) + visit edit_group_path(Group.find_by(name: "Guest")) end # ---------------------------------------- @@ -201,11 +201,11 @@ module SharedPaths end step "I visit my project's commits page" do - visit namespace_project_commits_path(@project.namespace, @project, root_ref, {limit: 5}) + visit namespace_project_commits_path(@project.namespace, @project, root_ref, { limit: 5 }) end step "I visit my project's commits page for a specific path" do - visit namespace_project_commits_path(@project.namespace, @project, root_ref + "/app/models/project.rb", {limit: 5}) + visit namespace_project_commits_path(@project.namespace, @project, root_ref + "/app/models/project.rb", { limit: 5 }) end step 'I visit my project\'s commits stats page' do @@ -272,11 +272,11 @@ module SharedPaths end step 'I visit project commits page' do - visit namespace_project_commits_path(@project.namespace, @project, root_ref, {limit: 5}) + visit namespace_project_commits_path(@project.namespace, @project, root_ref, { limit: 5 }) end step 'I visit project commits page for stable branch' do - visit namespace_project_commits_path(@project.namespace, @project, 'stable', {limit: 5}) + visit namespace_project_commits_path(@project.namespace, @project, 'stable', { limit: 5 }) end step 'I visit project source page' do @@ -357,6 +357,11 @@ module SharedPaths visit namespace_project_merge_request_path(mr.target_project.namespace, mr.target_project, mr) end + step 'I visit merge request page "Bug CO-01"' do + mr = MergeRequest.find_by(title: "Bug CO-01") + visit namespace_project_merge_request_path(mr.target_project.namespace, mr.target_project, mr) + end + step 'I visit project "Shop" merge requests page' do visit namespace_project_merge_requests_path(project.namespace, project) end @@ -418,13 +423,13 @@ module SharedPaths visit explore_projects_path end - step 'I visit the explore trending projects' do - visit trending_explore_projects_path - end + step 'I visit the explore trending projects' do + visit trending_explore_projects_path + end - step 'I visit the explore starred projects' do - visit starred_explore_projects_path - end + step 'I visit the explore starred projects' do + visit starred_explore_projects_path + end step 'I visit the public groups area' do visit explore_groups_path diff --git a/features/steps/shared/user.rb b/features/steps/shared/user.rb index 209d77c7acf..fc1e8d6e889 100644 --- a/features/steps/shared/user.rb +++ b/features/steps/shared/user.rb @@ -2,16 +2,16 @@ module SharedUser include Spinach::DSL step 'User "John Doe" exists' do - user_exists("John Doe", {username: "john_doe"}) + user_exists("John Doe", { username: "john_doe" }) end step 'User "Mary Jane" exists' do - user_exists("Mary Jane", {username: "mary_jane"}) + user_exists("Mary Jane", { username: "mary_jane" }) end protected def user_exists(name, options = {}) - User.find_by(name: name) || create(:user, {name: name, admin: false}.merge(options)) + User.find_by(name: name) || create(:user, { name: name, admin: false }.merge(options)) end end diff --git a/features/steps/snippets/snippets.rb b/features/steps/snippets/snippets.rb index 426da2918ea..6ff48e0c6b8 100644 --- a/features/steps/snippets/snippets.rb +++ b/features/steps/snippets/snippets.rb @@ -23,8 +23,8 @@ class Spinach::Features::Snippets < Spinach::FeatureSteps end step 'I submit new snippet "Personal snippet three"' do - fill_in "personal_snippet_title", :with => "Personal snippet three" - fill_in "personal_snippet_file_name", :with => "my_snippet.rb" + fill_in "personal_snippet_title", with: "Personal snippet three" + fill_in "personal_snippet_file_name", with: "my_snippet.rb" page.within('.file-editor') do find(:xpath, "//input[@id='personal_snippet_content']").set 'Content of snippet three' end @@ -32,12 +32,12 @@ class Spinach::Features::Snippets < Spinach::FeatureSteps end step 'I submit new internal snippet' do - fill_in "personal_snippet_title", :with => "Internal personal snippet one" - fill_in "personal_snippet_file_name", :with => "my_snippet.rb" + fill_in "personal_snippet_title", with: "Internal personal snippet one" + fill_in "personal_snippet_file_name", with: "my_snippet.rb" choose 'personal_snippet_visibility_level_10' page.within('.file-editor') do - find(:xpath, "//input[@id='personal_snippet_content']").set 'Content of internal snippet' + find(:xpath, "//input[@id='personal_snippet_content']").set 'Content of internal snippet' end click_button "Create snippet" @@ -49,7 +49,7 @@ class Spinach::Features::Snippets < Spinach::FeatureSteps end step 'I submit new title "Personal snippet new title"' do - fill_in "personal_snippet_title", :with => "Personal snippet new title" + fill_in "personal_snippet_title", with: "Personal snippet new title" click_button "Save" end diff --git a/lib/api/users.rb b/lib/api/users.rb index 7d4c68c7412..9b268cfe8bc 100644 --- a/lib/api/users.rb +++ b/lib/api/users.rb @@ -194,7 +194,7 @@ module API user = User.find_by(id: params[:id]) if user - DeleteUserService.new.execute(user) + DeleteUserService.new(current_user).execute(user) else not_found!('User') end diff --git a/lib/gitlab/backend/shell_env.rb b/lib/gitlab/backend/shell_env.rb index 044afb27f3f..17ec029eed4 100644 --- a/lib/gitlab/backend/shell_env.rb +++ b/lib/gitlab/backend/shell_env.rb @@ -6,7 +6,9 @@ module Gitlab def set_env(user) # Set GL_ID env variable - ENV['GL_ID'] = "user-#{user.id}" + if user + ENV['GL_ID'] = "user-#{user.id}" + end end def reset_env diff --git a/lib/gitlab/o_auth/provider.rb b/lib/gitlab/o_auth/provider.rb new file mode 100644 index 00000000000..f986499a27c --- /dev/null +++ b/lib/gitlab/o_auth/provider.rb @@ -0,0 +1,19 @@ +module Gitlab + module OAuth + class Provider + def self.names + providers = [] + + Gitlab.config.ldap.servers.values.each do |server| + providers << server['provider_name'] + end + + Gitlab.config.omniauth.providers.each do |provider| + providers << provider['name'] + end + + providers + end + end + end +end diff --git a/lib/gitlab/satellite/action.rb b/lib/gitlab/satellite/action.rb index 4890ccf21e6..489070f1a3f 100644 --- a/lib/gitlab/satellite/action.rb +++ b/lib/gitlab/satellite/action.rb @@ -39,8 +39,10 @@ module Gitlab def prepare_satellite!(repo) project.satellite.clear_and_update! - repo.config['user.name'] = user.name - repo.config['user.email'] = user.email + if user + repo.config['user.name'] = user.name + repo.config['user.email'] = user.email + end end def default_options(options = {}) diff --git a/lib/tasks/cache.rake b/lib/tasks/cache.rake index 753a5a11070..1728dda72cf 100644 --- a/lib/tasks/cache.rake +++ b/lib/tasks/cache.rake @@ -1,5 +1,5 @@ namespace :cache do - desc "GITLAB | Clear redis cache" + desc "GitLab | Clear redis cache" task :clear => :environment do # Hack into Rails.cache until https://github.com/redis-store/redis-store/pull/225 # is accepted (I hope) and we can update the redis-store gem. diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake index b22c631c8ba..6f27972c4e4 100644 --- a/lib/tasks/dev.rake +++ b/lib/tasks/dev.rake @@ -1,14 +1,14 @@ task dev: ["dev:setup"] namespace :dev do - desc "GITLAB | Setup developer environment (db, fixtures)" + desc "GitLab | Setup developer environment (db, fixtures)" task :setup => :environment do ENV['force'] = 'yes' Rake::Task["gitlab:setup"].invoke Rake::Task["gitlab:shell:setup"].invoke end - desc 'GITLAB | Start/restart foreman and watch for changes' + desc 'GitLab | Start/restart foreman and watch for changes' task :foreman => :environment do sh 'rerun --dir app,config,lib -- foreman start' end diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake index 84445b3bf2f..4c73f90bbf2 100644 --- a/lib/tasks/gitlab/backup.rake +++ b/lib/tasks/gitlab/backup.rake @@ -3,7 +3,7 @@ require 'active_record/fixtures' namespace :gitlab do namespace :backup do # Create backup of GitLab system - desc "GITLAB | Create a backup of the GitLab system" + desc "GitLab | Create a backup of the GitLab system" task create: :environment do warn_user_is_not_gitlab configure_cron_mode @@ -19,7 +19,7 @@ namespace :gitlab do end # Restore backup of GitLab system - desc "GITLAB | Restore a previously created backup" + desc "GitLab | Restore a previously created backup" task restore: :environment do warn_user_is_not_gitlab configure_cron_mode diff --git a/lib/tasks/gitlab/bulk_add_permission.rake b/lib/tasks/gitlab/bulk_add_permission.rake index 3d8c171dfa3..5dbf7d61e06 100644 --- a/lib/tasks/gitlab/bulk_add_permission.rake +++ b/lib/tasks/gitlab/bulk_add_permission.rake @@ -1,6 +1,6 @@ namespace :gitlab do namespace :import do - desc "GITLAB | Add all users to all projects (admin users are added as masters)" + desc "GitLab | Add all users to all projects (admin users are added as masters)" task all_users_to_all_projects: :environment do |t, args| user_ids = User.where(admin: false).pluck(:id) admin_ids = User.where(admin: true).pluck(:id) @@ -13,7 +13,7 @@ namespace :gitlab do ProjectMember.add_users_into_projects(projects_ids, admin_ids, ProjectMember::MASTER) end - desc "GITLAB | Add a specific user to all projects (as a developer)" + desc "GitLab | Add a specific user to all projects (as a developer)" task :user_to_projects, [:email] => :environment do |t, args| user = User.find_by(email: args.email) project_ids = Project.pluck(:id) @@ -21,7 +21,7 @@ namespace :gitlab do ProjectMember.add_users_into_projects(project_ids, Array.wrap(user.id), ProjectMember::DEVELOPER) end - desc "GITLAB | Add all users to all groups (admin users are added as owners)" + desc "GitLab | Add all users to all groups (admin users are added as owners)" task all_users_to_all_groups: :environment do |t, args| user_ids = User.where(admin: false).pluck(:id) admin_ids = User.where(admin: true).pluck(:id) @@ -35,7 +35,7 @@ namespace :gitlab do end end - desc "GITLAB | Add a specific user to all groups (as a developer)" + desc "GitLab | Add a specific user to all groups (as a developer)" task :user_to_groups, [:email] => :environment do |t, args| user = User.find_by_email args.email groups = Group.all diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake index 75bd41f2838..aed84226a2f 100644 --- a/lib/tasks/gitlab/check.rake +++ b/lib/tasks/gitlab/check.rake @@ -1,5 +1,5 @@ namespace :gitlab do - desc "GITLAB | Check the configuration of GitLab and its environment" + desc "GitLab | Check the configuration of GitLab and its environment" task check: %w{gitlab:gitlab_shell:check gitlab:sidekiq:check gitlab:ldap:check @@ -8,7 +8,7 @@ namespace :gitlab do namespace :app do - desc "GITLAB | Check the configuration of the GitLab Rails app" + desc "GitLab | Check the configuration of the GitLab Rails app" task check: :environment do warn_user_is_not_gitlab start_checking "GitLab" @@ -329,7 +329,7 @@ namespace :gitlab do end namespace :gitlab_shell do - desc "GITLAB | Check the configuration of GitLab Shell" + desc "GitLab | Check the configuration of GitLab Shell" task check: :environment do warn_user_is_not_gitlab start_checking "GitLab Shell" @@ -574,7 +574,7 @@ namespace :gitlab do namespace :sidekiq do - desc "GITLAB | Check the configuration of Sidekiq" + desc "GitLab | Check the configuration of Sidekiq" task check: :environment do warn_user_is_not_gitlab start_checking "Sidekiq" @@ -667,7 +667,7 @@ namespace :gitlab do end namespace :repo do - desc "GITLAB | Check the integrity of the repositories managed by GitLab" + desc "GitLab | Check the integrity of the repositories managed by GitLab" task check: :environment do namespace_dirs = Dir.glob( File.join(Gitlab.config.gitlab_shell.repos_path, '*') diff --git a/lib/tasks/gitlab/cleanup.rake b/lib/tasks/gitlab/cleanup.rake index d49cb6778f1..6b1e3716147 100644 --- a/lib/tasks/gitlab/cleanup.rake +++ b/lib/tasks/gitlab/cleanup.rake @@ -1,6 +1,6 @@ namespace :gitlab do namespace :cleanup do - desc "GITLAB | Cleanup | Clean namespaces" + desc "GitLab | Cleanup | Clean namespaces" task dirs: :environment do warn_user_is_not_gitlab remove_flag = ENV['REMOVE'] @@ -43,7 +43,7 @@ namespace :gitlab do end end - desc "GITLAB | Cleanup | Clean repositories" + desc "GitLab | Cleanup | Clean repositories" task repos: :environment do warn_user_is_not_gitlab remove_flag = ENV['REMOVE'] @@ -85,7 +85,7 @@ namespace :gitlab do end end - desc "GITLAB | Cleanup | Block users that have been removed in LDAP" + desc "GitLab | Cleanup | Block users that have been removed in LDAP" task block_removed_ldap_users: :environment do warn_user_is_not_gitlab block_flag = ENV['BLOCK'] diff --git a/lib/tasks/gitlab/enable_automerge.rake b/lib/tasks/gitlab/enable_automerge.rake index aa9869daf2f..3dade9d75b8 100644 --- a/lib/tasks/gitlab/enable_automerge.rake +++ b/lib/tasks/gitlab/enable_automerge.rake @@ -1,6 +1,6 @@ namespace :gitlab do namespace :satellites do - desc "GITLAB | Create satellite repos" + desc "GitLab | Create satellite repos" task create: :environment do create_satellites end diff --git a/lib/tasks/gitlab/generate_docs.rake b/lib/tasks/gitlab/generate_docs.rake index 332cd61f84c..f6448c38e10 100644 --- a/lib/tasks/gitlab/generate_docs.rake +++ b/lib/tasks/gitlab/generate_docs.rake @@ -1,5 +1,5 @@ namespace :gitlab do - desc "GITLAB | Generate sdocs for project" + desc "GitLab | Generate sdocs for project" task generate_docs: :environment do system(*%W(bundle exec sdoc -o doc/code app lib)) end diff --git a/lib/tasks/gitlab/import.rake b/lib/tasks/gitlab/import.rake index 7c98ad3144f..5f83e5e8e7f 100644 --- a/lib/tasks/gitlab/import.rake +++ b/lib/tasks/gitlab/import.rake @@ -9,7 +9,7 @@ namespace :gitlab do # * The project owner will set to the first administator of the system # * Existing projects will be skipped # - desc "GITLAB | Import bare repositories from gitlab_shell -> repos_path into GitLab project instance" + desc "GitLab | Import bare repositories from gitlab_shell -> repos_path into GitLab project instance" task repos: :environment do git_base_path = Gitlab.config.gitlab_shell.repos_path diff --git a/lib/tasks/gitlab/info.rake b/lib/tasks/gitlab/info.rake index 72452e1d8ea..bf221f06d3b 100644 --- a/lib/tasks/gitlab/info.rake +++ b/lib/tasks/gitlab/info.rake @@ -1,6 +1,6 @@ namespace :gitlab do namespace :env do - desc "GITLAB | Show information about GitLab and its environment" + desc "GitLab | Show information about GitLab and its environment" task info: :environment do # check if there is an RVM environment diff --git a/lib/tasks/gitlab/setup.rake b/lib/tasks/gitlab/setup.rake index 8b4ccdfc3fe..0ac4b0fa8a3 100644 --- a/lib/tasks/gitlab/setup.rake +++ b/lib/tasks/gitlab/setup.rake @@ -1,5 +1,5 @@ namespace :gitlab do - desc "GITLAB | Setup production application" + desc "GitLab | Setup production application" task setup: :environment do setup_db end diff --git a/lib/tasks/gitlab/shell.rake b/lib/tasks/gitlab/shell.rake index afdaba11cb0..3c0cc763d17 100644 --- a/lib/tasks/gitlab/shell.rake +++ b/lib/tasks/gitlab/shell.rake @@ -1,6 +1,6 @@ namespace :gitlab do namespace :shell do - desc "GITLAB | Install or upgrade gitlab-shell" + desc "GitLab | Install or upgrade gitlab-shell" task :install, [:tag, :repo] => :environment do |t, args| warn_user_is_not_gitlab @@ -75,12 +75,12 @@ namespace :gitlab do end end - desc "GITLAB | Setup gitlab-shell" + desc "GitLab | Setup gitlab-shell" task setup: :environment do setup end - desc "GITLAB | Build missing projects" + desc "GitLab | Build missing projects" task build_missing_projects: :environment do Project.find_each(batch_size: 1000) do |project| path_to_repo = project.repository.path_to_repo diff --git a/lib/tasks/gitlab/test.rake b/lib/tasks/gitlab/test.rake index b4c0ae3ff79..cbb3d61af04 100644 --- a/lib/tasks/gitlab/test.rake +++ b/lib/tasks/gitlab/test.rake @@ -1,5 +1,5 @@ namespace :gitlab do - desc "GITLAB | Run all tests" + desc "GitLab | Run all tests" task :test do cmds = [ %W(rake brakeman), diff --git a/lib/tasks/gitlab/web_hook.rake b/lib/tasks/gitlab/web_hook.rake index 412bcad1229..76e443e55ee 100644 --- a/lib/tasks/gitlab/web_hook.rake +++ b/lib/tasks/gitlab/web_hook.rake @@ -1,6 +1,6 @@ namespace :gitlab do namespace :web_hook do - desc "GITLAB | Adds a web hook to the projects" + desc "GitLab | Adds a web hook to the projects" task :add => :environment do web_hook_url = ENV['URL'] namespace_path = ENV['NAMESPACE'] @@ -20,7 +20,7 @@ namespace :gitlab do end end - desc "GITLAB | Remove a web hook from the projects" + desc "GitLab | Remove a web hook from the projects" task :rm => :environment do web_hook_url = ENV['URL'] namespace_path = ENV['NAMESPACE'] @@ -33,7 +33,7 @@ namespace :gitlab do puts "#{count} web hooks were removed." end - desc "GITLAB | List web hooks" + desc "GitLab | List web hooks" task :list => :environment do namespace_path = ENV['NAMESPACE'] diff --git a/lib/tasks/migrate/add_limits_mysql.rake b/lib/tasks/migrate/add_limits_mysql.rake index a1972a682d8..6ded519aff2 100644 --- a/lib/tasks/migrate/add_limits_mysql.rake +++ b/lib/tasks/migrate/add_limits_mysql.rake @@ -1,6 +1,6 @@ require Rails.root.join('db/migrate/limits_to_mysql') -desc "GITLAB | Add limits to strings in mysql database" +desc "GitLab | Add limits to strings in mysql database" task add_limits_mysql: :environment do puts "Adding limits to schema.rb for mysql" LimitsToMysql.new.up diff --git a/lib/tasks/migrate/migrate_iids.rake b/lib/tasks/migrate/migrate_iids.rake index 33271e1a2bb..d258c6fd08d 100644 --- a/lib/tasks/migrate/migrate_iids.rake +++ b/lib/tasks/migrate/migrate_iids.rake @@ -1,4 +1,4 @@ -desc "GITLAB | Build internal ids for issues and merge requests" +desc "GitLab | Build internal ids for issues and merge requests" task migrate_iids: :environment do puts 'Issues'.yellow Issue.where(iid: nil).find_each(batch_size: 100) do |issue| diff --git a/lib/tasks/setup.rake b/lib/tasks/setup.rake index 93701de8f63..4c79ffbfa6b 100644 --- a/lib/tasks/setup.rake +++ b/lib/tasks/setup.rake @@ -1,4 +1,4 @@ -desc "GITLAB | Setup gitlab db" +desc "GitLab | Setup gitlab db" task :setup do Rake::Task["gitlab:setup"].invoke end diff --git a/lib/tasks/sidekiq.rake b/lib/tasks/sidekiq.rake index e4bd6545755..d1f6ed87704 100644 --- a/lib/tasks/sidekiq.rake +++ b/lib/tasks/sidekiq.rake @@ -1,10 +1,10 @@ namespace :sidekiq do - desc "GITLAB | Stop sidekiq" + desc "GitLab | Stop sidekiq" task :stop do system *%W(bin/background_jobs stop) end - desc "GITLAB | Start sidekiq" + desc "GitLab | Start sidekiq" task :start do system *%W(bin/background_jobs start) end @@ -14,7 +14,7 @@ namespace :sidekiq do system *%W(bin/background_jobs restart) end - desc "GITLAB | Start sidekiq with launchd on Mac OS X" + desc "GitLab | Start sidekiq with launchd on Mac OS X" task :launchd do system *%W(bin/background_jobs start_no_deamonize) end diff --git a/lib/tasks/spec.rake b/lib/tasks/spec.rake index bee22300298..831746815d7 100644 --- a/lib/tasks/spec.rake +++ b/lib/tasks/spec.rake @@ -1,7 +1,7 @@ Rake::Task["spec"].clear if Rake::Task.task_defined?('spec') namespace :spec do - desc 'GITLAB | Run request specs' + desc 'GitLab | Rspec | Run request specs' task :api do cmds = [ %W(rake gitlab:setup), @@ -10,7 +10,7 @@ namespace :spec do run_commands(cmds) end - desc 'GITLAB | Run feature specs' + desc 'GitLab | Rspec | Run feature specs' task :feature do cmds = [ %W(rake gitlab:setup), @@ -19,7 +19,7 @@ namespace :spec do run_commands(cmds) end - desc 'GITLAB | Run other specs' + desc 'GitLab | Rspec | Run other specs' task :other do cmds = [ %W(rake gitlab:setup), @@ -29,7 +29,7 @@ namespace :spec do end end -desc "GITLAB | Run specs" +desc "GitLab | Run specs" task :spec do cmds = [ %W(rake gitlab:setup), diff --git a/lib/tasks/spinach.rake b/lib/tasks/spinach.rake index 4aefc18ce14..c8881be0954 100644 --- a/lib/tasks/spinach.rake +++ b/lib/tasks/spinach.rake @@ -1,34 +1,30 @@ Rake::Task["spinach"].clear if Rake::Task.task_defined?('spinach') -desc "GITLAB | Run spinach" -task :spinach do - tags = if ENV['SEMAPHORE'] - '~@tricky' - else - '~@semaphore' - end - - cmds = [ - %W(rake gitlab:setup), - %W(spinach --tags #{tags}), - ] - run_commands(cmds) -end +namespace :spinach do + desc "GitLab | Spinach | Run project spinach features" + task :project do + cmds = [ + %W(rake gitlab:setup), + %W(spinach --tags ~@admin,~@dashboard,~@profile,~@public,~@snippets), + ] + run_commands(cmds) + end -desc "GITLAB | Run project spinach features" -task :spinach_project do - cmds = [ - %W(rake gitlab:setup), - %W(spinach --tags ~@admin,~@dashboard,~@profile,~@public,~@snippets), - ] - run_commands(cmds) + desc "GitLab | Spinach | Run other spinach features" + task :other do + cmds = [ + %W(rake gitlab:setup), + %W(spinach --tags @admin,@dashboard,@profile,@public,@snippets), + ] + run_commands(cmds) + end end -desc "GITLAB | Run other spinach features" -task :spinach_other do +desc "GitLab | Run spinach" +task :spinach do cmds = [ %W(rake gitlab:setup), - %W(spinach --tags @admin,@dashboard,@profile,@public,@snippets), + %W(spinach), ] run_commands(cmds) end diff --git a/lib/tasks/test.rake b/lib/tasks/test.rake index a39d9649876..b9f9c72c91f 100644 --- a/lib/tasks/test.rake +++ b/lib/tasks/test.rake @@ -1,6 +1,6 @@ Rake::Task["test"].clear -desc "GITLAB | Run all tests" +desc "GitLab | Run all tests" task :test do Rake::Task["gitlab:test"].invoke end @@ -8,6 +8,6 @@ end unless Rails.env.production? require 'coveralls/rake/task' Coveralls::RakeTask.new - desc "GITLAB | Run all tests on CI with simplecov" + desc "GitLab | Run all tests on CI with simplecov" task :test_ci => [:rubocop, :brakeman, 'jasmine:ci', :spinach, :spec, 'coveralls:push'] end diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb new file mode 100644 index 00000000000..f27e861e175 --- /dev/null +++ b/spec/controllers/admin/users_controller_spec.rb @@ -0,0 +1,24 @@ +require 'spec_helper' + +describe Admin::UsersController do + let(:admin) { create(:admin) } + + before do + sign_in(admin) + end + + describe 'DELETE #user with projects' do + let(:user) { create(:user) } + let(:project) { create(:project, namespace: user.namespace) } + + before do + project.team << [user, :developer] + end + + it 'deletes user' do + delete :destroy, id: user.username, format: :json + expect(response.status).to eq(200) + expect { User.find(user.id) }.to raise_exception(ActiveRecord::RecordNotFound) + end + end +end diff --git a/spec/controllers/blob_controller_spec.rb b/spec/controllers/blob_controller_spec.rb index a1102f28340..eb91e577b87 100644 --- a/spec/controllers/blob_controller_spec.rb +++ b/spec/controllers/blob_controller_spec.rb @@ -18,8 +18,10 @@ describe Projects::BlobController do render_views before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: id) end context "valid branch, valid file" do @@ -42,8 +44,10 @@ describe Projects::BlobController do render_views before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: id) controller.instance_variable_set(:@blob, nil) end diff --git a/spec/controllers/branches_controller_spec.rb b/spec/controllers/branches_controller_spec.rb index 51397382cfb..db3b64babcd 100644 --- a/spec/controllers/branches_controller_spec.rb +++ b/spec/controllers/branches_controller_spec.rb @@ -17,13 +17,13 @@ describe Projects::BranchesController do describe "POST create" do render_views - before { + before do post :create, namespace_id: project.namespace.to_param, project_id: project.to_param, branch_name: branch, ref: ref - } + end context "valid branch name, valid source" do let(:branch) { "merge_branch" } diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb index 34ee61f7ede..bb3d87f3840 100644 --- a/spec/controllers/commit_controller_spec.rb +++ b/spec/controllers/commit_controller_spec.rb @@ -13,8 +13,11 @@ describe Projects::CommitController do describe "#show" do shared_examples "export as" do |format| it "should generally work" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id, + format: format) expect(response).to be_success end @@ -22,13 +25,17 @@ describe Projects::CommitController do it "should generate it" do expect_any_instance_of(Commit).to receive(:"to_#{format}") - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id, format: format) end it "should render it" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id, format: format) expect(response.body).to eq(commit.send(:"to_#{format}")) end @@ -37,8 +44,10 @@ describe Projects::CommitController do allow_any_instance_of(Commit).to receive(:"to_#{format}"). and_return('HTML entities &<>" ') - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id, format: format) expect(response.body).not_to include('&') expect(response.body).not_to include('>') @@ -52,8 +61,11 @@ describe Projects::CommitController do let(:format) { :diff } it "should really only be a git diff" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id, + format: format) expect(response.body).to start_with("diff --git") end @@ -64,15 +76,21 @@ describe Projects::CommitController do let(:format) { :patch } it "should really be a git email patch" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id, + format: format) expect(response.body).to start_with("From #{commit.id}") end it "should contain a git diff" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id, + format: format) expect(response.body).to match(/^diff --git/) end @@ -81,8 +99,10 @@ describe Projects::CommitController do describe "#branches" do it "contains branch and tags information" do - get(:branches, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id) + get(:branches, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: commit.id) expect(assigns(:branches)).to include("master", "feature_conflict") expect(assigns(:tags)).to include("v1.1.0") diff --git a/spec/controllers/commits_controller_spec.rb b/spec/controllers/commits_controller_spec.rb index 2184b35152e..7d8089c4bc6 100644 --- a/spec/controllers/commits_controller_spec.rb +++ b/spec/controllers/commits_controller_spec.rb @@ -12,8 +12,11 @@ describe Projects::CommitsController do describe "GET show" do context "as atom feed" do it "should render as atom" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: "master", format: "atom") + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: "master", + format: "atom") expect(response).to be_success expect(response.content_type).to eq('application/atom+xml') end diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb index 93535ced7ae..1f7fd517342 100644 --- a/spec/controllers/help_controller_spec.rb +++ b/spec/controllers/help_controller_spec.rb @@ -35,8 +35,10 @@ describe HelpController do context 'for image formats' do context 'when requested file exists' do it 'renders the raw file' do - get :show, category: 'workflow/protected_branches', - file: 'protected_branches1', format: :png + get :show, + category: 'workflow/protected_branches', + file: 'protected_branches1', + format: :png expect(response).to be_success expect(response.content_type).to eq 'image/png' expect(response.headers['Content-Disposition']).to match(/^inline;/) @@ -45,7 +47,10 @@ describe HelpController do context 'when requested file is missing' do it 'renders not found' do - get :show, category: 'foo', file: 'bar', format: :png + get :show, + category: 'foo', + file: 'bar', + format: :png expect(response).to be_not_found end end @@ -53,7 +58,10 @@ describe HelpController do context 'for other formats' do it 'always renders not found' do - get :show, category: 'ssh', file: 'README', format: :foo + get :show, + category: 'ssh', + file: 'README', + format: :foo expect(response).to be_not_found end end diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb index f577c2b3006..d5d9310e603 100644 --- a/spec/controllers/import/bitbucket_controller_spec.rb +++ b/spec/controllers/import/bitbucket_controller_spec.rb @@ -61,20 +61,13 @@ describe Import::BitbucketController do describe "POST create" do let(:bitbucket_username) { user.username } - let(:bitbucket_user) { - { - user: { - username: bitbucket_username - } - }.with_indifferent_access - } - - let(:bitbucket_repo) { - { - slug: "vim", - owner: bitbucket_username - }.with_indifferent_access - } + let(:bitbucket_user) do + { user: { username: bitbucket_username } }.with_indifferent_access + end + + let(:bitbucket_repo) do + { slug: "vim", owner: bitbucket_username }.with_indifferent_access + end before do allow(Gitlab::BitbucketImport::KeyAdder). diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb index 9534981c78b..0bc14059a35 100644 --- a/spec/controllers/import/github_controller_spec.rb +++ b/spec/controllers/import/github_controller_spec.rb @@ -55,14 +55,14 @@ describe Import::GithubController do describe "POST create" do let(:github_username) { user.username } - - let(:github_user) { - OpenStruct.new(login: github_username) - } - - let(:github_repo) { - OpenStruct.new(name: 'vim', full_name: "#{github_username}/vim", owner: OpenStruct.new(login: github_username)) - } + let(:github_user) { OpenStruct.new(login: github_username) } + let(:github_repo) do + OpenStruct.new( + name: 'vim', + full_name: "#{github_username}/vim", + owner: OpenStruct.new(login: github_username) + ) + end before do stub_client(user: github_user, repo: github_repo) diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb index cb06cdc09ea..4bc67c86703 100644 --- a/spec/controllers/import/gitlab_controller_spec.rb +++ b/spec/controllers/import/gitlab_controller_spec.rb @@ -53,21 +53,17 @@ describe Import::GitlabController do describe "POST create" do let(:gitlab_username) { user.username } - - let(:gitlab_user) { - { - username: gitlab_username - }.with_indifferent_access - } - - let(:gitlab_repo) { + let(:gitlab_user) do + { username: gitlab_username }.with_indifferent_access + end + let(:gitlab_repo) do { path: 'vim', path_with_namespace: "#{gitlab_username}/vim", owner: { name: gitlab_username }, namespace: { path: gitlab_username } }.with_indifferent_access - } + end before do stub_client(user: gitlab_user, project: gitlab_repo) diff --git a/spec/controllers/profiles/preferences_controller_spec.rb b/spec/controllers/profiles/preferences_controller_spec.rb index 1f0943c93d8..8f02003992a 100644 --- a/spec/controllers/profiles/preferences_controller_spec.rb +++ b/spec/controllers/profiles/preferences_controller_spec.rb @@ -63,7 +63,7 @@ describe Profiles::PreferencesController do context 'on invalid dashboard setting' do it 'sets the flash' do - prefs = {dashboard: 'invalid'} + prefs = { dashboard: 'invalid' } go params: prefs diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb index 23e1566b8f3..b643b354073 100644 --- a/spec/controllers/projects/compare_controller_spec.rb +++ b/spec/controllers/projects/compare_controller_spec.rb @@ -12,8 +12,11 @@ describe Projects::CompareController do end it 'compare should show some diffs' do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, from: ref_from, to: ref_to) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + from: ref_from, + to: ref_to) expect(response).to be_success expect(assigns(:diffs).length).to be >= 1 diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index b9c6f6e472e..b8db8591709 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -13,8 +13,11 @@ describe Projects::MergeRequestsController do describe "#show" do shared_examples "export merge as" do |format| it "should generally work" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format) expect(response).to be_success end @@ -22,13 +25,19 @@ describe Projects::MergeRequestsController do it "should generate it" do expect_any_instance_of(MergeRequest).to receive(:"to_#{format}") - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format) end it "should render it" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format) expect(response.body).to eq((merge_request.send(:"to_#{format}",user)).to_s) end @@ -37,8 +46,11 @@ describe Projects::MergeRequestsController do allow_any_instance_of(MergeRequest).to receive(:"to_#{format}"). and_return('HTML entities &<>" ') - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format) expect(response.body).not_to include('&') expect(response.body).not_to include('>') @@ -52,8 +64,11 @@ describe Projects::MergeRequestsController do let(:format) { :diff } it "should really only be a git diff" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format) expect(response.body).to start_with("diff --git") end @@ -64,15 +79,20 @@ describe Projects::MergeRequestsController do let(:format) { :patch } it "should really be a git email patch with commit" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, format: format) expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}") end it "should contain git diffs" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format) expect(response.body).to match(/^diff --git/) end @@ -81,8 +101,11 @@ describe Projects::MergeRequestsController do describe 'GET diffs' do def go(format: 'html') - get :diffs, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format + get :diffs, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format end context 'as html' do @@ -126,8 +149,11 @@ describe Projects::MergeRequestsController do describe 'GET commits' do def go(format: 'html') - get :commits, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format + get :commits, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + format: format end context 'as html' do diff --git a/spec/controllers/projects/refs_controller_spec.rb b/spec/controllers/projects/refs_controller_spec.rb index c254ab7cb6e..abd45a74e2d 100644 --- a/spec/controllers/projects/refs_controller_spec.rb +++ b/spec/controllers/projects/refs_controller_spec.rb @@ -11,15 +11,20 @@ describe Projects::RefsController do describe 'GET #logs_tree' do def default_get(format = :html) - get :logs_tree, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: 'master', - path: 'foo/bar/baz.html', format: format + get :logs_tree, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: 'master', + path: 'foo/bar/baz.html', + format: format end def xhr_get(format = :html) - xhr :get, :logs_tree, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: 'master', - path: 'foo/bar/baz.html', format: format + xhr :get, + :logs_tree, + namespace_id: project.namespace.to_param, + project_id: project.to_param, id: 'master', + path: 'foo/bar/baz.html', format: format end it 'never throws MissingTemplate' do diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index a1b82a32150..29233e9fae6 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -16,30 +16,34 @@ describe ProjectsController do get :show, "go-get" => "1", namespace_id: "bogus_namespace", id: "bogus_project" expect(response.body).to include("name='go-import'") - + content = "localhost/bogus_namespace/bogus_project git http://localhost/bogus_namespace/bogus_project.git" expect(response.body).to include("content='#{content}'") end end end - + describe "POST #toggle_star" do it "toggles star if user is signed in" do sign_in(user) expect(user.starred?(public_project)).to be_falsey - post(:toggle_star, namespace_id: public_project.namespace.to_param, + post(:toggle_star, + namespace_id: public_project.namespace.to_param, id: public_project.to_param) expect(user.starred?(public_project)).to be_truthy - post(:toggle_star, namespace_id: public_project.namespace.to_param, + post(:toggle_star, + namespace_id: public_project.namespace.to_param, id: public_project.to_param) expect(user.starred?(public_project)).to be_falsey end it "does nothing if user is not signed in" do - post(:toggle_star, namespace_id: project.namespace.to_param, + post(:toggle_star, + namespace_id: project.namespace.to_param, id: public_project.to_param) expect(user.starred?(public_project)).to be_falsey - post(:toggle_star, namespace_id: project.namespace.to_param, + post(:toggle_star, + namespace_id: project.namespace.to_param, id: public_project.to_param) expect(user.starred?(public_project)).to be_falsey end diff --git a/spec/controllers/tree_controller_spec.rb b/spec/controllers/tree_controller_spec.rb index 7b219819bbc..e09caf5df13 100644 --- a/spec/controllers/tree_controller_spec.rb +++ b/spec/controllers/tree_controller_spec.rb @@ -19,8 +19,10 @@ describe Projects::TreeController do render_views before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: id) end context "valid branch, no path" do @@ -48,8 +50,10 @@ describe Projects::TreeController do render_views before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) + get(:show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: id) end context 'redirect to blob' do diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb index 77cd37c22d9..3b7adfe4398 100644 --- a/spec/factories/merge_requests.rb +++ b/spec/factories/merge_requests.rb @@ -28,7 +28,7 @@ FactoryGirl.define do source_project factory: :project target_project { source_project } - # → git log --pretty=oneline feature..master + # $ git log --pretty=oneline feature..master # 5937ac0a7beb003549fc5fd26fc247adbce4a52e Add submodule from gitlab.com # 570e7b2abdd848b95f2f578043fc23bd6f6fd24d Change some files # 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 More submodules diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb index 7f5cb30cb94..86717761582 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/admin_users_spec.rb @@ -16,6 +16,46 @@ describe "Admin::Users", feature: true do expect(page).to have_content(@user.email) expect(page).to have_content(@user.name) end + + describe 'Two-factor Authentication filters' do + it 'counts users who have enabled 2FA' do + create(:user, two_factor_enabled: true) + + visit admin_users_path + + page.within('.filter-two-factor-enabled small') do + expect(page).to have_content('1') + end + end + + it 'filters by users who have enabled 2FA' do + user = create(:user, two_factor_enabled: true) + + visit admin_users_path + click_link '2FA Enabled' + + expect(page).to have_content(user.email) + end + + it 'counts users who have not enabled 2FA' do + create(:user, two_factor_enabled: false) + + visit admin_users_path + + page.within('.filter-two-factor-disabled small') do + expect(page).to have_content('2') # Including admin + end + end + + it 'filters by users who have not enabled 2FA' do + user = create(:user, two_factor_enabled: false) + + visit admin_users_path + click_link '2FA Disabled' + + expect(page).to have_content(user.email) + end + end end describe "GET /admin/users/new" do diff --git a/spec/features/atom/users_spec.rb b/spec/features/atom/users_spec.rb index 770ac04c2c5..dc41be8246f 100644 --- a/spec/features/atom/users_spec.rb +++ b/spec/features/atom/users_spec.rb @@ -14,17 +14,24 @@ describe "User Feed", feature: true do context 'feed content' do let(:project) { create(:project) } let(:issue) do - create(:issue, project: project, - author: user, description: "Houston, we have a bug!\n\n***\n\nI guess.") + create(:issue, + project: project, + author: user, + description: "Houston, we have a bug!\n\n***\n\nI guess.") end let(:note) do - create(:note, noteable: issue, author: user, - note: 'Bug confirmed :+1:', project: project) + create(:note, + noteable: issue, + author: user, + note: 'Bug confirmed :+1:', + project: project) end let(:merge_request) do create(:merge_request, - title: 'Fix bug', author: user, - source_project: project, target_project: project, + title: 'Fix bug', + author: user, + source_project: project, + target_project: project, description: "Here is the fix: ![an image](image.png)") end diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb index 1f2675044d3..158a5c0c29c 100644 --- a/spec/features/issues_spec.rb +++ b/spec/features/issues_spec.rb @@ -36,9 +36,7 @@ describe 'Issues', feature: true do end it 'does not change issue count' do - expect { - click_button 'Save changes' - }.not_to change { Issue.count } + expect { click_button 'Save changes' }.to_not change { Issue.count } end it 'should update issue fields' do @@ -295,7 +293,7 @@ describe 'Issues', feature: true do issue.save end - it 'allows user to remove assignee', :js => true do + it 'allows user to remove assignee', js: true do visit namespace_project_issue_path(project.namespace, project, issue) expect(page).to have_content "Assignee: #{user2.name}" diff --git a/spec/features/notes_on_merge_requests_spec.rb b/spec/features/notes_on_merge_requests_spec.rb index 219bb3129e7..12ab4b844d8 100644 --- a/spec/features/notes_on_merge_requests_spec.rb +++ b/spec/features/notes_on_merge_requests_spec.rb @@ -86,13 +86,13 @@ describe 'Comments' do end # TODO: fix after 7.7 release - #it "should reset the edit note form textarea with the original content of the note if cancelled" do - #within(".current-note-edit-form") do - #fill_in "note[note]", with: "Some new content" - #find(".btn-cancel").click - #expect(find(".js-note-text", visible: false).text).to eq note.note - #end - #end + # it "should reset the edit note form textarea with the original content of the note if cancelled" do + # within(".current-note-edit-form") do + # fill_in "note[note]", with: "Some new content" + # find(".btn-cancel").click + # expect(find(".js-note-text", visible: false).text).to eq note.note + # end + # end it 'appends the edited at time to the note' do page.within('.current-note-edit-form') do diff --git a/spec/features/search_spec.rb b/spec/features/search_spec.rb index 479334f45d8..84c036e59c0 100644 --- a/spec/features/search_spec.rb +++ b/spec/features/search_spec.rb @@ -17,4 +17,3 @@ describe "Search", feature: true do expect(page).to have_content @project.name end end - diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 582c401c55a..8fd3d8f407b 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -40,15 +40,15 @@ describe ApplicationHelper do end describe 'project_icon' do - avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png') + avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif') it 'should return an url for the avatar' do project = create(:project) project.avatar = File.open(avatar_file_path) project.save! - avatar_url = "http://localhost/uploads/project/avatar/#{ project.id }/gitlab_logo.png" + avatar_url = "http://localhost/uploads/project/avatar/#{ project.id }/banana_sample.gif" expect(project_icon("#{project.namespace.to_param}/#{project.to_param}").to_s).to eq( - "<img alt=\"Gitlab logo\" src=\"#{avatar_url}\" />" + "<img alt=\"Banana sample\" src=\"#{avatar_url}\" />" ) end @@ -65,14 +65,14 @@ describe ApplicationHelper do end describe 'avatar_icon' do - avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png') + avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif') it 'should return an url for the avatar' do user = create(:user) user.avatar = File.open(avatar_file_path) user.save! expect(avatar_icon(user.email).to_s). - to match("/uploads/user/avatar/#{ user.id }/gitlab_logo.png") + to match("/uploads/user/avatar/#{ user.id }/banana_sample.gif") end it 'should return an url for the avatar with relative url' do @@ -83,7 +83,7 @@ describe ApplicationHelper do user.avatar = File.open(avatar_file_path) user.save! expect(avatar_icon(user.email).to_s). - to match("/gitlab/uploads/user/avatar/#{ user.id }/gitlab_logo.png") + to match("/gitlab/uploads/user/avatar/#{ user.id }/banana_sample.gif") end it 'should call gravatar_icon when no avatar is present' do diff --git a/spec/helpers/groups_helper.rb b/spec/helpers/groups_helper.rb index 3e99ab84ec9..5d174460681 100644 --- a/spec/helpers/groups_helper.rb +++ b/spec/helpers/groups_helper.rb @@ -2,14 +2,14 @@ require 'spec_helper' describe GroupsHelper do describe 'group_icon' do - avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png') + avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif') it 'should return an url for the avatar' do group = create(:group) group.avatar = File.open(avatar_file_path) group.save! expect(group_icon(group.path).to_s). - to match("/uploads/group/avatar/#{ group.id }/gitlab_logo.png") + to match("/uploads/group/avatar/#{ group.id }/banana_sample.gif") end it 'should give default avatar_icon when no avatar is present' do diff --git a/spec/helpers/oauth_helper_spec.rb b/spec/helpers/oauth_helper_spec.rb index 088c342fa13..3ef35f35102 100644 --- a/spec/helpers/oauth_helper_spec.rb +++ b/spec/helpers/oauth_helper_spec.rb @@ -17,4 +17,4 @@ describe OauthHelper do expect(helper.additional_providers).to eq([]) end end -end
\ No newline at end of file +end diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb index 920de8c4325..d814b562113 100644 --- a/spec/helpers/preferences_helper_spec.rb +++ b/spec/helpers/preferences_helper_spec.rb @@ -61,7 +61,7 @@ describe PreferencesHelper do (1..5).each do |color_scheme_id| context "with color_scheme_id == #{color_scheme_id}" do it 'should return a string' do - current_user = double(:color_scheme_id => color_scheme_id) + current_user = double(color_scheme_id: color_scheme_id) allow(self).to receive(:current_user).and_return(current_user) expect(user_color_scheme_class).to be_kind_of(String) end diff --git a/spec/helpers/tab_helper_spec.rb b/spec/helpers/tab_helper_spec.rb index fc0ceecfbe7..b473c0a7416 100644 --- a/spec/helpers/tab_helper_spec.rb +++ b/spec/helpers/tab_helper_spec.rb @@ -37,8 +37,8 @@ describe TabHelper do end it "passes extra html options to the list element" do - expect(nav_link(action: :foo, html_options: {class: 'home'})).to match(/<li class="home active">/) - expect(nav_link(html_options: {class: 'active'})).to match(/<li class="active">/) + expect(nav_link(action: :foo, html_options: { class: 'home' })).to match(/<li class="home active">/) + expect(nav_link(html_options: { class: 'active' })).to match(/<li class="active">/) end end end diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb index 2013b3e4c2a..c70dd8076e0 100644 --- a/spec/helpers/tree_helper_spec.rb +++ b/spec/helpers/tree_helper_spec.rb @@ -4,10 +4,10 @@ describe TreeHelper do describe 'flatten_tree' do let(:project) { create(:project) } - before { + before do @repository = project.repository @commit = project.commit("e56497bb") - } + end context "on a directory containing more than one file/directory" do let(:tree_item) { double(name: "files", path: "files") } diff --git a/spec/lib/disable_email_interceptor_spec.rb b/spec/lib/disable_email_interceptor_spec.rb index 06d5450688b..a9624e9a2b7 100644 --- a/spec/lib/disable_email_interceptor_spec.rb +++ b/spec/lib/disable_email_interceptor_spec.rb @@ -7,9 +7,7 @@ describe DisableEmailInterceptor do it 'should not send emails' do allow(Gitlab.config.gitlab).to receive(:email_enabled).and_return(false) - expect { - deliver_mail - }.not_to change(ActionMailer::Base.deliveries, :count) + expect { deliver_mail }.not_to change(ActionMailer::Base.deliveries, :count) end after do diff --git a/spec/lib/extracts_path_spec.rb b/spec/lib/extracts_path_spec.rb index 8e05e44defc..f077c80d478 100644 --- a/spec/lib/extracts_path_spec.rb +++ b/spec/lib/extracts_path_spec.rb @@ -18,7 +18,7 @@ describe ExtractsPath do describe '#assign_ref' do let(:ref) { sample_commit[:id] } - let(:params) { {path: sample_commit[:line_code_path], ref: ref} } + let(:params) { { path: sample_commit[:line_code_path], ref: ref } } before do @project = create(:project) diff --git a/spec/lib/file_size_validator_spec.rb b/spec/lib/file_size_validator_spec.rb index 5c89c854714..12ccc051c74 100644 --- a/spec/lib/file_size_validator_spec.rb +++ b/spec/lib/file_size_validator_spec.rb @@ -9,9 +9,9 @@ describe 'Gitlab::FileSizeValidatorSpec' do let(:options) { { maximum: 10, attributes: { attachment: attachment } } } it 'attachment exceeds maximum limit' do - allow(attachment).to receive(:size) { 100 } - validator.validate_each(note, :attachment, attachment) - expect(note.errors).to have_key(:attachment) + allow(attachment).to receive(:size) { 100 } + validator.validate_each(note, :attachment, attachment) + expect(note.errors).to have_key(:attachment) end it 'attachment under maximum limit' do @@ -22,8 +22,13 @@ describe 'Gitlab::FileSizeValidatorSpec' do end describe 'options uses a symbol' do - let(:options) { { maximum: :test, - attributes: { attachment: attachment } } } + let(:options) do + { + maximum: :test, + attributes: { attachment: attachment } + } + end + before do allow(note).to receive(:test) { 10 } end diff --git a/spec/lib/gitlab/asciidoc_spec.rb b/spec/lib/gitlab/asciidoc_spec.rb index 23f83339ec5..03e36fd3552 100644 --- a/spec/lib/gitlab/asciidoc_spec.rb +++ b/spec/lib/gitlab/asciidoc_spec.rb @@ -11,8 +11,11 @@ module Gitlab context "without project" do it "should convert the input using Asciidoctor and default options" do - expected_asciidoc_opts = { safe: :secure, backend: :html5, - attributes: described_class::DEFAULT_ADOC_ATTRS } + expected_asciidoc_opts = { + safe: :secure, + backend: :html5, + attributes: described_class::DEFAULT_ADOC_ATTRS + } expect(Asciidoctor).to receive(:convert) .with(input, expected_asciidoc_opts).and_return(html) @@ -22,11 +25,14 @@ module Gitlab context "with asciidoc_opts" do - let(:asciidoc_opts) { {safe: :safe, attributes: ['foo']} } + let(:asciidoc_opts) { { safe: :safe, attributes: ['foo'] } } it "should merge the options with default ones" do - expected_asciidoc_opts = { safe: :safe, backend: :html5, - attributes: described_class::DEFAULT_ADOC_ATTRS + ['foo'] } + expected_asciidoc_opts = { + safe: :safe, + backend: :html5, + attributes: described_class::DEFAULT_ADOC_ATTRS + ['foo'] + } expect(Asciidoctor).to receive(:convert) .with(input, expected_asciidoc_opts).and_return(html) @@ -38,7 +44,7 @@ module Gitlab context "with project in context" do - let(:context) { {project: create(:project)} } + let(:context) { { project: create(:project) } } it "should filter converted input via HTML pipeline and return result" do filtered_html = '<b>ASCII</b>' diff --git a/spec/lib/gitlab/backend/grack_auth_spec.rb b/spec/lib/gitlab/backend/grack_auth_spec.rb index 42c9946d2a9..d9676445908 100644 --- a/spec/lib/gitlab/backend/grack_auth_spec.rb +++ b/spec/lib/gitlab/backend/grack_auth_spec.rb @@ -6,13 +6,13 @@ describe Grack::Auth do let(:app) { lambda { |env| [200, {}, "Success!"] } } let!(:auth) { Grack::Auth.new(app) } - let(:env) { + let(:env) do { - "rack.input" => "", - "REQUEST_METHOD" => "GET", - "QUERY_STRING" => "service=git-upload-pack" + 'rack.input' => '', + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => 'service=git-upload-pack' } - } + end let(:status) { auth.call(env).first } describe "#call" do @@ -121,7 +121,7 @@ describe Grack::Auth do context "when the user isn't blocked" do before do - expect(Rack::Attack::Allow2Ban).to receive(:reset) + expect(Rack::Attack::Allow2Ban).to receive(:reset) end it "responds with status 200" do diff --git a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb index 0ec6a43f681..f8958c9bab8 100644 --- a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb +++ b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb @@ -2,24 +2,26 @@ require 'spec_helper' describe Gitlab::BitbucketImport::ProjectCreator do let(:user) { create(:user, bitbucket_access_token: "asdffg", bitbucket_access_token_secret: "sekret") } - let(:repo) { { - name: 'Vim', - slug: 'vim', - is_private: true, - owner: "asd"}.with_indifferent_access - } + let(:repo) do + { + name: 'Vim', + slug: 'vim', + is_private: true, + owner: "asd" + }.with_indifferent_access + end let(:namespace){ create(:group, owner: user) } before do namespace.add_owner(user) end - + it 'creates project' do allow_any_instance_of(Project).to receive(:add_import_job) - + project_creator = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, user) project = project_creator.execute - + expect(project.import_url).to eq("ssh://git@bitbucket.org/asd/vim.git") expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) end diff --git a/spec/lib/gitlab/github_import/project_creator_spec.rb b/spec/lib/gitlab/github_import/project_creator_spec.rb index 3bf52cb685e..4fe7bd3b77d 100644 --- a/spec/lib/gitlab/github_import/project_creator_spec.rb +++ b/spec/lib/gitlab/github_import/project_creator_spec.rb @@ -2,14 +2,16 @@ require 'spec_helper' describe Gitlab::GithubImport::ProjectCreator do let(:user) { create(:user, github_access_token: "asdffg") } - let(:repo) { OpenStruct.new( - login: 'vim', - name: 'vim', - private: true, - full_name: 'asd/vim', - clone_url: "https://gitlab.com/asd/vim.git", - owner: OpenStruct.new(login: "john")) - } + let(:repo) do + OpenStruct.new( + login: 'vim', + name: 'vim', + private: true, + full_name: 'asd/vim', + clone_url: "https://gitlab.com/asd/vim.git", + owner: OpenStruct.new(login: "john") + ) + end let(:namespace){ create(:group, owner: user) } before do @@ -18,10 +20,10 @@ describe Gitlab::GithubImport::ProjectCreator do it 'creates project' do allow_any_instance_of(Project).to receive(:add_import_job) - + project_creator = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, user) project = project_creator.execute - + expect(project.import_url).to eq("https://asdffg@gitlab.com/asd/vim.git") expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) end diff --git a/spec/lib/gitlab/gitlab_import/project_creator_spec.rb b/spec/lib/gitlab/gitlab_import/project_creator_spec.rb index 3cefe4ea8e2..938d08396fd 100644 --- a/spec/lib/gitlab/gitlab_import/project_creator_spec.rb +++ b/spec/lib/gitlab/gitlab_import/project_creator_spec.rb @@ -2,14 +2,16 @@ require 'spec_helper' describe Gitlab::GitlabImport::ProjectCreator do let(:user) { create(:user, gitlab_access_token: "asdffg") } - let(:repo) { { - name: 'vim', - path: 'vim', - visibility_level: Gitlab::VisibilityLevel::PRIVATE, - path_with_namespace: 'asd/vim', - http_url_to_repo: "https://gitlab.com/asd/vim.git", - owner: {name: "john"}}.with_indifferent_access - } + let(:repo) do + { + name: 'vim', + path: 'vim', + visibility_level: Gitlab::VisibilityLevel::PRIVATE, + path_with_namespace: 'asd/vim', + http_url_to_repo: "https://gitlab.com/asd/vim.git", + owner: { name: "john" } + }.with_indifferent_access + end let(:namespace){ create(:group, owner: user) } before do @@ -18,10 +20,10 @@ describe Gitlab::GitlabImport::ProjectCreator do it 'creates project' do allow_any_instance_of(Project).to receive(:add_import_job) - + project_creator = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, user) project = project_creator.execute - + expect(project.import_url).to eq("https://oauth2:asdffg@gitlab.com/asd/vim.git") expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) end diff --git a/spec/lib/gitlab/google_code_import/importer_spec.rb b/spec/lib/gitlab/google_code_import/importer_spec.rb index 6a7a31239c3..c53ddeb87b5 100644 --- a/spec/lib/gitlab/google_code_import/importer_spec.rb +++ b/spec/lib/gitlab/google_code_import/importer_spec.rb @@ -4,16 +4,15 @@ describe Gitlab::GoogleCodeImport::Importer do let(:mapped_user) { create(:user, username: "thilo123") } let(:raw_data) { JSON.parse(File.read(Rails.root.join("spec/fixtures/GoogleCodeProjectHosting.json"))) } let(:client) { Gitlab::GoogleCodeImport::Client.new(raw_data) } - let(:import_data) { + let(:import_data) do { - "repo" => client.repo("tint2").raw_data, - "user_map" => { - "thilo..." => "@#{mapped_user.username}" - } - } - } + 'repo' => client.repo('tint2').raw_data, + 'user_map' => { 'thilo...' => "@#{mapped_user.username}" } + } + end let(:project) { create(:project) } - subject { described_class.new(project) } + + subject { described_class.new(project) } before do project.create_import_data(data: import_data) diff --git a/spec/lib/gitlab/google_code_import/project_creator_spec.rb b/spec/lib/gitlab/google_code_import/project_creator_spec.rb index 7a224538b8b..35549b48687 100644 --- a/spec/lib/gitlab/google_code_import/project_creator_spec.rb +++ b/spec/lib/gitlab/google_code_import/project_creator_spec.rb @@ -2,13 +2,13 @@ require 'spec_helper' describe Gitlab::GoogleCodeImport::ProjectCreator do let(:user) { create(:user) } - let(:repo) { + let(:repo) do Gitlab::GoogleCodeImport::Repository.new( - "name" => 'vim', - "summary" => 'VI Improved', - "repositoryUrls" => [ "https://vim.googlecode.com/git/" ] + "name" => 'vim', + "summary" => 'VI Improved', + "repositoryUrls" => ["https://vim.googlecode.com/git/"] ) - } + end let(:namespace){ create(:group, owner: user) } before do @@ -20,7 +20,7 @@ describe Gitlab::GoogleCodeImport::ProjectCreator do project_creator = Gitlab::GoogleCodeImport::ProjectCreator.new(repo, namespace, user) project = project_creator.execute - + expect(project.import_url).to eq("https://vim.googlecode.com/git/") expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC) end diff --git a/spec/lib/gitlab/markdown/autolink_filter_spec.rb b/spec/lib/gitlab/markdown/autolink_filter_spec.rb index a14cb2da089..982be0782c9 100644 --- a/spec/lib/gitlab/markdown/autolink_filter_spec.rb +++ b/spec/lib/gitlab/markdown/autolink_filter_spec.rb @@ -48,7 +48,7 @@ module Gitlab::Markdown end it 'accepts link_attr options' do - doc = filter("See #{link}", link_attr: {class: 'custom'}) + doc = filter("See #{link}", link_attr: { class: 'custom' }) expect(doc.at_css('a')['class']).to eq 'custom' end @@ -89,7 +89,7 @@ module Gitlab::Markdown end it 'accepts link_attr options' do - doc = filter("See #{link}", link_attr: {class: 'custom'}) + doc = filter("See #{link}", link_attr: { class: 'custom' }) expect(doc.at_css('a')['class']).to eq 'custom' end diff --git a/spec/lib/gitlab/markdown/label_reference_filter_spec.rb b/spec/lib/gitlab/markdown/label_reference_filter_spec.rb index cf3337b1ba1..e9f8ed277a5 100644 --- a/spec/lib/gitlab/markdown/label_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/label_reference_filter_spec.rb @@ -127,7 +127,7 @@ module Gitlab::Markdown it 'gracefully handles non-references matching the pattern' do exp = act = '(format nil "~0f" 3.0) ; 3.0' expect(filter(act).to_html).to eq exp - end + end end end end diff --git a/spec/lib/gitlab/o_auth/auth_hash_spec.rb b/spec/lib/gitlab/o_auth/auth_hash_spec.rb index 5404b506813..4c0a4a49d2a 100644 --- a/spec/lib/gitlab/o_auth/auth_hash_spec.rb +++ b/spec/lib/gitlab/o_auth/auth_hash_spec.rb @@ -11,9 +11,9 @@ describe Gitlab::OAuth::AuthHash do ) end - let(:uid_raw) { + let(:uid_raw) do "CN=Onur K\xC3\xBC\xC3\xA7\xC3\xBCk,OU=Test,DC=example,DC=net" - } + end let(:email_raw) { "onur.k\xC3\xBC\xC3\xA7\xC3\xBCk@example.net" } let(:nickname_raw) { "ok\xC3\xBC\xC3\xA7\xC3\xBCk" } let(:first_name_raw) { 'Onur' } @@ -34,16 +34,16 @@ describe Gitlab::OAuth::AuthHash do let(:nickname_utf8) { nickname_ascii.force_encoding(Encoding::UTF_8) } let(:name_utf8) { name_ascii.force_encoding(Encoding::UTF_8) } - let(:info_hash) { + let(:info_hash) do { - email: email_ascii, + email: email_ascii, first_name: first_name_ascii, - last_name: last_name_ascii, - name: name_ascii, - nickname: nickname_ascii, - uid: uid_ascii + last_name: last_name_ascii, + name: name_ascii, + nickname: nickname_ascii, + uid: uid_ascii } - } + end context 'defaults' do it { expect(auth_hash.provider).to eql provider_utf8 } diff --git a/spec/lib/gitlab/popen_spec.rb b/spec/lib/gitlab/popen_spec.rb index f80d306cfc6..e53efec6c67 100644 --- a/spec/lib/gitlab/popen_spec.rb +++ b/spec/lib/gitlab/popen_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe 'Gitlab::Popen', no_db: true do - let (:path) { Rails.root.join('tmp').to_s } + let(:path) { Rails.root.join('tmp').to_s } before do @klass = Class.new(Object) @@ -40,6 +40,4 @@ describe 'Gitlab::Popen', no_db: true do it { expect(@status).to be_zero } it { expect(@output).to include('spec') } end - end - diff --git a/spec/lib/gitlab/satellite/action_spec.rb b/spec/lib/gitlab/satellite/action_spec.rb index 28e3d64ee2b..0a93676edc3 100644 --- a/spec/lib/gitlab/satellite/action_spec.rb +++ b/spec/lib/gitlab/satellite/action_spec.rb @@ -17,15 +17,13 @@ describe 'Gitlab::Satellite::Action' do starting_remote_count = repo.git.list_remotes.size expect(starting_remote_count).to be >= 1 #kind of hookey way to add a second remote - origin_uri = repo.git.remote({v: true}).split(" ")[1] - begin - repo.git.remote({raise: true}, 'add', 'another-remote', origin_uri) - repo.git.branch({raise: true}, 'a-new-branch') + origin_uri = repo.git.remote({ v: true }).split(" ")[1] + + repo.git.remote({ raise: true }, 'add', 'another-remote', origin_uri) + repo.git.branch({ raise: true }, 'a-new-branch') expect(repo.heads.size).to be > (starting_remote_count) expect(repo.git.remote().split(" ").size).to be > (starting_remote_count) - rescue - end repo.git.config({}, "user.name", "#{user.name} -- foo") repo.git.config({}, "user.email", "#{user.email} -- foo") @@ -35,10 +33,10 @@ describe 'Gitlab::Satellite::Action' do #These must happen in the context of the satellite directory... satellite_action = Gitlab::Satellite::Action.new(user, project) - project.satellite.lock { + project.satellite.lock do #Now clean it up, use send to get around prepare_satellite! being protected satellite_action.send(:prepare_satellite!, repo) - } + end #verify it's clean heads = repo.heads.map(&:name) @@ -100,16 +98,16 @@ describe 'Gitlab::Satellite::Action' do def flocked?(&block) status = flock LOCK_EX|LOCK_NB case status - when false - return true - when 0 - begin - block ? block.call : false - ensure - flock LOCK_UN - end - else - raise SystemCallError, status + when false + return true + when 0 + begin + block ? block.call : false + ensure + flock LOCK_UN + end + else + raise SystemCallError, status end end end diff --git a/spec/lib/gitlab/satellite/merge_action_spec.rb b/spec/lib/gitlab/satellite/merge_action_spec.rb index 5cc8b0f21fb..9b1c9a34e29 100644 --- a/spec/lib/gitlab/satellite/merge_action_spec.rb +++ b/spec/lib/gitlab/satellite/merge_action_spec.rb @@ -82,23 +82,23 @@ describe 'Gitlab::Satellite::MergeAction' do describe '#can_be_merged?' do context 'on fork' do - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request_fork.author, - merge_request_fork).can_be_merged?).to be_truthy } + it do + expect(Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).can_be_merged?).to be_truthy + end - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request_fork_with_conflict.author, - merge_request_fork_with_conflict).can_be_merged?).to be_falsey } + it do + expect(Gitlab::Satellite::MergeAction.new(merge_request_fork_with_conflict.author, merge_request_fork_with_conflict).can_be_merged?).to be_falsey + end end context 'between branches' do - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request.author, - merge_request).can_be_merged?).to be_truthy } + it do + expect(Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).can_be_merged?).to be_truthy + end - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request_with_conflict.author, - merge_request_with_conflict).can_be_merged?).to be_falsey } + it do + expect(Gitlab::Satellite::MergeAction.new(merge_request_with_conflict.author, merge_request_with_conflict).can_be_merged?).to be_falsey + end end end end diff --git a/spec/lib/gitlab/version_info_spec.rb b/spec/lib/gitlab/version_info_spec.rb index 5afeb1c1ec3..18f71b40fe0 100644 --- a/spec/lib/gitlab/version_info_spec.rb +++ b/spec/lib/gitlab/version_info_spec.rb @@ -66,4 +66,3 @@ describe 'Gitlab::VersionInfo', no_db: true do it { expect(@unknown.to_s).to eq("Unknown") } end end - diff --git a/spec/lib/votes_spec.rb b/spec/lib/votes_spec.rb index df243a26008..39e5d054e62 100644 --- a/spec/lib/votes_spec.rb +++ b/spec/lib/votes_spec.rb @@ -179,7 +179,10 @@ describe Issue, 'Votes' do def add_note(text, author = issue.author) created_at = Time.now - 1.hour + Note.count.seconds - issue.notes << create(:note, note: text, project: issue.project, - author_id: author.id, created_at: created_at) + issue.notes << create(:note, + note: text, + project: issue.project, + author_id: author.id, + created_at: created_at) end end diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index 89853d05161..97c07ad7d55 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -419,9 +419,7 @@ describe Notify do describe 'project access changed' do let(:project) { create(:project) } let(:user) { create(:user) } - let(:project_member) { create(:project_member, - project: project, - user: user) } + let(:project_member) { create(:project_member, project: project, user: user) } subject { Notify.project_access_granted_email(project_member.id) } it_behaves_like 'an email sent from GitLab' diff --git a/spec/models/commit_range_spec.rb b/spec/models/commit_range_spec.rb index e3ab4812464..1031af097bd 100644 --- a/spec/models/commit_range_spec.rb +++ b/spec/models/commit_range_spec.rb @@ -60,11 +60,11 @@ describe CommitRange do end it 'includes the correct values for a three-dot range' do - expect(range.to_param).to eq({from: sha_from, to: sha_to}) + expect(range.to_param).to eq({ from: sha_from, to: sha_to }) end it 'includes the correct values for a two-dot range' do - expect(range2.to_param).to eq({from: sha_from + '^', to: sha_to}) + expect(range2.to_param).to eq({ from: sha_from + '^', to: sha_to }) end end diff --git a/spec/models/deploy_keys_project_spec.rb b/spec/models/deploy_keys_project_spec.rb index 705ef257d86..0eb22599d18 100644 --- a/spec/models/deploy_keys_project_spec.rb +++ b/spec/models/deploy_keys_project_spec.rb @@ -44,9 +44,7 @@ describe DeployKeysProject do it "destroys the deploy key" do subject.destroy - expect { - deploy_key.reload - }.to raise_error(ActiveRecord::RecordNotFound) + expect { deploy_key.reload }.to raise_error(ActiveRecord::RecordNotFound) end end end diff --git a/spec/models/hooks/service_hook_spec.rb b/spec/models/hooks/service_hook_spec.rb index a218b327d76..4c8b8910ae7 100644 --- a/spec/models/hooks/service_hook_spec.rb +++ b/spec/models/hooks/service_hook_spec.rb @@ -26,7 +26,7 @@ describe ServiceHook do describe "execute" do before(:each) do @service_hook = create(:service_hook) - @data = { project_id: 1, data: {}} + @data = { project_id: 1, data: {} } WebMock.stub_request(:post, @service_hook.url) end @@ -34,7 +34,7 @@ describe ServiceHook do it "POSTs to the web hook URL" do @service_hook.execute(@data) expect(WebMock).to have_requested(:post, @service_hook.url).with( - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Service Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Service Hook' } ).once end @@ -43,16 +43,14 @@ describe ServiceHook do @service_hook.execute(@data) expect(WebMock).to have_requested(:post, @service_hook.url).with( - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Service Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Service Hook' } ).once end it "catches exceptions" do expect(WebHook).to receive(:post).and_raise("Some HTTP Post error") - expect { - @service_hook.execute(@data) - }.to raise_error(RuntimeError) + expect { @service_hook.execute(@data) }.to raise_error(RuntimeError) end end end diff --git a/spec/models/hooks/system_hook_spec.rb b/spec/models/hooks/system_hook_spec.rb index edb21fc2e47..4175f9dd88f 100644 --- a/spec/models/hooks/system_hook_spec.rb +++ b/spec/models/hooks/system_hook_spec.rb @@ -29,7 +29,7 @@ describe SystemHook do Projects::CreateService.new(create(:user), name: 'empty').execute expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /project_create/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -39,7 +39,7 @@ describe SystemHook do Projects::DestroyService.new(project, user, {}).execute expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /project_destroy/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -47,7 +47,7 @@ describe SystemHook do create(:user) expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /user_create/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -56,7 +56,7 @@ describe SystemHook do user.destroy expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /user_destroy/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -66,7 +66,7 @@ describe SystemHook do project.team << [user, :master] expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /user_add_to_team/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -77,7 +77,7 @@ describe SystemHook do project.project_members.destroy_all expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /user_remove_from_team/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -85,7 +85,7 @@ describe SystemHook do create(:group) expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /group_create/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -94,7 +94,7 @@ describe SystemHook do group.destroy expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /group_destroy/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -104,7 +104,7 @@ describe SystemHook do group.add_user(user, Gitlab::Access::MASTER) expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /user_add_to_group/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end @@ -115,7 +115,7 @@ describe SystemHook do group.group_members.destroy_all expect(WebMock).to have_requested(:post, @system_hook.url).with( body: /user_remove_from_group/, - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'System Hook' } ).once end diff --git a/spec/models/hooks/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb index b51e6b4e619..23f30881d99 100644 --- a/spec/models/hooks/web_hook_spec.rb +++ b/spec/models/hooks/web_hook_spec.rb @@ -47,7 +47,7 @@ describe ProjectHook do @project_hook = create(:project_hook) @project = create(:project) @project.hooks << [@project_hook] - @data = { before: 'oldrev', after: 'newrev', ref: 'ref'} + @data = { before: 'oldrev', after: 'newrev', ref: 'ref' } WebMock.stub_request(:post, @project_hook.url) end @@ -55,7 +55,7 @@ describe ProjectHook do it "POSTs to the web hook URL" do @project_hook.execute(@data, 'push_hooks') expect(WebMock).to have_requested(:post, @project_hook.url).with( - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Push Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Push Hook' } ).once end @@ -64,16 +64,14 @@ describe ProjectHook do @project_hook.execute(@data, 'push_hooks') expect(WebMock).to have_requested(:post, @project_hook.url).with( - headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Push Hook'} + headers: { 'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Push Hook' } ).once end it "catches exceptions" do expect(WebHook).to receive(:post).and_raise("Some HTTP Post error") - expect { - @project_hook.execute(@data, 'push_hooks') - }.to raise_error(RuntimeError) + expect { @project_hook.execute(@data, 'push_hooks') }.to raise_error(RuntimeError) end end end diff --git a/spec/models/project_security_spec.rb b/spec/models/project_security_spec.rb index 1ee19003543..f600a240c46 100644 --- a/spec/models/project_security_spec.rb +++ b/spec/models/project_security_spec.rb @@ -110,17 +110,3 @@ describe Project do end end end -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) -# path :string(255) -# description :text -# created_at :datetime -# updated_at :datetime -# private_flag :boolean default(TRUE), not null -# code :string(255) -# - diff --git a/spec/models/project_services/hipchat_service_spec.rb b/spec/models/project_services/hipchat_service_spec.rb index 8ed03dd1da8..4707673269a 100644 --- a/spec/models/project_services/hipchat_service_spec.rb +++ b/spec/models/project_services/hipchat_service_spec.rb @@ -241,17 +241,17 @@ describe HipchatService do context "#message_options" do it "should be set to the defaults" do - expect(hipchat.send(:message_options)).to eq({notify: false, color: 'yellow'}) + expect(hipchat.send(:message_options)).to eq({ notify: false, color: 'yellow' }) end it "should set notfiy to true" do allow(hipchat).to receive(:notify).and_return('1') - expect(hipchat.send(:message_options)).to eq({notify: true, color: 'yellow'}) + expect(hipchat.send(:message_options)).to eq({ notify: true, color: 'yellow' }) end it "should set the color" do allow(hipchat).to receive(:color).and_return('red') - expect(hipchat.send(:message_options)).to eq({notify: false, color: 'red'}) + expect(hipchat.send(:message_options)).to eq({ notify: false, color: 'red' }) end end end diff --git a/spec/models/project_services/slack_service/issue_message_spec.rb b/spec/models/project_services/slack_service/issue_message_spec.rb index 8bca1fef44c..b78d92f23a1 100644 --- a/spec/models/project_services/slack_service/issue_message_spec.rb +++ b/spec/models/project_services/slack_service/issue_message_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe SlackService::IssueMessage do subject { SlackService::IssueMessage.new(args) } - let(:args) { + let(:args) do { user: { name: 'Test User', @@ -23,7 +23,7 @@ describe SlackService::IssueMessage do description: 'issue description' } } - } + end let(:color) { '#345' } diff --git a/spec/models/project_services/slack_service/merge_message_spec.rb b/spec/models/project_services/slack_service/merge_message_spec.rb index aeb408aa766..581c50d6c88 100644 --- a/spec/models/project_services/slack_service/merge_message_spec.rb +++ b/spec/models/project_services/slack_service/merge_message_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe SlackService::MergeMessage do subject { SlackService::MergeMessage.new(args) } - let(:args) { + let(:args) do { user: { name: 'Test User', @@ -24,7 +24,7 @@ describe SlackService::MergeMessage do target_branch: 'target_branch', } } - } + end let(:color) { '#345' } diff --git a/spec/models/project_services/slack_service/push_message_spec.rb b/spec/models/project_services/slack_service/push_message_spec.rb index 10963481a12..ddc290820d1 100644 --- a/spec/models/project_services/slack_service/push_message_spec.rb +++ b/spec/models/project_services/slack_service/push_message_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe SlackService::PushMessage do subject { SlackService::PushMessage.new(args) } - let(:args) { + let(:args) do { after: 'after', before: 'before', @@ -12,7 +12,7 @@ describe SlackService::PushMessage do user_name: 'user_name', project_url: 'url' } - } + end let(:color) { '#345' } @@ -40,16 +40,16 @@ describe SlackService::PushMessage do end context 'tag push' do - let(:args) { + let(:args) do { - after: 'after', - before: Gitlab::Git::BLANK_SHA, - project_name: 'project_name', - ref: 'refs/tags/new_tag', - user_name: 'user_name', - project_url: 'url' + after: 'after', + before: Gitlab::Git::BLANK_SHA, + project_name: 'project_name', + ref: 'refs/tags/new_tag', + user_name: 'user_name', + project_url: 'url' } - } + end it 'returns a message regarding pushes' do expect(subject.pretext).to eq('user_name pushed new tag ' \ diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb index 19201cc15a7..d125166e336 100644 --- a/spec/models/project_team_spec.rb +++ b/spec/models/project_team_spec.rb @@ -67,4 +67,3 @@ describe ProjectTeam do end end end - diff --git a/spec/models/project_wiki_spec.rb b/spec/models/project_wiki_spec.rb index 2acdb7dfddc..f785203af7d 100644 --- a/spec/models/project_wiki_spec.rb +++ b/spec/models/project_wiki_spec.rb @@ -231,7 +231,7 @@ describe ProjectWiki do end def commit_details - commit = {name: user.name, email: user.email, message: "test commit"} + commit = { name: user.name, email: user.email, message: "test commit" } end def create_page(name, content) diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb index cb633216d3b..ca11758ee06 100644 --- a/spec/models/service_spec.rb +++ b/spec/models/service_spec.rb @@ -36,7 +36,7 @@ describe Service do end describe "Testable" do - let (:project) { create :project } + let(:project) { create :project } before do allow(@service).to receive(:project).and_return(project) @@ -49,7 +49,7 @@ describe Service do end describe "With commits" do - let (:project) { create :project } + let(:project) { create :project } before do allow(@service).to receive(:project).and_return(project) @@ -64,9 +64,16 @@ describe Service do describe "Template" do describe "for pushover service" do - let(:service_template) { - PushoverService.create(template: true, properties: {device: 'MyDevice', sound: 'mic', priority: 4, api_key: '123456789'}) - } + let(:service_template) do + PushoverService.create( + template: true, + properties: { + device: 'MyDevice', + sound: 'mic', + priority: 4, + api_key: '123456789' + }) + end let(:project) { create(:project) } describe 'should be prefilled for projects pushover service' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 9f7c83f3476..b80273c053d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -50,12 +50,12 @@ # bitbucket_access_token :string(255) # bitbucket_access_token_secret :string(255) # location :string(255) -# public_email :string(255) default(""), not null # encrypted_otp_secret :string(255) # encrypted_otp_secret_iv :string(255) # encrypted_otp_secret_salt :string(255) -# otp_required_for_login :boolean +# otp_required_for_login :boolean default(FALSE), not null # otp_backup_codes :text +# public_email :string(255) default(""), not null # dashboard :integer default(0) # @@ -210,30 +210,6 @@ describe User do end end - describe '#two_factor_enabled' do - it 'returns two-factor authentication status' do - enabled = build_stubbed(:user, two_factor_enabled: true) - disabled = build_stubbed(:user) - - expect(enabled).to be_two_factor_enabled - expect(disabled).not_to be_two_factor_enabled - end - end - - describe '#two_factor_enabled=' do - it 'enables two-factor authentication' do - user = build_stubbed(:user, two_factor_enabled: false) - expect { user.two_factor_enabled = true }. - to change { user.two_factor_enabled? }.to(true) - end - - it 'disables two-factor authentication' do - user = build_stubbed(:user, two_factor_enabled: true) - expect { user.two_factor_enabled = false }. - to change { user.two_factor_enabled? }.to(false) - end - end - describe 'authentication token' do it "should have authentication token" do user = create(:user) @@ -308,18 +284,44 @@ describe User do end end - describe 'filter' do - before do - User.delete_all - @user = create :user - @admin = create :user, admin: true - @blocked = create :user, state: :blocked + describe '.filter' do + let(:user) { double } + + it 'filters by active users by default' do + expect(User).to receive(:active).and_return([user]) + + expect(User.filter(nil)).to include user + end + + it 'filters by admins' do + expect(User).to receive(:admins).and_return([user]) + + expect(User.filter('admins')).to include user end - it { expect(User.filter("admins")).to eq([@admin]) } - it { expect(User.filter("blocked")).to eq([@blocked]) } - it { expect(User.filter("wop")).to include(@user, @admin, @blocked) } - it { expect(User.filter(nil)).to include(@user, @admin) } + it 'filters by blocked' do + expect(User).to receive(:blocked).and_return([user]) + + expect(User.filter('blocked')).to include user + end + + it 'filters by two_factor_disabled' do + expect(User).to receive(:without_two_factor).and_return([user]) + + expect(User.filter('two_factor_disabled')).to include user + end + + it 'filters by two_factor_enabled' do + expect(User).to receive(:with_two_factor).and_return([user]) + + expect(User.filter('two_factor_enabled')).to include user + end + + it 'filters by wop' do + expect(User).to receive(:without_projects).and_return([user]) + + expect(User.filter('wop')).to include user + end end describe :not_in_project do diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index fceb7668cac..dc84a14bb40 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -43,7 +43,7 @@ describe WikiPage do describe "validations" do before do - subject.attributes = {title: 'title', content: 'content'} + subject.attributes = { title: 'title', content: 'content' } end it "validates presence of title" do @@ -58,7 +58,7 @@ describe WikiPage do end before do - @wiki_attr = {title: "Index", content: "Home Page", format: "markdown"} + @wiki_attr = { title: "Index", content: "Home Page", format: "markdown" } end describe "#create" do @@ -82,7 +82,7 @@ describe WikiPage do let(:title) { 'Index v1.2.3' } before do - @wiki_attr = {title: title, content: "Home Page", format: "markdown"} + @wiki_attr = { title: title, content: "Home Page", format: "markdown" } end describe "#create" do @@ -196,7 +196,7 @@ describe WikiPage do end def commit_details - commit = {name: user.name, email: user.email, message: "test commit"} + commit = { name: user.name, email: user.email, message: "test commit" } end def create_page(name, content) diff --git a/spec/requests/api/doorkeeper_access_spec.rb b/spec/requests/api/doorkeeper_access_spec.rb index 39949a90422..0afc3e79339 100644 --- a/spec/requests/api/doorkeeper_access_spec.rb +++ b/spec/requests/api/doorkeeper_access_spec.rb @@ -4,20 +4,20 @@ describe API::API, api: true do include ApiHelpers let!(:user) { create(:user) } - let!(:application) { Doorkeeper::Application.create!(:name => "MyApp", :redirect_uri => "https://app.com", :owner => user) } - let!(:token) { Doorkeeper::AccessToken.create! :application_id => application.id, :resource_owner_id => user.id } + let!(:application) { Doorkeeper::Application.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } + let!(:token) { Doorkeeper::AccessToken.create! application_id: application.id, resource_owner_id: user.id } + - describe "when unauthenticated" do it "returns authentication success" do - get api("/user"), :access_token => token.token + get api("/user"), access_token: token.token expect(response.status).to eq(200) end end describe "when token invalid" do it "returns authentication error" do - get api("/user"), :access_token => "123a" + get api("/user"), access_token: "123a" expect(response.status).to eq(401) end end diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb index 8a6b4b8a170..6c7860511e8 100644 --- a/spec/requests/api/files_spec.rb +++ b/spec/requests/api/files_spec.rb @@ -39,14 +39,14 @@ describe API::API, api: true do end describe "POST /projects/:id/repository/files" do - let(:valid_params) { + let(:valid_params) do { file_path: 'newfile.rb', branch_name: 'master', content: 'puts 8', commit_message: 'Added newfile' } - } + end it "should create a new file in project repo" do post api("/projects/#{project.id}/repository/files", user), valid_params @@ -69,14 +69,14 @@ describe API::API, api: true do end describe "PUT /projects/:id/repository/files" do - let(:valid_params) { + let(:valid_params) do { file_path: file_path, branch_name: 'master', content: 'puts 8', commit_message: 'Changed file' } - } + end it "should update existing file in project repo" do put api("/projects/#{project.id}/repository/files", user), valid_params @@ -91,13 +91,13 @@ describe API::API, api: true do end describe "DELETE /projects/:id/repository/files" do - let(:valid_params) { + let(:valid_params) do { file_path: file_path, branch_name: 'master', commit_message: 'Changed file' } - } + end it "should delete existing file in project repo" do delete api("/projects/#{project.id}/repository/files", user), valid_params diff --git a/spec/requests/api/fork_spec.rb b/spec/requests/api/fork_spec.rb index 7a784796031..3fe7efff5ba 100644 --- a/spec/requests/api/fork_spec.rb +++ b/spec/requests/api/fork_spec.rb @@ -6,15 +6,14 @@ describe API::API, api: true do let(:user2) { create(:user) } let(:user3) { create(:user) } let(:admin) { create(:admin) } - let(:project) { - create(:project, creator_id: user.id, - namespace: user.namespace) - } - let(:project_user2) { - create(:project_member, user: user2, - project: project, - access_level: ProjectMember::GUEST) - } + + let(:project) do + create(:project, creator_id: user.id, namespace: user.namespace) + end + + let(:project_user2) do + create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) + end describe 'POST /projects/fork/:id' do before { project_user2 } diff --git a/spec/requests/api/group_members_spec.rb b/spec/requests/api/group_members_spec.rb index 8ba6876a95b..dd5baa44cb2 100644 --- a/spec/requests/api/group_members_spec.rb +++ b/spec/requests/api/group_members_spec.rb @@ -61,10 +61,9 @@ describe API::API, api: true do it "should return ok and add new member" do new_user = create(:user) - expect { - post api("/groups/#{group_no_members.id}/members", owner), - user_id: new_user.id, access_level: GroupMember::MASTER - }.to change { group_no_members.members.count }.by(1) + expect do + post api("/groups/#{group_no_members.id}/members", owner), user_id: new_user.id, access_level: GroupMember::MASTER + end.to change { group_no_members.members.count }.by(1) expect(response.status).to eq(201) expect(json_response['name']).to eq(new_user.name) @@ -74,10 +73,9 @@ describe API::API, api: true do it "should not allow guest to modify group members" do new_user = create(:user) - expect { - post api("/groups/#{group_with_members.id}/members", guest), - user_id: new_user.id, access_level: GroupMember::MASTER - }.not_to change { group_with_members.members.count } + expect do + post api("/groups/#{group_with_members.id}/members", guest), user_id: new_user.id, access_level: GroupMember::MASTER + end.not_to change { group_with_members.members.count } expect(response.status).to eq(403) end @@ -178,9 +176,9 @@ describe API::API, api: true do context "when a member of the group" do it "should delete guest's membership of group" do - expect { + expect do delete api("/groups/#{group_with_members.id}/members/#{guest.id}", owner) - }.to change { group_with_members.members.count }.by(-1) + end.to change { group_with_members.members.count }.by(-1) expect(response.status).to eq(200) end diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb index 56aa97adcc3..c5a4ac7e4c4 100644 --- a/spec/requests/api/groups_spec.rb +++ b/spec/requests/api/groups_spec.rb @@ -109,18 +109,18 @@ describe API::API, api: true do end it "should not create group, duplicate" do - post api("/groups", user3), {name: 'Duplicate Test', path: group2.path} + post api("/groups", user3), { name: 'Duplicate Test', path: group2.path } expect(response.status).to eq(400) expect(response.message).to eq("Bad Request") end it "should return 400 bad request error if name not given" do - post api("/groups", user3), {path: group2.path} + post api("/groups", user3), { path: group2.path } expect(response.status).to eq(400) end it "should return 400 bad request error if path not given" do - post api("/groups", user3), {name: 'test'} + post api("/groups", user3), { name: 'test' } expect(response.status).to eq(400) end end diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 2887221fb46..7030c105b58 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -8,9 +8,10 @@ describe API::API, api: true do let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test") } let!(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignee: user, source_project: project, target_project: project, title: "Merged test") } let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") } - before { + + before do project.team << [user, :reporters] - } + end describe "GET /projects/:id/merge_requests" do context "when unauthenticated" do diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb index 81fe68de662..5037575d355 100644 --- a/spec/requests/api/project_hooks_spec.rb +++ b/spec/requests/api/project_hooks_spec.rb @@ -61,10 +61,9 @@ describe API::API, 'ProjectHooks', api: true do describe "POST /projects/:id/hooks" do it "should add hook to project" do - expect { - post api("/projects/#{project.id}/hooks", user), - url: "http://example.com", issues_events: true - }.to change {project.hooks.count}.by(1) + expect do + post api("/projects/#{project.id}/hooks", user), url: "http://example.com", issues_events: true + end.to change {project.hooks.count}.by(1) expect(response.status).to eq(201) end @@ -105,9 +104,9 @@ describe API::API, 'ProjectHooks', api: true do describe "DELETE /projects/:id/hooks/:hook_id" do it "should delete hook from project" do - expect { + expect do delete api("/projects/#{project.id}/hooks/#{hook.id}", user) - }.to change {project.hooks.count}.by(-1) + end.to change {project.hooks.count}.by(-1) expect(response.status).to eq(200) end diff --git a/spec/requests/api/project_members_spec.rb b/spec/requests/api/project_members_spec.rb index 4aeaa02f958..6358f6a2a4a 100644 --- a/spec/requests/api/project_members_spec.rb +++ b/spec/requests/api/project_members_spec.rb @@ -53,10 +53,9 @@ describe API::API, api: true do describe "POST /projects/:id/members" do it "should add user to project team" do - expect { - post api("/projects/#{project.id}/members", user), user_id: user2.id, - access_level: ProjectMember::DEVELOPER - }.to change { ProjectMember.count }.by(1) + expect do + post api("/projects/#{project.id}/members", user), user_id: user2.id, access_level: ProjectMember::DEVELOPER + end.to change { ProjectMember.count }.by(1) expect(response.status).to eq(201) expect(json_response['username']).to eq(user2.username) @@ -64,12 +63,12 @@ describe API::API, api: true do end it "should return a 201 status if user is already project member" do - post api("/projects/#{project.id}/members", user), user_id: user2.id, - access_level: ProjectMember::DEVELOPER - expect { - post api("/projects/#{project.id}/members", user), user_id: user2.id, - access_level: ProjectMember::DEVELOPER - }.not_to change { ProjectMember.count } + post api("/projects/#{project.id}/members", user), + user_id: user2.id, + access_level: ProjectMember::DEVELOPER + expect do + post api("/projects/#{project.id}/members", user), user_id: user2.id, access_level: ProjectMember::DEVELOPER + end.not_to change { ProjectMember.count } expect(response.status).to eq(201) expect(json_response['username']).to eq(user2.username) @@ -123,16 +122,16 @@ describe API::API, api: true do before { project_member2 } it "should remove user from project team" do - expect { + expect do delete api("/projects/#{project.id}/members/#{user3.id}", user) - }.to change { ProjectMember.count }.by(-1) + end.to change { ProjectMember.count }.by(-1) end it "should return 200 if team member is not part of a project" do delete api("/projects/#{project.id}/members/#{user3.id}", user) - expect { + expect do delete api("/projects/#{project.id}/members/#{user3.id}", user) - }.not_to change { ProjectMember.count } + end.to_not change { ProjectMember.count } end it "should return 200 if team member already removed" do @@ -142,9 +141,9 @@ describe API::API, api: true do end it "should return 200 OK when the user was not member" do - expect { + expect do delete api("/projects/#{project.id}/members/1000000", user) - }.to change { ProjectMember.count }.by(0) + end.to change { ProjectMember.count }.by(0) expect(response.status).to eq(200) expect(json_response['message']).to eq("Access revoked") expect(json_response['id']).to eq(1000000) diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 1386c03cb21..e9ff832603f 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -81,7 +81,7 @@ describe API::API, api: true do end it 'should return the correct order when sorted by id' do - get api('/projects', user), { order_by: 'id', sort: 'desc'} + get api('/projects', user), { order_by: 'id', sort: 'desc' } expect(response.status).to eq(200) expect(json_response).to be_an Array expect(json_response.first['id']).to eq(project3.id) @@ -90,7 +90,7 @@ describe API::API, api: true do it 'returns projects in the correct order when ci_enabled_first parameter is passed' do [project, project2, project3].each{ |project| project.build_missing_services } project2.gitlab_ci_service.update(active: true, token: "token", project_url: "url") - get api('/projects', user), { ci_enabled_first: 'true'} + get api('/projects', user), { ci_enabled_first: 'true' } expect(response.status).to eq(200) expect(json_response).to be_an Array expect(json_response.first['id']).to eq(project2.id) @@ -125,7 +125,7 @@ describe API::API, api: true do expect(json_response).to satisfy do |response| response.one? do |entry| entry['name'] == project.name && - entry['owner']['username'] == user.username + entry['owner']['username'] == user.username end end end @@ -471,9 +471,9 @@ describe API::API, api: true do before { snippet } it 'should delete existing project snippet' do - expect { + expect do delete api("/projects/#{project.id}/snippets/#{snippet.id}", user) - }.to change { Snippet.count }.by(-1) + end.to change { Snippet.count }.by(-1) expect(response.status).to eq(200) end @@ -545,9 +545,9 @@ describe API::API, api: true do it 'should create new ssh key' do key_attrs = attributes_for :key - expect { + expect do post api("/projects/#{project.id}/keys", user), key_attrs - }.to change{ project.deploy_keys.count }.by(1) + end.to change{ project.deploy_keys.count }.by(1) end end @@ -555,9 +555,9 @@ describe API::API, api: true do before { deploy_key } it 'should delete existing key' do - expect { + expect do delete api("/projects/#{project.id}/keys/#{deploy_key.id}", user) - }.to change{ project.deploy_keys.count }.by(-1) + end.to change{ project.deploy_keys.count }.by(-1) end it 'should return 404 Not Found with invalid ID' do diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb index 2c691f72f15..3e676515488 100644 --- a/spec/requests/api/system_hooks_spec.rb +++ b/spec/requests/api/system_hooks_spec.rb @@ -36,9 +36,9 @@ describe API::API, api: true do describe "POST /hooks" do it "should create new hook" do - expect { + expect do post api("/hooks", admin), url: 'http://example.com' - }.to change { SystemHook.count }.by(1) + end.to change { SystemHook.count }.by(1) end it "should respond with 400 if url not given" do @@ -47,9 +47,9 @@ describe API::API, api: true do end it "should not create new hook without url" do - expect { + expect do post api("/hooks", admin) - }.not_to change { SystemHook.count } + end.to_not change { SystemHook.count } end end @@ -68,9 +68,9 @@ describe API::API, api: true do describe "DELETE /hooks/:id" do it "should delete a hook" do - expect { + expect do delete api("/hooks/#{hook.id}", admin) - }.to change { SystemHook.count }.by(-1) + end.to change { SystemHook.count }.by(-1) end it "should return success if hook id not found" do diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb index 327f3e6d23c..c10998e171f 100644 --- a/spec/requests/api/users_spec.rb +++ b/spec/requests/api/users_spec.rb @@ -21,9 +21,9 @@ describe API::API, api: true do expect(response.status).to eq(200) expect(json_response).to be_an Array username = user.username - expect(json_response.detect { - |user| user['username'] == username - }['username']).to eq(username) + expect(json_response.detect do |user| + user['username'] == username + end['username']).to eq(username) end end @@ -62,9 +62,9 @@ describe API::API, api: true do before{ admin } it "should create user" do - expect { + expect do post api("/users", admin), attributes_for(:user, projects_limit: 3) - }.to change { User.count }.by(1) + end.to change { User.count }.by(1) end it "should create user with correct attributes" do @@ -103,9 +103,9 @@ describe API::API, api: true do it "should not create user with invalid email" do post api('/users', admin), - email: 'invalid email', - password: 'password', - name: 'test' + email: 'invalid email', + password: 'password', + name: 'test' expect(response.status).to eq(400) end @@ -131,21 +131,21 @@ describe API::API, api: true do it 'should return 400 error if user does not validate' do post api('/users', admin), - password: 'pass', - email: 'test@example.com', - username: 'test!', - name: 'test', - bio: 'g' * 256, - projects_limit: -1 + password: 'pass', + email: 'test@example.com', + username: 'test!', + name: 'test', + bio: 'g' * 256, + projects_limit: -1 expect(response.status).to eq(400) expect(json_response['message']['password']). - to eq(['is too short (minimum is 8 characters)']) + to eq(['is too short (minimum is 8 characters)']) expect(json_response['message']['bio']). - to eq(['is too long (maximum is 255 characters)']) + to eq(['is too long (maximum is 255 characters)']) expect(json_response['message']['projects_limit']). - to eq(['must be greater than or equal to 0']) + to eq(['must be greater than or equal to 0']) expect(json_response['message']['username']). - to eq([Gitlab::Regex.send(:namespace_regex_message)]) + to eq([Gitlab::Regex.send(:namespace_regex_message)]) end it "shouldn't available for non admin users" do @@ -156,20 +156,20 @@ describe API::API, api: true do context 'with existing user' do before do post api('/users', admin), - email: 'test@example.com', - password: 'password', - username: 'test', - name: 'foo' + email: 'test@example.com', + password: 'password', + username: 'test', + name: 'foo' end it 'should return 409 conflict error if user with same email exists' do - expect { + expect do post api('/users', admin), - name: 'foo', - email: 'test@example.com', - password: 'password', - username: 'foo' - }.to change { User.count }.by(0) + name: 'foo', + email: 'test@example.com', + password: 'password', + username: 'foo' + end.to change { User.count }.by(0) expect(response.status).to eq(409) expect(json_response['message']).to eq('Email has already been taken') end @@ -177,10 +177,10 @@ describe API::API, api: true do it 'should return 409 conflict error if same username exists' do expect do post api('/users', admin), - name: 'foo', - email: 'foo@example.com', - password: 'password', - username: 'test' + name: 'foo', + email: 'foo@example.com', + password: 'password', + username: 'test' end.to change { User.count }.by(0) expect(response.status).to eq(409) expect(json_response['message']).to eq('Username has already been taken') @@ -203,7 +203,7 @@ describe API::API, api: true do before { admin } it "should update user with new bio" do - put api("/users/#{user.id}", admin), {bio: 'new test bio'} + put api("/users/#{user.id}", admin), { bio: 'new test bio' } expect(response.status).to eq(200) expect(json_response['bio']).to eq('new test bio') expect(user.reload.bio).to eq('new test bio') @@ -224,14 +224,14 @@ describe API::API, api: true do end it "should update admin status" do - put api("/users/#{user.id}", admin), {admin: true} + put api("/users/#{user.id}", admin), { admin: true } expect(response.status).to eq(200) expect(json_response['is_admin']).to eq(true) expect(user.reload.admin).to eq(true) end it "should not update admin status" do - put api("/users/#{admin_user.id}", admin), {can_create_group: false} + put api("/users/#{admin_user.id}", admin), { can_create_group: false } expect(response.status).to eq(200) expect(json_response['is_admin']).to eq(true) expect(admin_user.reload.admin).to eq(true) @@ -239,7 +239,7 @@ describe API::API, api: true do end it "should not allow invalid update" do - put api("/users/#{user.id}", admin), {email: 'invalid email'} + put api("/users/#{user.id}", admin), { email: 'invalid email' } expect(response.status).to eq(400) expect(user.reload.email).not_to eq('invalid email') end @@ -250,36 +250,36 @@ describe API::API, api: true do end it "should return 404 for non-existing user" do - put api("/users/999999", admin), {bio: 'update should fail'} + put api("/users/999999", admin), { bio: 'update should fail' } expect(response.status).to eq(404) expect(json_response['message']).to eq('404 Not found') end it 'should return 400 error if user does not validate' do put api("/users/#{user.id}", admin), - password: 'pass', - email: 'test@example.com', - username: 'test!', - name: 'test', - bio: 'g' * 256, - projects_limit: -1 + password: 'pass', + email: 'test@example.com', + username: 'test!', + name: 'test', + bio: 'g' * 256, + projects_limit: -1 expect(response.status).to eq(400) expect(json_response['message']['password']). - to eq(['is too short (minimum is 8 characters)']) + to eq(['is too short (minimum is 8 characters)']) expect(json_response['message']['bio']). - to eq(['is too long (maximum is 255 characters)']) + to eq(['is too long (maximum is 255 characters)']) expect(json_response['message']['projects_limit']). - to eq(['must be greater than or equal to 0']) + to eq(['must be greater than or equal to 0']) expect(json_response['message']['username']). - to eq([Gitlab::Regex.send(:namespace_regex_message)]) + to eq([Gitlab::Regex.send(:namespace_regex_message)]) end context "with existing user" do - before { + before do post api("/users", admin), { email: 'test@example.com', password: 'password', username: 'test', name: 'test' } post api("/users", admin), { email: 'foo@bar.com', password: 'password', username: 'john', name: 'john' } @user = User.all.last - } + end it 'should return 409 conflict error if email address exists' do put api("/users/#{@user.id}", admin), email: 'test@example.com' @@ -313,9 +313,9 @@ describe API::API, api: true do it "should create ssh key" do key_attrs = attributes_for :key - expect { + expect do post api("/users/#{user.id}/keys", admin), key_attrs - }.to change{ user.keys.count }.by(1) + end.to change{ user.keys.count }.by(1) end end @@ -361,9 +361,9 @@ describe API::API, api: true do it 'should delete existing key' do user.keys << key user.save - expect { + expect do delete api("/users/#{user.id}/keys/#{key.id}", admin) - }.to change { user.keys.count }.by(-1) + end.to change { user.keys.count }.by(-1) expect(response.status).to eq(200) end @@ -475,9 +475,9 @@ describe API::API, api: true do describe "POST /user/keys" do it "should create ssh key" do key_attrs = attributes_for :key - expect { + expect do post api("/user/keys", user), key_attrs - }.to change{ user.keys.count }.by(1) + end.to change{ user.keys.count }.by(1) expect(response.status).to eq(201) end @@ -508,9 +508,9 @@ describe API::API, api: true do it "should delete existed key" do user.keys << key user.save - expect { + expect do delete api("/user/keys/#{key.id}", user) - }.to change{user.keys.count}.by(-1) + end.to change{user.keys.count}.by(-1) expect(response.status).to eq(200) end diff --git a/spec/routing/admin_routing_spec.rb b/spec/routing/admin_routing_spec.rb index bf8abcfb00f..cd16a8e6322 100644 --- a/spec/routing/admin_routing_spec.rb +++ b/spec/routing/admin_routing_spec.rb @@ -118,4 +118,3 @@ describe Admin::DashboardController, "routing" do expect(get("/admin")).to route_to('admin/dashboard#index') end end - diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb index f268e4755d1..0fda6202a11 100644 --- a/spec/routing/routing_spec.rb +++ b/spec/routing/routing_spec.rb @@ -248,4 +248,3 @@ describe "Groups", "routing" do expect(get('/1')).to route_to('namespaces#show', id: '1') end end - diff --git a/spec/services/archive_repository_service_spec.rb b/spec/services/archive_repository_service_spec.rb index c22426fccdb..0ec70c51b3a 100644 --- a/spec/services/archive_repository_service_spec.rb +++ b/spec/services/archive_repository_service_spec.rb @@ -17,9 +17,7 @@ describe ArchiveRepositoryService do end it "raises an error" do - expect { - subject.execute(timeout: 0.0) - }.to raise_error(RuntimeError) + expect { subject.execute(timeout: 0.0) }.to raise_error(RuntimeError) end end @@ -90,4 +88,3 @@ describe ArchiveRepositoryService do end end end - diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb index 435b14eb245..3373b97bfd4 100644 --- a/spec/services/git_push_service_spec.rb +++ b/spec/services/git_push_service_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' describe GitPushService do include RepoHelpers - let (:user) { create :user } - let (:project) { create :project } - let (:service) { GitPushService.new } + let(:user) { create :user } + let(:project) { create :project } + let(:service) { GitPushService.new } before do @blankrev = Gitlab::Git::BLANK_SHA @@ -226,18 +226,18 @@ describe GitPushService do end it "doesn't create cross-reference notes for a closing reference" do - expect { + expect do service.execute(project, user, @oldrev, @newrev, @ref) - }.not_to change { Note.where(project_id: project.id, system: true, commit_id: closing_commit.id).count } + end.not_to change { Note.where(project_id: project.id, system: true, commit_id: closing_commit.id).count } end it "doesn't close issues when pushed to non-default branches" do allow(project).to receive(:default_branch).and_return('durf') # The push still shouldn't create cross-reference notes. - expect { + expect do service.execute(project, user, @oldrev, @newrev, 'refs/heads/hurf') - }.not_to change { Note.where(project_id: project.id, system: true).count } + end.not_to change { Note.where(project_id: project.id, system: true).count } expect(Issue.find(issue.id)).to be_opened end @@ -246,9 +246,9 @@ describe GitPushService do allow(project).to receive(:default_issues_tracker?).and_return(false) # The push still shouldn't create cross-reference notes. - expect { + expect do service.execute(project, user, @oldrev, @newrev, 'refs/heads/hurf') - }.not_to change { Note.where(project_id: project.id, system: true).count } + end.not_to change { Note.where(project_id: project.id, system: true).count } end end diff --git a/spec/services/git_tag_push_service_spec.rb b/spec/services/git_tag_push_service_spec.rb index 76f69b396e0..eed50c7ebac 100644 --- a/spec/services/git_tag_push_service_spec.rb +++ b/spec/services/git_tag_push_service_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' describe GitTagPushService do include RepoHelpers - let (:user) { create :user } - let (:project) { create :project } - let (:service) { GitTagPushService.new } + let(:user) { create :user } + let(:project) { create :project } + let(:service) { GitTagPushService.new } before do @oldrev = Gitlab::Git::BLANK_SHA diff --git a/spec/services/issues/bulk_update_service_spec.rb b/spec/services/issues/bulk_update_service_spec.rb index a97c55011c9..4c62fbafd73 100644 --- a/spec/services/issues/bulk_update_service_spec.rb +++ b/spec/services/issues/bulk_update_service_spec.rb @@ -1,9 +1,7 @@ require 'spec_helper' describe Issues::BulkUpdateService do - let(:issue) { - create(:issue, project: @project) - } + let(:issue) { create(:issue, project: @project) } before do @user = create :user @@ -26,14 +24,14 @@ describe Issues::BulkUpdateService do } end - it { + it do result = Issues::BulkUpdateService.new(@project, @user, @params).execute expect(result[:success]).to be_truthy expect(result[:count]).to eq(@issues.count) expect(@project.issues.opened).to be_empty expect(@project.issues.closed).not_to be_empty - } + end end @@ -49,14 +47,14 @@ describe Issues::BulkUpdateService do } end - it { + it do result = Issues::BulkUpdateService.new(@project, @user, @params).execute expect(result[:success]).to be_truthy expect(result[:count]).to eq(@issues.count) expect(@project.issues.closed).to be_empty expect(@project.issues.opened).not_to be_empty - } + end end @@ -70,13 +68,13 @@ describe Issues::BulkUpdateService do } end - it { + it do result = Issues::BulkUpdateService.new(@project, @user, @params).execute expect(result[:success]).to be_truthy expect(result[:count]).to eq(1) expect(@project.issues.first.assignee).to eq(@new_assignee) - } + end it 'allows mass-unassigning' do @project.issues.first.update_attribute(:assignee, @new_assignee) @@ -109,13 +107,13 @@ describe Issues::BulkUpdateService do } end - it { + it do result = Issues::BulkUpdateService.new(@project, @user, @params).execute expect(result[:success]).to be_truthy expect(result[:count]).to eq(1) expect(@project.issues.first.milestone).to eq(@milestone) - } + end end end diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb index 0f9b65678df..9516e7936d8 100644 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ b/spec/services/merge_requests/refresh_service_spec.rb @@ -13,12 +13,14 @@ describe MergeRequests::RefreshService do @project = create(:project, namespace: group) @fork_project = Projects::ForkService.new(@project, @user).execute - @merge_request = create(:merge_request, source_project: @project, + @merge_request = create(:merge_request, + source_project: @project, source_branch: 'master', target_branch: 'feature', target_project: @project) - @fork_merge_request = create(:merge_request, source_project: @fork_project, + @fork_merge_request = create(:merge_request, + source_project: @fork_project, source_branch: 'master', target_branch: 'feature', target_project: @project) diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb index 0dc3b412783..f2ea0805b2f 100644 --- a/spec/services/notes/create_service_spec.rb +++ b/spec/services/notes/create_service_spec.rb @@ -25,4 +25,3 @@ describe Notes::CreateService do end end end - diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb index f158ac87e2b..439a492cea9 100644 --- a/spec/services/projects/fork_service_spec.rb +++ b/spec/services/projects/fork_service_spec.rb @@ -5,8 +5,10 @@ describe Projects::ForkService do before do @from_namespace = create(:namespace) @from_user = create(:user, namespace: @from_namespace ) - @from_project = create(:project, creator_id: @from_user.id, - namespace: @from_namespace, star_count: 107, + @from_project = create(:project, + creator_id: @from_user.id, + namespace: @from_namespace, + star_count: 107, description: 'wow such project') @to_namespace = create(:namespace) @to_user = create(:user, namespace: @to_namespace) diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index ea5b8813105..0dd6980a44f 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -11,7 +11,7 @@ describe Projects::UpdateService do context 'should be private when updated to private' do before do - @created_private = @project.private? + @created_private = @project.private? @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) update_project(@project, @user, @opts) diff --git a/spec/services/projects/upload_service_spec.rb b/spec/services/projects/upload_service_spec.rb index e5c47015a03..7aa26857649 100644 --- a/spec/services/projects/upload_service_spec.rb +++ b/spec/services/projects/upload_service_spec.rb @@ -22,7 +22,7 @@ describe Projects::UploadService do it { expect(@link_to_file['url']).to match('banana_sample.gif') } end - context 'for valid png file' do + context 'for valid png file' do before do png = fixture_file_upload(Rails.root + 'spec/fixtures/dk.png', 'image/png') @@ -38,7 +38,7 @@ describe Projects::UploadService do it { expect(@link_to_file['url']).to match('dk.png') } end - context 'for valid jpg file' do + context 'for valid jpg file' do before do jpg = fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg') @link_to_file = upload_file(@project.repository, jpg) diff --git a/spec/services/system_hooks_service_spec.rb b/spec/services/system_hooks_service_spec.rb index 199ac996608..48c49e2f717 100644 --- a/spec/services/system_hooks_service_spec.rb +++ b/spec/services/system_hooks_service_spec.rb @@ -1,12 +1,12 @@ require 'spec_helper' describe SystemHooksService do - let (:user) { create :user } - let (:project) { create :project } - let (:project_member) { create :project_member } - let (:key) { create(:key, user: user) } - let (:group) { create(:group) } - let (:group_member) { create(:group_member) } + let(:user) { create :user } + let(:project) { create :project } + let(:project_member) { create :project_member } + let(:key) { create(:key, user: user) } + let(:group) { create(:group) } + let(:group_member) { create(:group_member) } context 'event data' do it { expect(event_data(user, :create)).to include(:event_name, :name, :created_at, :email, :user_id) } diff --git a/spec/services/test_hook_service_spec.rb b/spec/services/test_hook_service_spec.rb index d2b505f55a2..226196eedae 100644 --- a/spec/services/test_hook_service_spec.rb +++ b/spec/services/test_hook_service_spec.rb @@ -1,9 +1,9 @@ require 'spec_helper' describe TestHookService do - let (:user) { create :user } - let (:project) { create :project } - let (:hook) { create :project_hook, project: project } + let(:user) { create :user } + let(:project) { create :project } + let(:hook) { create :project_hook, project: project } describe :execute do it "should execute successfully" do diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb index 65d31433dab..e0dbc9aa84c 100644 --- a/spec/support/db_cleaner.rb +++ b/spec/support/db_cleaner.rb @@ -7,7 +7,7 @@ RSpec.configure do |config| DatabaseCleaner.strategy = :transaction end - config.before(:each, :js => true) do + config.before(:each, js: true) do DatabaseCleaner.strategy = :truncation end diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb index e5ebc6e7ec8..a2f853e3e70 100644 --- a/spec/support/matchers.rb +++ b/spec/support/matchers.rb @@ -9,11 +9,11 @@ end def emulate_user(user) user = case user - when :user then create(:user) - when :visitor then nil - when :admin then create(:admin) - else user - end + when :user then create(:user) + when :visitor then nil + when :admin then create(:admin) + else user + end login_with(user) if user end diff --git a/spec/support/select2_helper.rb b/spec/support/select2_helper.rb index 691f84f39d4..04d25b5e9e9 100644 --- a/spec/support/select2_helper.rb +++ b/spec/support/select2_helper.rb @@ -12,9 +12,9 @@ module Select2Helper def select2(value, options={}) - raise "Must pass a hash containing 'from'" if not options.is_a?(Hash) or not options.has_key?(:from) + raise ArgumentError, 'options must be a Hash' unless options.kind_of?(Hash) - selector = options[:from] + selector = options.fetch(:from) if options[:multiple] execute_script("$('#{selector}').select2('val', ['#{value}'], true);") diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb index 2f90b67aef1..cdcfeba8d1f 100644 --- a/spec/tasks/gitlab/backup_rake_spec.rb +++ b/spec/tasks/gitlab/backup_rake_spec.rb @@ -37,7 +37,7 @@ describe 'gitlab:app namespace rake task' do it 'should fail on mismatch' do allow(YAML).to receive(:load_file). - and_return({gitlab_version: "not #{gitlab_version}" }) + and_return({ gitlab_version: "not #{gitlab_version}" }) expect { run_rake_task('gitlab:backup:restore') }. to raise_error(SystemExit) @@ -45,7 +45,7 @@ describe 'gitlab:app namespace rake task' do it 'should invoke restoration on mach' do allow(YAML).to receive(:load_file). - and_return({gitlab_version: gitlab_version}) + and_return({ gitlab_version: gitlab_version }) expect(Rake::Task["gitlab:backup:db:restore"]).to receive(:invoke) expect(Rake::Task["gitlab:backup:repo:restore"]).to receive(:invoke) expect(Rake::Task["gitlab:shell:setup"]).to receive(:invoke) diff --git a/spec/workers/repository_archive_worker_spec.rb b/spec/workers/repository_archive_worker_spec.rb index c2362058cfd..a914d0ac8dc 100644 --- a/spec/workers/repository_archive_worker_spec.rb +++ b/spec/workers/repository_archive_worker_spec.rb @@ -77,4 +77,3 @@ describe RepositoryArchiveWorker do end end end - |