Add teams into Public sections
This commit is contained in:
parent
82499a4cbf
commit
695becc4cb
14 changed files with 706 additions and 0 deletions
113
app/controllers/teams_controller.rb
Normal file
113
app/controllers/teams_controller.rb
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
class TeamsController < ApplicationController
|
||||||
|
respond_to :html
|
||||||
|
layout 'user_team', only: [:show, :edit, :update, :destroy, :issues, :merge_requests, :search]
|
||||||
|
|
||||||
|
before_filter :user_team, only: [:show, :edit, :update, :destroy, :issues, :merge_requests, :search]
|
||||||
|
before_filter :projects, only: [:show, :edit, :update, :destroy, :issues, :merge_requests, :search]
|
||||||
|
|
||||||
|
# Authorize
|
||||||
|
before_filter :authorize_manage_user_team!, only: [:edit, :update]
|
||||||
|
before_filter :authorize_admin_user_team!, only: [:destroy]
|
||||||
|
|
||||||
|
def index
|
||||||
|
@teams = UserTeam.all
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0)
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
|
format.js
|
||||||
|
format.atom { render layout: false }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if user_team.update_attributes(params[:user_team])
|
||||||
|
redirect_to team_path(user_team)
|
||||||
|
else
|
||||||
|
render action: :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
user_team.destroy
|
||||||
|
redirect_to teams_path
|
||||||
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
@team = UserTeam.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@team = UserTeam.new(params[:user_team])
|
||||||
|
@team.owner = current_user unless params[:owner]
|
||||||
|
@team.path = @team.name.dup.parameterize if @team.name
|
||||||
|
|
||||||
|
if @team.save
|
||||||
|
redirect_to team_path(@team)
|
||||||
|
else
|
||||||
|
render action: :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Get authored or assigned open merge requests
|
||||||
|
def merge_requests
|
||||||
|
@merge_requests = MergeRequest.of_user_team(@user_team)
|
||||||
|
@merge_requests = FilterContext.new(@merge_requests, params).execute
|
||||||
|
@merge_requests = @merge_requests.recent.page(params[:page]).per(20)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Get only assigned issues
|
||||||
|
def issues
|
||||||
|
@issues = Issue.of_user_team(@user_team)
|
||||||
|
@issues = FilterContext.new(@issues, params).execute
|
||||||
|
@issues = @issues.recent.page(params[:page]).per(20)
|
||||||
|
@issues = @issues.includes(:author, :project)
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
|
format.atom { render layout: false }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def search
|
||||||
|
result = SearchContext.new(project_ids, params).execute
|
||||||
|
|
||||||
|
@projects = result[:projects]
|
||||||
|
@merge_requests = result[:merge_requests]
|
||||||
|
@issues = result[:issues]
|
||||||
|
@wiki_pages = result[:wiki_pages]
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def user_team
|
||||||
|
@user_team ||= UserTeam.find_by_path(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def projects
|
||||||
|
@projects ||= user_team.projects.sorted_by_activity
|
||||||
|
end
|
||||||
|
|
||||||
|
def project_ids
|
||||||
|
projects.map(&:id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def authorize_manage_user_team!
|
||||||
|
unless user_team.present? or can?(current_user, :manage_user_team, user_team)
|
||||||
|
return render_404
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def authorize_admin_user_team!
|
||||||
|
unless user_team.owner == current_user || current_user.admin?
|
||||||
|
return render_404
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
33
app/views/teams/_filter.html.haml
Normal file
33
app/views/teams/_filter.html.haml
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
= form_tag team_filter_path(entity), method: 'get' do
|
||||||
|
%fieldset.dashboard-search-filter
|
||||||
|
= search_field_tag "search", params[:search], { placeholder: 'Search', class: 'search-text-input' }
|
||||||
|
= button_tag type: 'submit', class: 'btn' do
|
||||||
|
%i.icon-search
|
||||||
|
|
||||||
|
%fieldset
|
||||||
|
%legend Status:
|
||||||
|
%ul.nav.nav-pills.nav-stacked
|
||||||
|
%li{class: ("active" if !params[:status])}
|
||||||
|
= link_to team_filter_path(entity, status: nil) do
|
||||||
|
Open
|
||||||
|
%li{class: ("active" if params[:status] == 'closed')}
|
||||||
|
= link_to team_filter_path(entity, status: 'closed') do
|
||||||
|
Closed
|
||||||
|
%li{class: ("active" if params[:status] == 'all')}
|
||||||
|
= link_to team_filter_path(entity, status: 'all') do
|
||||||
|
All
|
||||||
|
|
||||||
|
%fieldset
|
||||||
|
%legend Projects:
|
||||||
|
%ul.nav.nav-pills.nav-stacked
|
||||||
|
- @projects.each do |project|
|
||||||
|
- unless entities_per_project(project, entity).zero?
|
||||||
|
%li{class: ("active" if params[:project_id] == project.id.to_s)}
|
||||||
|
= link_to team_filter_path(entity, project_id: project.id) do
|
||||||
|
= project.name_with_namespace
|
||||||
|
%small.right= entities_per_project(project, entity)
|
||||||
|
|
||||||
|
%fieldset
|
||||||
|
%hr
|
||||||
|
= link_to "Reset", team_filter_path(entity), class: 'btn right'
|
||||||
|
|
22
app/views/teams/_projects.html.haml
Normal file
22
app/views/teams/_projects.html.haml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
.projects_box
|
||||||
|
%h5.title
|
||||||
|
Projects
|
||||||
|
%small
|
||||||
|
(#{projects.count})
|
||||||
|
- if can? current_user, :manage_group, @group
|
||||||
|
%span.right
|
||||||
|
= link_to new_project_path(namespace_id: @group.id), class: "btn very_small info" do
|
||||||
|
%i.icon-plus
|
||||||
|
New Project
|
||||||
|
%ul.well-list
|
||||||
|
- if projects.blank?
|
||||||
|
%p.nothing_here_message This groups has no projects yet
|
||||||
|
- projects.each do |project|
|
||||||
|
%li
|
||||||
|
= link_to project_path(project), class: dom_class(project) do
|
||||||
|
%strong.well-title= truncate(project.name, length: 25)
|
||||||
|
%span.arrow
|
||||||
|
→
|
||||||
|
%span.last_activity
|
||||||
|
%strong Last activity:
|
||||||
|
%span= project_last_activity(project)
|
19
app/views/teams/_team_head.html.haml
Normal file
19
app/views/teams/_team_head.html.haml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
%ul.nav.nav-tabs
|
||||||
|
= nav_link(path: 'teams#show') do
|
||||||
|
= link_to team_path(@user_team), class: "activities-tab tab" do
|
||||||
|
%i.icon-home
|
||||||
|
Show
|
||||||
|
= nav_link(controller: [:members]) do
|
||||||
|
= link_to team_members_path(@user_team), class: "team-tab tab" do
|
||||||
|
%i.icon-user
|
||||||
|
Members
|
||||||
|
= nav_link(controller: [:projects]) do
|
||||||
|
= link_to team_projects_path(@user_team), class: "team-tab tab" do
|
||||||
|
%i.icon-briefcase
|
||||||
|
Projects
|
||||||
|
|
||||||
|
- if can? current_user, :manage_user_team, @user_team
|
||||||
|
= nav_link(path: 'teams#edit', html_options: {class: 'right'}) do
|
||||||
|
= link_to edit_team_path(@user_team), class: "stat-tab tab " do
|
||||||
|
%i.icon-edit
|
||||||
|
Edit
|
32
app/views/teams/edit.html.haml
Normal file
32
app/views/teams/edit.html.haml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
= render "team_head"
|
||||||
|
|
||||||
|
%h3.page_title= "Edit Team #{@user_team.name}"
|
||||||
|
%hr
|
||||||
|
= form_for @user_team, url: teams_path do |f|
|
||||||
|
- if @user_team.errors.any?
|
||||||
|
.alert-message.block-message.error
|
||||||
|
%span= @user_team.errors.full_messages.first
|
||||||
|
.clearfix
|
||||||
|
= f.label :name do
|
||||||
|
Team name is
|
||||||
|
.input
|
||||||
|
= f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
|
||||||
|
|
||||||
|
.clearfix
|
||||||
|
= f.label :path do
|
||||||
|
Team path is
|
||||||
|
.input
|
||||||
|
= f.text_field :path, placeholder: "opensource", class: "xxlarge left"
|
||||||
|
.clearfix
|
||||||
|
.input.span3.center
|
||||||
|
= f.submit 'Save team changes', class: "btn primary"
|
||||||
|
.input.span3.center
|
||||||
|
= link_to 'Delete team', team_path(@user_team), method: :delete, confirm: "You are shure?", class: "btn danger"
|
||||||
|
%hr
|
||||||
|
.padded
|
||||||
|
%ul
|
||||||
|
%li Team is kind of directory for several projects
|
||||||
|
%li All created teams are private
|
||||||
|
%li People within a team see only projects they have access to
|
||||||
|
%li All projects of team will be stored in team directory
|
||||||
|
%li You will be able to move existing projects into team
|
37
app/views/teams/index.html.haml
Normal file
37
app/views/teams/index.html.haml
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
%h3.page_title
|
||||||
|
Teams
|
||||||
|
%small
|
||||||
|
list of all teams
|
||||||
|
|
||||||
|
= link_to 'New Team', new_team_path, class: "btn small right"
|
||||||
|
%br
|
||||||
|
|
||||||
|
= form_tag search_teams_path, method: :get, class: 'form-inline' do
|
||||||
|
= text_field_tag :name, params[:name], class: "xlarge"
|
||||||
|
= submit_tag "Search", class: "btn submit primary"
|
||||||
|
|
||||||
|
%table.teams_list
|
||||||
|
%thead
|
||||||
|
%tr
|
||||||
|
%th
|
||||||
|
Name
|
||||||
|
%i.icon-sort-down
|
||||||
|
%th Path
|
||||||
|
%th Projects
|
||||||
|
%th Members
|
||||||
|
%th Owner
|
||||||
|
%th
|
||||||
|
|
||||||
|
- @teams.each do |team|
|
||||||
|
%tr
|
||||||
|
%td
|
||||||
|
%strong= link_to team.name, team_path(team)
|
||||||
|
%td= team.path
|
||||||
|
%td= link_to team.projects.count, team_projects_path(team)
|
||||||
|
%td= link_to team.members.count, team_members_path(team)
|
||||||
|
%td= link_to team.owner.name, team_member_path(team, team.owner)
|
||||||
|
%td
|
||||||
|
- if current_user.can?(:manage_user_team, team)
|
||||||
|
- if team.owner == current_user
|
||||||
|
= link_to "Destroy", team_path(team), method: :delete, confirm: "You are shure?", class: "danger btn small right"
|
||||||
|
= link_to "Edit", edit_team_path(team), class: "btn small right"
|
25
app/views/teams/issues.html.haml
Normal file
25
app/views/teams/issues.html.haml
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
= render "team_head"
|
||||||
|
|
||||||
|
%h3.page_title
|
||||||
|
Issues
|
||||||
|
%small (in Team projects assigned to Team members)
|
||||||
|
%small.right #{@issues.total_count} issues
|
||||||
|
|
||||||
|
%hr
|
||||||
|
.row
|
||||||
|
.span3
|
||||||
|
= render 'filter', entity: 'issue'
|
||||||
|
.span9
|
||||||
|
- if @issues.any?
|
||||||
|
- @issues.group_by(&:project).each do |group|
|
||||||
|
%div.ui-box
|
||||||
|
- @project = group[0]
|
||||||
|
%h5.title
|
||||||
|
= link_to_project @project
|
||||||
|
%ul.well-list.issues_table
|
||||||
|
- group[1].each do |issue|
|
||||||
|
= render(partial: 'issues/show', locals: {issue: issue})
|
||||||
|
%hr
|
||||||
|
= paginate @issues, theme: "gitlab"
|
||||||
|
- else
|
||||||
|
%p.nothing_here_message Nothing to show here
|
24
app/views/teams/merge_requests.html.haml
Normal file
24
app/views/teams/merge_requests.html.haml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
%h3.page_title
|
||||||
|
Merge Requests
|
||||||
|
%small (authored by or assigned to Team members)
|
||||||
|
%small.right #{@merge_requests.total_count} merge requests
|
||||||
|
|
||||||
|
%hr
|
||||||
|
.row
|
||||||
|
.span3
|
||||||
|
= render 'filter', entity: 'merge_request'
|
||||||
|
.span9
|
||||||
|
- if @merge_requests.any?
|
||||||
|
- @merge_requests.group_by(&:project).each do |group|
|
||||||
|
.ui-box
|
||||||
|
- @project = group[0]
|
||||||
|
%h5.title
|
||||||
|
= link_to_project @project
|
||||||
|
%ul.well-list
|
||||||
|
- group[1].each do |merge_request|
|
||||||
|
= render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request})
|
||||||
|
%hr
|
||||||
|
= paginate @merge_requests, theme: "gitlab"
|
||||||
|
|
||||||
|
- else
|
||||||
|
%h3.nothing_here_message Nothing to show here
|
21
app/views/teams/new.html.haml
Normal file
21
app/views/teams/new.html.haml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
%h3.page_title New Team
|
||||||
|
%hr
|
||||||
|
= form_for @team, url: teams_path do |f|
|
||||||
|
- if @team.errors.any?
|
||||||
|
.alert-message.block-message.error
|
||||||
|
%span= @team.errors.full_messages.first
|
||||||
|
.clearfix
|
||||||
|
= f.label :name do
|
||||||
|
Team name is
|
||||||
|
.input
|
||||||
|
= f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
|
||||||
|
|
||||||
|
= f.submit 'Create team', class: "btn primary"
|
||||||
|
%hr
|
||||||
|
.padded
|
||||||
|
%ul
|
||||||
|
%li Team is kind of directory for several projects
|
||||||
|
%li All created teams are private
|
||||||
|
%li People within a team see only projects they have access to
|
||||||
|
%li All projects of team will be stored in team directory
|
||||||
|
%li You will be able to move existing projects into team
|
11
app/views/teams/search.html.haml
Normal file
11
app/views/teams/search.html.haml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
= render "team_head"
|
||||||
|
|
||||||
|
= form_tag search_team_path(@user_team), method: :get, class: 'form-inline' do |f|
|
||||||
|
.padded
|
||||||
|
= label_tag :search do
|
||||||
|
%strong Looking for
|
||||||
|
.input
|
||||||
|
= search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
|
||||||
|
= submit_tag 'Search', class: "btn primary wide"
|
||||||
|
- if params[:search].present?
|
||||||
|
= render 'search/result'
|
30
app/views/teams/show.html.haml
Normal file
30
app/views/teams/show.html.haml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
= render "team_head"
|
||||||
|
|
||||||
|
.projects
|
||||||
|
.activities.span8
|
||||||
|
= link_to dashboard_path, class: 'btn very_small' do
|
||||||
|
← To dashboard
|
||||||
|
|
||||||
|
%span.cgray Events and projects are filtered in scope of team
|
||||||
|
%hr
|
||||||
|
- if @events.any?
|
||||||
|
.content_list
|
||||||
|
- else
|
||||||
|
%p.nothing_here_message Projects activity will be displayed here
|
||||||
|
.loading.hide
|
||||||
|
.side.span4
|
||||||
|
= render "projects", projects: @projects
|
||||||
|
%div
|
||||||
|
%span.rss-icon
|
||||||
|
= link_to dashboard_path(:atom, { private_token: current_user.private_token }) do
|
||||||
|
= image_tag "rss_ui.png", title: "feed"
|
||||||
|
%strong News Feed
|
||||||
|
|
||||||
|
%hr
|
||||||
|
.gitlab-promo
|
||||||
|
= link_to "Homepage", "http://gitlabhq.com"
|
||||||
|
= link_to "Blog", "http://blog.gitlabhq.com"
|
||||||
|
= link_to "@gitlabhq", "https://twitter.com/gitlabhq"
|
||||||
|
|
||||||
|
:javascript
|
||||||
|
$(function(){ Pager.init(20, true); });
|
|
@ -130,6 +130,20 @@ Gitlab::Application.routes.draw do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resources :teams do
|
||||||
|
member do
|
||||||
|
get :issues
|
||||||
|
get :merge_requests
|
||||||
|
get :search
|
||||||
|
post :delegate_projects
|
||||||
|
delete :relegate_project
|
||||||
|
put :update_access
|
||||||
|
end
|
||||||
|
collection do
|
||||||
|
get :search
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create]
|
resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create]
|
||||||
|
|
||||||
devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations }
|
devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations }
|
||||||
|
|
250
features/steps/userteams/userteams.rb
Normal file
250
features/steps/userteams/userteams.rb
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
class Userteams < Spinach::FeatureSteps
|
||||||
|
include SharedAuthentication
|
||||||
|
include SharedPaths
|
||||||
|
include SharedProject
|
||||||
|
|
||||||
|
When 'I do not have teams with me' do
|
||||||
|
UserTeam.with_member(current_user).destroy_all
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see dashboard page without teams info block' do
|
||||||
|
page.has_no_css?(".teams_box").must_equal true
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I have teams with my membership' do
|
||||||
|
team = create :user_team
|
||||||
|
team.add_member(current_user, UserTeam.access_roles["Master"], true)
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see dashboard page with teams information block' do
|
||||||
|
page.should have_css(".teams_box")
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'exist user teams' do
|
||||||
|
team = create :user_team
|
||||||
|
team.add_member(current_user, UserTeam.access_roles["Master"], true)
|
||||||
|
end
|
||||||
|
|
||||||
|
And 'I click on "All teams" link' do
|
||||||
|
click_link("All Teams")
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see "All teams" page' do
|
||||||
|
current_path.should == teams_path
|
||||||
|
end
|
||||||
|
|
||||||
|
And 'I should see exist teams in teams list' do
|
||||||
|
team = UserTeam.last
|
||||||
|
find_in_list(".teams_list tr", team).must_equal true
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I click to "New team" link' do
|
||||||
|
click_link("New Team")
|
||||||
|
end
|
||||||
|
|
||||||
|
And 'I submit form with new team info' do
|
||||||
|
fill_in 'name', with: 'gitlab'
|
||||||
|
click_button 'Create team'
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should be redirected to new team page' do
|
||||||
|
team = UserTeam.last
|
||||||
|
current_path.should == team_path(team)
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I have teams with projects and members' do
|
||||||
|
team = create :user_team
|
||||||
|
@project = create :project
|
||||||
|
team.add_member(current_user, UserTeam.access_roles["Master"], true)
|
||||||
|
team.assign_to_project(@project, UserTeam.access_roles["Master"])
|
||||||
|
@event = create(:closed_issue_event, project: @project)
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I visit team page' do
|
||||||
|
visit team_path(UserTeam.last)
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see projects list' do
|
||||||
|
page.should have_css(".projects_box")
|
||||||
|
projects_box = find(".projects_box")
|
||||||
|
projects_box.should have_content(@project.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
And 'project from team has issues assigned to me' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
project.issues << create(:issue, assignee: current_user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I visit team issues page' do
|
||||||
|
team = UserTeam.last
|
||||||
|
visit issues_team_path(team)
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see issues from this team assigned to me' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
project.issues.assigned(current_user).each do |issue|
|
||||||
|
page.should have_content issue.title
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Given 'I have team with projects and members' do
|
||||||
|
team = create :user_team
|
||||||
|
project = create :project
|
||||||
|
user = create :user
|
||||||
|
team.add_member(current_user, UserTeam.access_roles["Master"], true)
|
||||||
|
team.add_member(user, UserTeam.access_roles["Developer"], false)
|
||||||
|
team.assign_to_project(project, UserTeam.access_roles["Master"])
|
||||||
|
end
|
||||||
|
|
||||||
|
Given 'project from team has issues assigned to teams members' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
team.members.each do |member|
|
||||||
|
project.issues << create(:issue, assignee: member)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see issues from this team assigned to teams members' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
team.members.each do |member|
|
||||||
|
project.issues.assigned(member).each do |issue|
|
||||||
|
page.should have_content issue.title
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Given 'project from team has merge requests assigned to me' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
team.members.each do |member|
|
||||||
|
3.times { project.merge_requests << create(:merge_request, assignee: member) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I visit team merge requests page' do
|
||||||
|
team = UserTeam.last
|
||||||
|
visit merge_requests_team_path(team)
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see merge requests from this team assigned to me' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
team.members.each do |member|
|
||||||
|
project.issues.assigned(member).each do |merge_request|
|
||||||
|
page.should have_content merge_request.title
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Given 'project from team has merge requests assigned to team members' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
team.members.each do |member|
|
||||||
|
3.times { project.merge_requests << create(:merge_request, assignee: member) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see merge requests from this team assigned to me' do
|
||||||
|
team = UserTeam.last
|
||||||
|
team.projects.each do |project|
|
||||||
|
team.members.each do |member|
|
||||||
|
project.issues.assigned(member).each do |merge_request|
|
||||||
|
page.should have_content merge_request.title
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Given 'I have new user "John"' do
|
||||||
|
create :user, name: "John"
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I visit team people page' do
|
||||||
|
team = UserTeam.last
|
||||||
|
visit team_members_path(team)
|
||||||
|
end
|
||||||
|
|
||||||
|
And 'I select user "John" from list with role "Reporter"' do
|
||||||
|
pending 'step not implemented'
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see user "John" in team list' do
|
||||||
|
user = User.find_by_name("John")
|
||||||
|
team_members_list = find(".team-table")
|
||||||
|
team_members_list.should have_content user.name
|
||||||
|
end
|
||||||
|
|
||||||
|
And 'I have my own project without teams' do
|
||||||
|
project = create :project, creator: current_user
|
||||||
|
end
|
||||||
|
|
||||||
|
And 'I visit my team page' do
|
||||||
|
team = UserTeam.last
|
||||||
|
visit team_path(team)
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I click on link "Projects"' do
|
||||||
|
click_link "Projects"
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see form with my own project in avaliable projects list' do
|
||||||
|
project = current_user.projects.first
|
||||||
|
projects_select = find("#project_ids")
|
||||||
|
projects_select.should have_content(project.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I submit form with selected project and max access' do
|
||||||
|
project = current_user.projects.first
|
||||||
|
within "#team_projects" do
|
||||||
|
select project.name, :from => "project_ids"
|
||||||
|
select "Reporter", :from => "greatest_project_access"
|
||||||
|
end
|
||||||
|
click_button "Add"
|
||||||
|
end
|
||||||
|
|
||||||
|
Then 'I should see my own project in team projects list' do
|
||||||
|
project = current_user.projects.first
|
||||||
|
projects = all("table .project")
|
||||||
|
projects.each do |project_row|
|
||||||
|
project_row.should have_content(project.name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
When 'I click link "New Team Member"' do
|
||||||
|
click_link "New Team Member"
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def current_team
|
||||||
|
@user_team ||= Team.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def project
|
||||||
|
current_team.projects.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def assigned_to_user key, user
|
||||||
|
project.send(key).where(assignee_id: user)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_in_list(selector, item)
|
||||||
|
members_list = all(selector)
|
||||||
|
entered = false
|
||||||
|
members_list.each do |member_item|
|
||||||
|
entered = true if member_item.has_content?(item.name)
|
||||||
|
end
|
||||||
|
entered
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
75
features/teams/team.feature
Normal file
75
features/teams/team.feature
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
Feature: UserTeams
|
||||||
|
Background:
|
||||||
|
Given I sign in as a user
|
||||||
|
And I own project "Shop"
|
||||||
|
And project "Shop" has push event
|
||||||
|
|
||||||
|
Scenario: No teams, no dashboard info block
|
||||||
|
When I do not have teams with me
|
||||||
|
And I visit dashboard page
|
||||||
|
Then I should see dashboard page without teams info block
|
||||||
|
|
||||||
|
Scenario: I should see teams info block
|
||||||
|
When I have teams with my membership
|
||||||
|
And I visit dashboard page
|
||||||
|
Then I should see dashboard page with teams information block
|
||||||
|
|
||||||
|
Scenario: I should see all teams list
|
||||||
|
When exist user teams
|
||||||
|
And I visit dashboard page
|
||||||
|
And I click on "All teams" link
|
||||||
|
Then I should see "All teams" page
|
||||||
|
And I should see exist teams in teams list
|
||||||
|
|
||||||
|
Scenario: I should can create new team
|
||||||
|
When I have teams with my membership
|
||||||
|
And I visit dashboard page
|
||||||
|
When I click to "New team" link
|
||||||
|
And I submit form with new team info
|
||||||
|
Then I should be redirected to new team page
|
||||||
|
|
||||||
|
Scenario: I should see team dashboard list
|
||||||
|
When I have teams with projects and members
|
||||||
|
When I visit team page
|
||||||
|
Then I should see projects list
|
||||||
|
|
||||||
|
Scenario: I should see team issues list
|
||||||
|
Given I have team with projects and members
|
||||||
|
And project from team has issues assigned to me
|
||||||
|
When I visit team issues page
|
||||||
|
Then I should see issues from this team assigned to me
|
||||||
|
|
||||||
|
Scenario: I should see teams members issues list
|
||||||
|
Given I have team with projects and members
|
||||||
|
Given project from team has issues assigned to teams members
|
||||||
|
When I visit team issues page
|
||||||
|
Then I should see issues from this team assigned to teams members
|
||||||
|
|
||||||
|
Scenario: I should see team merge requests list
|
||||||
|
Given I have team with projects and members
|
||||||
|
Given project from team has merge requests assigned to me
|
||||||
|
When I visit team merge requests page
|
||||||
|
Then I should see merge requests from this team assigned to me
|
||||||
|
|
||||||
|
Scenario: I should see teams members merge requests list
|
||||||
|
Given I have team with projects and members
|
||||||
|
Given project from team has merge requests assigned to team members
|
||||||
|
When I visit team merge requests page
|
||||||
|
Then I should see merge requests from this team assigned to me
|
||||||
|
|
||||||
|
Scenario: I should add user to projects in Team
|
||||||
|
Given I have team with projects and members
|
||||||
|
Given I have new user "John"
|
||||||
|
When I visit team people page
|
||||||
|
When I click link "New Team Member"
|
||||||
|
And I select user "John" from list with role "Reporter"
|
||||||
|
Then I should see user "John" in team list
|
||||||
|
|
||||||
|
Scenario: I should assign my team to my own project
|
||||||
|
Given I have team with projects and members
|
||||||
|
And I have my own project without teams
|
||||||
|
And I visit my team page
|
||||||
|
When I click on link "Projects"
|
||||||
|
Then I should see form with my own project in avaliable projects list
|
||||||
|
When I submit form with selected project and max access
|
||||||
|
Then I should see my own project in team projects list
|
Loading…
Reference in a new issue