Commit d98b1833612af09fb405880ef7acd63a4e2a42fa
1 parent
23d95085
Exists in
master
and in
4 other branches
first pack of tests for milestones
Showing
8 changed files
with
145 additions
and
48 deletions
Show diff stats
app/helpers/projects_helper.rb
| ... | ... | @@ -16,45 +16,7 @@ module ProjectsHelper |
| 16 | 16 | nil |
| 17 | 17 | end |
| 18 | 18 | |
| 19 | - def project_tab_class | |
| 20 | - [:show, :files, :team, :edit, :update].each do |action| | |
| 21 | - return "current" if current_page?(:controller => "projects", :action => action, :id => @project) | |
| 22 | - end | |
| 23 | - | |
| 24 | - if controller.controller_name == "snippets" || | |
| 25 | - controller.controller_name == "hooks" || | |
| 26 | - controller.controller_name == "deploy_keys" || | |
| 27 | - controller.controller_name == "team_members" | |
| 28 | - "current" | |
| 29 | - end | |
| 30 | - end | |
| 31 | - | |
| 32 | - def tree_tab_class | |
| 33 | - controller.controller_name == "refs" ? | |
| 34 | - "current" : nil | |
| 35 | - end | |
| 36 | - | |
| 37 | 19 | def repository_tab_class |
| 38 | - #if controller.controller_name == "repositories" || | |
| 39 | - #controller.controller_name == "hooks" || | |
| 40 | - #controller.controller_name == "deploy_keys" | |
| 41 | - #"current" | |
| 42 | - #end | |
| 43 | - end | |
| 44 | - | |
| 45 | - def commit_tab_class | |
| 46 | - if controller.controller_name == "commits" || | |
| 47 | - controller.controller_name == "repositories" || | |
| 48 | - controller.controller_name == "protected_branches" | |
| 49 | - "current" | |
| 50 | - end | |
| 51 | 20 | end |
| 52 | 21 | |
| 53 | - def branches_tab_class | |
| 54 | - if current_page?(branches_project_repository_path(@project)) || | |
| 55 | - controller.controller_name == "protected_branches" || | |
| 56 | - current_page?(project_repository_path(@project)) | |
| 57 | - 'active' | |
| 58 | - end | |
| 59 | - end | |
| 60 | 22 | end | ... | ... |
| ... | ... | @@ -0,0 +1,43 @@ |
| 1 | +module TabHelper | |
| 2 | + def issues_tab? | |
| 3 | + controller.controller_name == "issues" || controller.controller_name == "milestones" | |
| 4 | + end | |
| 5 | + | |
| 6 | + def wall_tab? | |
| 7 | + current_page?(:controller => "projects", :action => "wall", :id => @project) | |
| 8 | + end | |
| 9 | + | |
| 10 | + def project_tab_class | |
| 11 | + [:show, :files, :team, :edit, :update].each do |action| | |
| 12 | + return "current" if current_page?(:controller => "projects", :action => action, :id => @project) | |
| 13 | + end | |
| 14 | + | |
| 15 | + if controller.controller_name == "snippets" || | |
| 16 | + controller.controller_name == "hooks" || | |
| 17 | + controller.controller_name == "deploy_keys" || | |
| 18 | + controller.controller_name == "team_members" | |
| 19 | + "current" | |
| 20 | + end | |
| 21 | + end | |
| 22 | + | |
| 23 | + def tree_tab_class | |
| 24 | + controller.controller_name == "refs" ? | |
| 25 | + "current" : nil | |
| 26 | + end | |
| 27 | + | |
| 28 | + def commit_tab_class | |
| 29 | + if controller.controller_name == "commits" || | |
| 30 | + controller.controller_name == "repositories" || | |
| 31 | + controller.controller_name == "protected_branches" | |
| 32 | + "current" | |
| 33 | + end | |
| 34 | + end | |
| 35 | + | |
| 36 | + def branches_tab_class | |
| 37 | + if current_page?(branches_project_repository_path(@project)) || | |
| 38 | + controller.controller_name == "protected_branches" || | |
| 39 | + current_page?(project_repository_path(@project)) | |
| 40 | + 'active' | |
| 41 | + end | |
| 42 | + end | |
| 43 | +end | ... | ... |
app/views/layouts/_project_menu.html.haml
| ... | ... | @@ -10,7 +10,7 @@ |
| 10 | 10 | |
| 11 | 11 | = link_to "Network", graph_project_path(@project), :class => current_page?(:controller => "projects", :action => "graph", :id => @project) ? "current" : nil |
| 12 | 12 | - if @project.issues_enabled |
| 13 | - = link_to project_issues_filter_path(@project), :class => (controller.controller_name == "issues") ? "current" : nil do | |
| 13 | + = link_to project_issues_filter_path(@project), :class => issues_tab? ? "current" : nil do | |
| 14 | 14 | Issues |
| 15 | 15 | %span.count= @project.issues.opened.count |
| 16 | 16 | - if @project.merge_requests_enabled |
| ... | ... | @@ -19,7 +19,7 @@ |
| 19 | 19 | %span.count= @project.merge_requests.opened.count |
| 20 | 20 | |
| 21 | 21 | - if @project.wall_enabled |
| 22 | - = link_to wall_project_path(@project), :class => current_page?(:controller => "projects", :action => "wall", :id => @project) ? "current" : nil do | |
| 22 | + = link_to wall_project_path(@project), :class => wall_tab? ? "current" : nil do | |
| 23 | 23 | Wall |
| 24 | 24 | |
| 25 | 25 | - if @project.wiki_enabled | ... | ... |
db/schema.rb
| ... | ... | @@ -65,18 +65,18 @@ ActiveRecord::Schema.define(:version => 20120408181910) do |
| 65 | 65 | t.text "st_commits", :limit => 2147483647 |
| 66 | 66 | t.text "st_diffs", :limit => 2147483647 |
| 67 | 67 | t.boolean "merged", :default => false, :null => false |
| 68 | - t.boolean "auto_merge", :default => true, :null => false | |
| 69 | 68 | end |
| 70 | 69 | |
| 71 | 70 | add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id" |
| 72 | 71 | |
| 73 | 72 | create_table "milestones", :force => true do |t| |
| 74 | - t.string "title", :null => false | |
| 73 | + t.string "title", :null => false | |
| 74 | + t.integer "project_id", :null => false | |
| 75 | 75 | t.text "description" |
| 76 | - t.date "due_date", :null => false | |
| 77 | - t.integer "project_id", :null => false | |
| 78 | - t.datetime "created_at", :null => false | |
| 79 | - t.datetime "updated_at", :null => false | |
| 76 | + t.date "due_date" | |
| 77 | + t.boolean "closed", :default => false, :null => false | |
| 78 | + t.datetime "created_at", :null => false | |
| 79 | + t.datetime "updated_at", :null => false | |
| 80 | 80 | end |
| 81 | 81 | |
| 82 | 82 | create_table "notes", :force => true do |t| | ... | ... |
spec/factories.rb
spec/models/issue_spec.rb
| ... | ... | @@ -5,6 +5,7 @@ describe Issue do |
| 5 | 5 | it { should belong_to(:project) } |
| 6 | 6 | it { should belong_to(:author) } |
| 7 | 7 | it { should belong_to(:assignee) } |
| 8 | + it { should belong_to(:milestone) } | |
| 8 | 9 | end |
| 9 | 10 | |
| 10 | 11 | describe "Validation" do |
| ... | ... | @@ -22,7 +23,7 @@ describe Issue do |
| 22 | 23 | it { Factory.create(:issue, |
| 23 | 24 | :author => Factory(:user), |
| 24 | 25 | :assignee => Factory(:user), |
| 25 | - :project => Factory.create(:project)).should be_valid } | |
| 26 | + :projet => Factory.create(:project)).should be_valid } | |
| 26 | 27 | |
| 27 | 28 | describe "plus 1" do |
| 28 | 29 | let(:project) { Factory(:project) } | ... | ... |
spec/models/milestone_spec.rb
| 1 | 1 | require 'spec_helper' |
| 2 | 2 | |
| 3 | 3 | describe Milestone do |
| 4 | - pending "add some examples to (or delete) #{__FILE__}" | |
| 4 | + describe "Associations" do | |
| 5 | + it { should belong_to(:project) } | |
| 6 | + it { should have_many(:issues) } | |
| 7 | + end | |
| 8 | + | |
| 9 | + describe "Validation" do | |
| 10 | + it { should validate_presence_of(:title) } | |
| 11 | + it { should validate_presence_of(:project_id) } | |
| 12 | + end | |
| 13 | + | |
| 14 | + let(:project) { Factory :project } | |
| 15 | + let(:milestone) { Factory :milestone, :project => project } | |
| 16 | + let(:issue) { Factory :issue, :project => project } | |
| 17 | + | |
| 18 | + it { milestone.should be_valid } | |
| 19 | + | |
| 20 | + describe "Issues" do | |
| 21 | + before do | |
| 22 | + milestone.issues << issue | |
| 23 | + end | |
| 24 | + | |
| 25 | + it { milestone.percent_complete.should == 0 } | |
| 26 | + | |
| 27 | + it do | |
| 28 | + issue.update_attributes :closed => true | |
| 29 | + milestone.percent_complete.should == 100 | |
| 30 | + end | |
| 31 | + end | |
| 32 | + | |
| 33 | + describe :expires_at do | |
| 34 | + before do | |
| 35 | + milestone.update_attributes :due_date => Date.today + 1.day | |
| 36 | + end | |
| 37 | + | |
| 38 | + it { milestone.expires_at.should_not be_nil } | |
| 39 | + end | |
| 5 | 40 | end | ... | ... |
| ... | ... | @@ -0,0 +1,51 @@ |
| 1 | +require 'spec_helper' | |
| 2 | + | |
| 3 | +describe "Milestones" do | |
| 4 | + let(:project) { Factory :project } | |
| 5 | + | |
| 6 | + before do | |
| 7 | + login_as :user | |
| 8 | + project.add_access(@user, :admin) | |
| 9 | + | |
| 10 | + @milestone = Factory :milestone, :project => project | |
| 11 | + @issue = Factory :issue, :project => project | |
| 12 | + | |
| 13 | + @milestone.issues << @issue | |
| 14 | + end | |
| 15 | + | |
| 16 | + describe "GET /milestones" do | |
| 17 | + before do | |
| 18 | + visit project_milestones_path(project) | |
| 19 | + end | |
| 20 | + | |
| 21 | + subject { page } | |
| 22 | + | |
| 23 | + it { should have_content(@milestone.title[0..10]) } | |
| 24 | + it { should have_content(@milestone.expires_at) } | |
| 25 | + it { should have_content("Browse Issues") } | |
| 26 | + end | |
| 27 | + | |
| 28 | + describe "GET /milestone/:id" do | |
| 29 | + before do | |
| 30 | + visit project_milestone_path(project, @milestone) | |
| 31 | + end | |
| 32 | + | |
| 33 | + subject { page } | |
| 34 | + | |
| 35 | + it { should have_content(@milestone.title[0..10]) } | |
| 36 | + it { should have_content(@milestone.expires_at) } | |
| 37 | + it { should have_content("Browse Issues") } | |
| 38 | + end | |
| 39 | + | |
| 40 | + describe "GET /milestones/new" do | |
| 41 | + before do | |
| 42 | + visit new_project_milestone_path(project) | |
| 43 | + fill_in "milestone_title", :with => "v2.3" | |
| 44 | + click_button "Create milestone" | |
| 45 | + end | |
| 46 | + | |
| 47 | + it { current_path.should == project_milestone_path(project, project.milestones.last) } | |
| 48 | + it { should have_content(@milestone.title[0..10]) } | |
| 49 | + it { should have_content(@milestone.expires_at) } | |
| 50 | + end | |
| 51 | +end | ... | ... |