Commit 82499a4cbfdd9605312322fea80b76f034230b1b
Committed by
Dmitriy Zaporozhets
1 parent
8a86fe7b
Exists in
master
and in
4 other branches
Admin teams section added
Showing
10 changed files
with
603 additions
and
0 deletions
Show diff stats
| @@ -0,0 +1,104 @@ | @@ -0,0 +1,104 @@ | ||
| 1 | +class Admin::TeamsController < AdminController | ||
| 2 | + before_filter :user_team, | ||
| 3 | + only: [ :edit, :show, :update, :destroy, | ||
| 4 | + :delegate_projects, :relegate_project, | ||
| 5 | + :add_members, :remove_member ] | ||
| 6 | + | ||
| 7 | + def index | ||
| 8 | + @teams = UserTeam.order('name ASC') | ||
| 9 | + @teams = @teams.search(params[:name]) if params[:name].present? | ||
| 10 | + @teams = @teams.page(params[:page]).per(20) | ||
| 11 | + end | ||
| 12 | + | ||
| 13 | + def show | ||
| 14 | + @projects = Project.scoped | ||
| 15 | + @projects = @projects.without_team(@team) if @team.projects.any? | ||
| 16 | + #@projects.reject!(&:empty_repo?) | ||
| 17 | + | ||
| 18 | + @users = User.active | ||
| 19 | + @users = @users.not_in_team(@team) if @team.members.any? | ||
| 20 | + @users = UserDecorator.decorate @users | ||
| 21 | + end | ||
| 22 | + | ||
| 23 | + def new | ||
| 24 | + @team = UserTeam.new | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + def edit | ||
| 28 | + end | ||
| 29 | + | ||
| 30 | + def create | ||
| 31 | + @team = UserTeam.new(params[:user_team]) | ||
| 32 | + @team.path = @team.name.dup.parameterize if @team.name | ||
| 33 | + @team.owner = current_user | ||
| 34 | + | ||
| 35 | + if @team.save | ||
| 36 | + redirect_to admin_team_path(@team), notice: 'UserTeam was successfully created.' | ||
| 37 | + else | ||
| 38 | + render action: "new" | ||
| 39 | + end | ||
| 40 | + end | ||
| 41 | + | ||
| 42 | + def update | ||
| 43 | + user_team_params = params[:user_team].dup | ||
| 44 | + owner_id = user_team_params.delete(:owner_id) | ||
| 45 | + | ||
| 46 | + if owner_id | ||
| 47 | + @team.owner = User.find(owner_id) | ||
| 48 | + end | ||
| 49 | + | ||
| 50 | + if @team.update_attributes(user_team_params) | ||
| 51 | + redirect_to admin_team_path(@team), notice: 'UserTeam was successfully updated.' | ||
| 52 | + else | ||
| 53 | + render action: "edit" | ||
| 54 | + end | ||
| 55 | + end | ||
| 56 | + | ||
| 57 | + def destroy | ||
| 58 | + @team.destroy | ||
| 59 | + | ||
| 60 | + redirect_to admin_user_teams_path, notice: 'UserTeam was successfully deleted.' | ||
| 61 | + end | ||
| 62 | + | ||
| 63 | + def delegate_projects | ||
| 64 | + unless params[:project_ids].blank? | ||
| 65 | + project_ids = params[:project_ids] | ||
| 66 | + access = params[:greatest_project_access] | ||
| 67 | + @team.assign_to_projects(project_ids, access) | ||
| 68 | + end | ||
| 69 | + | ||
| 70 | + redirect_to admin_team_path(@team), notice: 'Projects was successfully added.' | ||
| 71 | + end | ||
| 72 | + | ||
| 73 | + def relegate_project | ||
| 74 | + project = params[:project_id] | ||
| 75 | + @team.resign_from_project(project) | ||
| 76 | + | ||
| 77 | + redirect_to admin_team_path(@team), notice: 'Project was successfully removed.' | ||
| 78 | + end | ||
| 79 | + | ||
| 80 | + def add_members | ||
| 81 | + unless params[:user_ids].blank? | ||
| 82 | + user_ids = params[:user_ids] | ||
| 83 | + access = params[:default_project_access] | ||
| 84 | + is_admin = params[:group_admin] | ||
| 85 | + @team.add_members(user_ids, access, is_admin) | ||
| 86 | + end | ||
| 87 | + | ||
| 88 | + redirect_to admin_team_path(@team), notice: 'Members was successfully added.' | ||
| 89 | + end | ||
| 90 | + | ||
| 91 | + def remove_member | ||
| 92 | + member = params[:member_id] | ||
| 93 | + @team.remove_member(member) | ||
| 94 | + | ||
| 95 | + redirect_to admin_team_path(@team), notice: 'Member was successfully removed.' | ||
| 96 | + end | ||
| 97 | + | ||
| 98 | + private | ||
| 99 | + | ||
| 100 | + def user_team | ||
| 101 | + @team = UserTeam.find_by_path(params[:id]) | ||
| 102 | + end | ||
| 103 | + | ||
| 104 | +end |
| @@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
| 1 | +%h3.page_title Rename Team | ||
| 2 | +%hr | ||
| 3 | += form_for [:admin, @team] do |f| | ||
| 4 | + - if @team.errors.any? | ||
| 5 | + .alert-message.block-message.error | ||
| 6 | + %span= @team.errors.full_messages.first | ||
| 7 | + .clearfix.team_name_holder | ||
| 8 | + = f.label :name do | ||
| 9 | + Team name is | ||
| 10 | + .input | ||
| 11 | + = f.text_field :name, placeholder: "Example Team", class: "xxlarge" | ||
| 12 | + | ||
| 13 | + | ||
| 14 | + | ||
| 15 | + .clearfix.team_name_holder | ||
| 16 | + = f.label :path do | ||
| 17 | + %span.cred Team path is | ||
| 18 | + .input | ||
| 19 | + = f.text_field :path, placeholder: "example-team", class: "xxlarge danger" | ||
| 20 | + %ul.cred | ||
| 21 | + %li Changing team path can have unintended side effects. | ||
| 22 | + %li Renaming team path will rename directory for all related projects | ||
| 23 | + %li It will change web url for access team and team projects. | ||
| 24 | + %li It will change the git path to repositories under this team. | ||
| 25 | + | ||
| 26 | + .form-actions | ||
| 27 | + = f.submit 'Rename team', class: "btn danger" | ||
| 28 | + = link_to 'Cancel', admin_teams_path, class: "btn cancel-btn" |
| @@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
| 1 | +%h3.page_title | ||
| 2 | + Teams | ||
| 3 | + %small | ||
| 4 | + simple Teams description | ||
| 5 | + | ||
| 6 | + = link_to 'New Team', new_admin_team_path, class: "btn small right" | ||
| 7 | + %br | ||
| 8 | + | ||
| 9 | += form_tag admin_teams_path, method: :get, class: 'form-inline' do | ||
| 10 | + = text_field_tag :name, params[:name], class: "xlarge" | ||
| 11 | + = submit_tag "Search", class: "btn submit primary" | ||
| 12 | + | ||
| 13 | +%table | ||
| 14 | + %thead | ||
| 15 | + %tr | ||
| 16 | + %th | ||
| 17 | + Name | ||
| 18 | + %i.icon-sort-down | ||
| 19 | + %th Path | ||
| 20 | + %th Projects | ||
| 21 | + %th Members | ||
| 22 | + %th Owner | ||
| 23 | + %th.cred Danger Zone! | ||
| 24 | + | ||
| 25 | + - @teams.each do |team| | ||
| 26 | + %tr | ||
| 27 | + %td | ||
| 28 | + %strong= link_to team.name, admin_team_path(team) | ||
| 29 | + %td= team.path | ||
| 30 | + %td= team.projects.count | ||
| 31 | + %td= team.members.count | ||
| 32 | + %td | ||
| 33 | + = link_to team.owner.name, admin_user_path(team.owner_id) | ||
| 34 | + %td.bgred | ||
| 35 | + = link_to 'Rename', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn small" | ||
| 36 | + = link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn small danger" | ||
| 37 | += paginate @teams, theme: "admin" |
| @@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
| 1 | +%h3.page_title New Team | ||
| 2 | +%hr | ||
| 3 | += form_for @team, url: admin_teams_path do |f| | ||
| 4 | + - if @team.errors.any? | ||
| 5 | + .alert-message.block-message.error | ||
| 6 | + %span= @team.errors.full_messages.first | ||
| 7 | + .clearfix | ||
| 8 | + = f.label :name do | ||
| 9 | + Team name is | ||
| 10 | + .input | ||
| 11 | + = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left" | ||
| 12 | + | ||
| 13 | + = f.submit 'Create team', class: "btn primary" | ||
| 14 | + %hr | ||
| 15 | + .padded | ||
| 16 | + %ul | ||
| 17 | + %li Team is kind of directory for several projects | ||
| 18 | + %li All created teams are private | ||
| 19 | + %li People within a team see only projects they have access to | ||
| 20 | + %li All projects of team will be stored in team directory | ||
| 21 | + %li You will be able to move existing projects into team |
| @@ -0,0 +1,104 @@ | @@ -0,0 +1,104 @@ | ||
| 1 | +%h3.page_title | ||
| 2 | + Team: #{@team.name} | ||
| 3 | + | ||
| 4 | +%br | ||
| 5 | +%table.zebra-striped | ||
| 6 | + %thead | ||
| 7 | + %tr | ||
| 8 | + %th Team | ||
| 9 | + %th | ||
| 10 | + %tr | ||
| 11 | + %td | ||
| 12 | + %b | ||
| 13 | + Name: | ||
| 14 | + %td | ||
| 15 | + = @team.name | ||
| 16 | + | ||
| 17 | + = link_to edit_admin_team_path(@team), class: "btn btn-small right" do | ||
| 18 | + %i.icon-edit | ||
| 19 | + Rename | ||
| 20 | + %tr | ||
| 21 | + %td | ||
| 22 | + %b | ||
| 23 | + Owner: | ||
| 24 | + %td | ||
| 25 | + = @team.owner.name | ||
| 26 | + .right | ||
| 27 | + = link_to "#", class: "btn btn-small change-owner-link" do | ||
| 28 | + %i.icon-edit | ||
| 29 | + Change owner | ||
| 30 | + | ||
| 31 | + %tr.change-owner-holder.hide | ||
| 32 | + %td.bgred | ||
| 33 | + %b.cred | ||
| 34 | + New Owner: | ||
| 35 | + %td.bgred | ||
| 36 | + = form_for @team, url: admin_team_path(@team) do |f| | ||
| 37 | + = f.select :owner_id, User.all.map { |user| [user.name, user.id] }, {}, {class: 'chosen'} | ||
| 38 | + %div | ||
| 39 | + = f.submit 'Change Owner', class: "btn danger" | ||
| 40 | + = link_to "Cancel", "#", class: "btn change-owner-cancel-link" | ||
| 41 | + | ||
| 42 | +%fieldset | ||
| 43 | + %legend Members (#{@team.members.count}) | ||
| 44 | + = form_tag add_members_admin_team_path(@team), id: "team_members", class: "bulk_import", method: :post do | ||
| 45 | + %table#members_list | ||
| 46 | + %thead | ||
| 47 | + %tr | ||
| 48 | + %th User name | ||
| 49 | + %th Default project access | ||
| 50 | + %th Team access | ||
| 51 | + %th.cred Danger Zone! | ||
| 52 | + - @team.members.each do |member| | ||
| 53 | + %tr.member | ||
| 54 | + %td | ||
| 55 | + = link_to [:admin, member] do | ||
| 56 | + = member.name | ||
| 57 | + %small= "(#{member.email})" | ||
| 58 | + %td= @team.human_default_projects_access(member) | ||
| 59 | + %td= @team.admin?(member) ? "Admin" : "Member" | ||
| 60 | + %td.bgred | ||
| 61 | + = link_to 'Remove', remove_member_admin_team_path(@team, member_id: member.id), confirm: 'Remove project from team and move to global namespace. Are you sure?', method: :delete, class: "btn danger small" | ||
| 62 | + %tr | ||
| 63 | + %td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_email), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5' | ||
| 64 | + %td= select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" } | ||
| 65 | + %td | ||
| 66 | + %span= check_box_tag :group_admin | ||
| 67 | + %span Admin? | ||
| 68 | + %td= submit_tag 'Add', class: "btn primary", id: :add_members_to_team | ||
| 69 | + | ||
| 70 | +%fieldset | ||
| 71 | + %legend Projects (#{@team.projects.count}) | ||
| 72 | + = form_tag delegate_projects_admin_team_path(@team), id: "assign_projects", class: "bulk_import", method: :post do | ||
| 73 | + %table#projects_list | ||
| 74 | + %thead | ||
| 75 | + %tr | ||
| 76 | + %th Project name | ||
| 77 | + %th Max access | ||
| 78 | + %th.cred Danger Zone! | ||
| 79 | + - @team.projects.each do |project| | ||
| 80 | + %tr.project | ||
| 81 | + %td | ||
| 82 | + = link_to project.name_with_namespace, [:admin, project] | ||
| 83 | + %td | ||
| 84 | + %span= @team.human_max_project_access(project) | ||
| 85 | + %td.bgred | ||
| 86 | + = link_to 'Relegate', relegate_project_admin_team_path(@team, project_id: project.id), confirm: 'Remove project from team and move to global namespace. Are you sure?', method: :delete, class: "btn danger small" | ||
| 87 | + %tr | ||
| 88 | + %td= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5' | ||
| 89 | + %td= select_tag :greatest_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" } | ||
| 90 | + %td= submit_tag 'Add', class: "btn primary", id: :assign_projects_to_team | ||
| 91 | + | ||
| 92 | +:javascript | ||
| 93 | + $(function(){ | ||
| 94 | + var modal = $('.change-owner-holder'); | ||
| 95 | + $('.change-owner-link').bind("click", function(){ | ||
| 96 | + $(this).hide(); | ||
| 97 | + modal.show(); | ||
| 98 | + }); | ||
| 99 | + $('.change-owner-cancel-link').bind("click", function(){ | ||
| 100 | + modal.hide(); | ||
| 101 | + $('.change-owner-link').show(); | ||
| 102 | + }) | ||
| 103 | + }) | ||
| 104 | + |
app/views/layouts/admin.html.haml
| @@ -10,6 +10,8 @@ | @@ -10,6 +10,8 @@ | ||
| 10 | = link_to "Stats", admin_root_path | 10 | = link_to "Stats", admin_root_path |
| 11 | = nav_link(controller: :projects) do | 11 | = nav_link(controller: :projects) do |
| 12 | = link_to "Projects", admin_projects_path | 12 | = link_to "Projects", admin_projects_path |
| 13 | + = nav_link(controller: :teams) do | ||
| 14 | + = link_to "Teams", admin_teams_path | ||
| 13 | = nav_link(controller: :groups) do | 15 | = nav_link(controller: :groups) do |
| 14 | = link_to "Groups", admin_groups_path | 16 | = link_to "Groups", admin_groups_path |
| 15 | = nav_link(controller: :users) do | 17 | = nav_link(controller: :users) do |
config/routes.rb
| @@ -69,6 +69,14 @@ Gitlab::Application.routes.draw do | @@ -69,6 +69,14 @@ Gitlab::Application.routes.draw do | ||
| 69 | put :team_update | 69 | put :team_update |
| 70 | end | 70 | end |
| 71 | end | 71 | end |
| 72 | + resources :teams do #, constraints: { id: /[^\/]+/ } do end | ||
| 73 | + member do | ||
| 74 | + post :delegate_projects | ||
| 75 | + delete :relegate_project | ||
| 76 | + post :add_members | ||
| 77 | + delete :remove_member | ||
| 78 | + end | ||
| 79 | + end | ||
| 72 | resources :team_members, only: [:edit, :update, :destroy] | 80 | resources :team_members, only: [:edit, :update, :destroy] |
| 73 | resources :hooks, only: [:index, :create, :destroy] do | 81 | resources :hooks, only: [:index, :create, :destroy] do |
| 74 | get :test | 82 | get :test |
| @@ -0,0 +1,73 @@ | @@ -0,0 +1,73 @@ | ||
| 1 | +Feature: Admin Teams | ||
| 2 | + Background: | ||
| 3 | + Given I sign in as an admin | ||
| 4 | + #And there are projects in system | ||
| 5 | + #And system has users | ||
| 6 | + #And I have own project | ||
| 7 | + And Create gitlab user "John" | ||
| 8 | + | ||
| 9 | + Scenario: Create a team | ||
| 10 | + When I visit admin teams page | ||
| 11 | + And I click new team link | ||
| 12 | + And submit form with new team info | ||
| 13 | + Then I should be redirected to team page | ||
| 14 | + And I should see newly created team | ||
| 15 | + | ||
| 16 | + Scenario: Add user to team | ||
| 17 | + When I visit admin teams page | ||
| 18 | + When I have clean "HardCoders" team | ||
| 19 | + And I visit "HardCoders" team page | ||
| 20 | + #Then I should see only me in members table | ||
| 21 | + When I select user "John" from user list as "Developer" | ||
| 22 | + And submit form with new team member info | ||
| 23 | + Then I should see "John" in teams members list as "Developer" | ||
| 24 | + When I visit "John" user admin page | ||
| 25 | + Then I should see "HardCoders" team in teams table | ||
| 26 | + | ||
| 27 | + Scenario: Assign team to existing project | ||
| 28 | + When I visit admin teams page | ||
| 29 | + When I have "HardCoders" team with "John" member with "Developer" role | ||
| 30 | + When I have "Shop" project | ||
| 31 | + And I visit "HardCoders" team page | ||
| 32 | + Then I should see empty projects table | ||
| 33 | + When I select project "Shop" with max access "Reporter" | ||
| 34 | + And submit form with new team project info | ||
| 35 | + Then I should see "Shop" project in projects list | ||
| 36 | + When I visit "Shop" project admin page | ||
| 37 | + Then I should see "John" user with role "Reporter" in team table | ||
| 38 | + | ||
| 39 | + Scenario: Add user to team with ptojects | ||
| 40 | + When I visit admin teams page | ||
| 41 | + When I have "HardCoders" team with "John" member with "Developer" role | ||
| 42 | + And "HardCoders" team assigned to "Shop" project with "Developer" max role access | ||
| 43 | + When I have gitlab user "Jimm" | ||
| 44 | + And I visit "HardCoders" team page | ||
| 45 | + Then I should see members table without "Jimm" member | ||
| 46 | + When I select user "Jimm" ub team members list as "Master" | ||
| 47 | + And submit form with new team member info | ||
| 48 | + Then I should see "Jimm" in teams members list as "Master" | ||
| 49 | + | ||
| 50 | + Scenario: Remove member from team | ||
| 51 | + Given I have users team "HardCoders" | ||
| 52 | + And gitlab user "John" is a member "HardCoders" team | ||
| 53 | + And gitlab user "Jimm" is a member "HardCoders" team | ||
| 54 | + And "HardCoders" team is assigned to "Shop" project | ||
| 55 | + When I visit admin teams page | ||
| 56 | + When I visit "HardCoders" team admin page | ||
| 57 | + Then I shoould see "John" in members list | ||
| 58 | + And I should see "Jimm" in members list | ||
| 59 | + And I should see "Shop" in projects list | ||
| 60 | + When I click on remove "Jimm" user link | ||
| 61 | + Then I should be redirected to "HardCoders" team admin page | ||
| 62 | + And I should not to see "Jimm" user in members list | ||
| 63 | + | ||
| 64 | + Scenario: Remove project from team | ||
| 65 | + Given I have users team "HardCoders" | ||
| 66 | + And gitlab user "John" is a member "HardCoders" team | ||
| 67 | + And gitlab user "Jimm" is a member "HardCoders" team | ||
| 68 | + And "HardCoders" team is assigned to "Shop" project | ||
| 69 | + When I visit admin teams page | ||
| 70 | + When I visit "HardCoders" team admin page | ||
| 71 | + Then I should see "Shop" project in projects list | ||
| 72 | + When I click on "Relegate" link on "Shop" project | ||
| 73 | + Then I should see projects liston team page without "Shop" project |
| @@ -0,0 +1,222 @@ | @@ -0,0 +1,222 @@ | ||
| 1 | +class AdminTeams < Spinach::FeatureSteps | ||
| 2 | + include SharedAuthentication | ||
| 3 | + include SharedPaths | ||
| 4 | + include SharedActiveTab | ||
| 5 | + include SharedAdmin | ||
| 6 | + | ||
| 7 | + And 'I have own project' do | ||
| 8 | + create :project | ||
| 9 | + end | ||
| 10 | + | ||
| 11 | + And 'Create gitlab user "John"' do | ||
| 12 | + @user = create(:user, :name => "John") | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + And 'I click new team link' do | ||
| 16 | + click_link "New Team" | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + And 'submit form with new team info' do | ||
| 20 | + fill_in 'user_team_name', with: 'gitlab' | ||
| 21 | + click_button 'Create team' | ||
| 22 | + end | ||
| 23 | + | ||
| 24 | + Then 'I should be redirected to team page' do | ||
| 25 | + current_path.should == admin_team_path(UserTeam.last) | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | + And 'I should see newly created team' do | ||
| 29 | + page.should have_content "Team: gitlab" | ||
| 30 | + end | ||
| 31 | + | ||
| 32 | + When 'I visit admin teams page' do | ||
| 33 | + visit admin_teams_path | ||
| 34 | + end | ||
| 35 | + | ||
| 36 | + When 'I have clean "HardCoders" team' do | ||
| 37 | + @team = create :user_team, name: "HardCoders", owner: current_user | ||
| 38 | + end | ||
| 39 | + | ||
| 40 | + And 'I visit "HardCoders" team page' do | ||
| 41 | + visit admin_team_path(UserTeam.find_by_name("HardCoders")) | ||
| 42 | + end | ||
| 43 | + | ||
| 44 | + Then 'I should see only me in members table' do | ||
| 45 | + members_list = find("#members_list .member") | ||
| 46 | + members_list.should have_content(current_user.name) | ||
| 47 | + members_list.should have_content(current_user.email) | ||
| 48 | + end | ||
| 49 | + | ||
| 50 | + When 'I select user "John" from user list as "Developer"' do | ||
| 51 | + @user ||= User.find_by_name("John") | ||
| 52 | + within "#team_members" do | ||
| 53 | + select user.name, :from => "user_ids" | ||
| 54 | + select "Developer", :from => "default_project_access" | ||
| 55 | + end | ||
| 56 | + end | ||
| 57 | + | ||
| 58 | + And 'submit form with new team member info' do | ||
| 59 | + click_button 'add_members_to_team' | ||
| 60 | + end | ||
| 61 | + | ||
| 62 | + Then 'I should see "John" in teams members list as "Developer"' do | ||
| 63 | + @user ||= User.find_by_name("John") | ||
| 64 | + find_in_list("#members_list .member", user).must_equal true | ||
| 65 | + end | ||
| 66 | + | ||
| 67 | + When 'I visit "John" user admin page' do | ||
| 68 | + pending 'step not implemented' | ||
| 69 | + end | ||
| 70 | + | ||
| 71 | + Then 'I should see "HardCoders" team in teams table' do | ||
| 72 | + pending 'step not implemented' | ||
| 73 | + end | ||
| 74 | + | ||
| 75 | + When 'I have "HardCoders" team with "John" member with "Developer" role' do | ||
| 76 | + @team = create :user_team, name: "HardCoders", owner: current_user | ||
| 77 | + @user ||= User.find_by_name("John") | ||
| 78 | + @team.add_member(@user, UserTeam.access_roles["Developer"], group_admin: false) | ||
| 79 | + end | ||
| 80 | + | ||
| 81 | + When 'I have "Shop" project' do | ||
| 82 | + @project = create :project, name: "Shop" | ||
| 83 | + end | ||
| 84 | + | ||
| 85 | + Then 'I should see empty projects table' do | ||
| 86 | + projects_list = find("#projects_list") | ||
| 87 | + projects_list.has_content?("Relegate").must_equal false | ||
| 88 | + end | ||
| 89 | + | ||
| 90 | + When 'I select project "Shop" with max access "Reporter"' do | ||
| 91 | + @project ||= Project.find_by_name("Shop") | ||
| 92 | + within "#assign_projects" do | ||
| 93 | + select @project.name, :from => "project_ids" | ||
| 94 | + select "Reporter", :from => "greatest_project_access" | ||
| 95 | + end | ||
| 96 | + | ||
| 97 | + end | ||
| 98 | + | ||
| 99 | + And 'submit form with new team project info' do | ||
| 100 | + click_button 'assign_projects_to_team' | ||
| 101 | + end | ||
| 102 | + | ||
| 103 | + Then 'I should see "Shop" project in projects list' do | ||
| 104 | + project = Project.find_by_name("Shop") | ||
| 105 | + find_in_list("#projects_list .project", project).must_equal true | ||
| 106 | + end | ||
| 107 | + | ||
| 108 | + When 'I visit "Shop" project admin page' do | ||
| 109 | + project = Project.find_by_name("Shop") | ||
| 110 | + visit admin_project_path(project) | ||
| 111 | + end | ||
| 112 | + | ||
| 113 | + And '"HardCoders" team assigned to "Shop" project with "Developer" max role access' do | ||
| 114 | + @team = UserTeam.find_by_name("HardCoders") | ||
| 115 | + @project = create :project, name: "Shop" | ||
| 116 | + @team.assign_to_project(@project, UserTeam.access_roles["Developer"]) | ||
| 117 | + end | ||
| 118 | + | ||
| 119 | + When 'I have gitlab user "Jimm"' do | ||
| 120 | + create :user, name: "Jimm" | ||
| 121 | + end | ||
| 122 | + | ||
| 123 | + Then 'I should see members table without "Jimm" member' do | ||
| 124 | + user = User.find_by_name("Jimm") | ||
| 125 | + find_in_list("#members_list .member", user).must_equal false | ||
| 126 | + end | ||
| 127 | + | ||
| 128 | + When 'I select user "Jimm" ub team members list as "Master"' do | ||
| 129 | + user = User.find_by_name("Jimm") | ||
| 130 | + within "#team_members" do | ||
| 131 | + select user.name, :from => "user_ids" | ||
| 132 | + select "Developer", :from => "default_project_access" | ||
| 133 | + end | ||
| 134 | + end | ||
| 135 | + | ||
| 136 | + Then 'I should see "Jimm" in teams members list as "Master"' do | ||
| 137 | + user = User.find_by_name("Jimm") | ||
| 138 | + find_in_list("#members_list .member", user).must_equal true | ||
| 139 | + end | ||
| 140 | + | ||
| 141 | + Given 'I have users team "HardCoders"' do | ||
| 142 | + @team = create :user_team, name: "HardCoders" | ||
| 143 | + end | ||
| 144 | + | ||
| 145 | + And 'gitlab user "John" is a member "HardCoders" team' do | ||
| 146 | + @team = UserTeam.find_by_name("HardCoders") | ||
| 147 | + @user = User.find_by_name("John") | ||
| 148 | + @user = create :user, name: "John" unless @user | ||
| 149 | + @team.add_member(@user, UserTeam.access_roles["Master"], group_admin: false) | ||
| 150 | + end | ||
| 151 | + | ||
| 152 | + And 'gitlab user "Jimm" is a member "HardCoders" team' do | ||
| 153 | + @team = UserTeam.find_by_name("HardCoders") | ||
| 154 | + @user = User.find_by_name("Jimm") | ||
| 155 | + @user = create :user, name: "Jimm" unless @user | ||
| 156 | + @team.add_member(@user, UserTeam.access_roles["Master"], group_admin: false) | ||
| 157 | + end | ||
| 158 | + | ||
| 159 | + And '"HardCoders" team is assigned to "Shop" project' do | ||
| 160 | + @team = UserTeam.find_by_name("HardCoders") | ||
| 161 | + @project = create :project, name: "Shop" | ||
| 162 | + @team.assign_to_project(@project, UserTeam.access_roles["Developer"]) | ||
| 163 | + end | ||
| 164 | + | ||
| 165 | + When 'I visit "HardCoders" team admin page' do | ||
| 166 | + visit admin_team_path(UserTeam.find_by_name("HardCoders")) | ||
| 167 | + end | ||
| 168 | + | ||
| 169 | + Then 'I shoould see "John" in members list' do | ||
| 170 | + user = User.find_by_name("John") | ||
| 171 | + find_in_list("#members_list .member", user).must_equal true | ||
| 172 | + end | ||
| 173 | + | ||
| 174 | + And 'I should see "Jimm" in members list' do | ||
| 175 | + user = User.find_by_name("Jimm") | ||
| 176 | + find_in_list("#members_list .member", user).must_equal true | ||
| 177 | + end | ||
| 178 | + | ||
| 179 | + And 'I should see "Shop" in projects list' do | ||
| 180 | + | ||
| 181 | + end | ||
| 182 | + | ||
| 183 | + When 'I click on remove "Jimm" user link' do | ||
| 184 | + | ||
| 185 | + end | ||
| 186 | + | ||
| 187 | + Then 'I should be redirected to "HardCoders" team admin page' do | ||
| 188 | + current_path.should admin_team_peth(UserTeam.find_by_name("HardCoders")) | ||
| 189 | + end | ||
| 190 | + | ||
| 191 | + And 'I should not to see "Jimm" user in members list' do | ||
| 192 | + | ||
| 193 | + end | ||
| 194 | + | ||
| 195 | + When 'I click on "Relegate" link on "Shop" project' do | ||
| 196 | + | ||
| 197 | + end | ||
| 198 | + | ||
| 199 | + Then 'I should see projects liston team page without "Shop" project' do | ||
| 200 | + | ||
| 201 | + end | ||
| 202 | + | ||
| 203 | + Then 'I should see "John" user with role "Reporter" in team table' do | ||
| 204 | + user = User.find_by_name("John") | ||
| 205 | + find_in_list(".team_members", user).must_equal true | ||
| 206 | + end | ||
| 207 | + | ||
| 208 | + protected | ||
| 209 | + | ||
| 210 | + def current_team | ||
| 211 | + @team ||= Team.first | ||
| 212 | + end | ||
| 213 | + | ||
| 214 | + def find_in_list(selector, item) | ||
| 215 | + members_list = all(selector) | ||
| 216 | + entered = false | ||
| 217 | + members_list.each do |member_item| | ||
| 218 | + entered = true if member_item.has_content?(item.name) | ||
| 219 | + end | ||
| 220 | + entered | ||
| 221 | + end | ||
| 222 | +end |
features/steps/shared/paths.rb
| @@ -105,6 +105,10 @@ module SharedPaths | @@ -105,6 +105,10 @@ module SharedPaths | ||
| 105 | visit admin_groups_path | 105 | visit admin_groups_path |
| 106 | end | 106 | end |
| 107 | 107 | ||
| 108 | + When 'I visit admin teams page' do | ||
| 109 | + visit admin_teams_path | ||
| 110 | + end | ||
| 111 | + | ||
| 108 | # ---------------------------------------- | 112 | # ---------------------------------------- |
| 109 | # Generic Project | 113 | # Generic Project |
| 110 | # ---------------------------------------- | 114 | # ---------------------------------------- |