From b9519c83142d566ee562da57563db42849e91771 Mon Sep 17 00:00:00 2001
From: Robert Schilling <rschilling@student.tugraz.at>
Date: Wed, 13 Aug 2014 14:12:05 +0200
Subject: [PATCH] Validate label titel in project scope

---
 app/models/label.rb                    |  2 +-
 features/project/issues/labels.feature | 17 +++++++++++++++--
 features/steps/project/labels.rb       | 18 ++++++++++++++++++
 features/steps/shared/paths.rb         | 14 +++++++++++++-
 4 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/app/models/label.rb b/app/models/label.rb
index 941520b4c7484..515ed447f005a 100644
--- a/app/models/label.rb
+++ b/app/models/label.rb
@@ -12,7 +12,7 @@ class Label < ActiveRecord::Base
   validates :title,
             presence: true,
             format: { with: /\A[^&\?,&]*\z/ },
-            uniqueness: true
+            uniqueness: { scope: :project_id }
 
   scope :order_by_name, -> { reorder("labels.title ASC") }
 
diff --git a/features/project/issues/labels.feature b/features/project/issues/labels.feature
index b88108af719c6..29cf53072714f 100644
--- a/features/project/issues/labels.feature
+++ b/features/project/issues/labels.feature
@@ -10,7 +10,7 @@ Feature: Project Labels
     And I should see label "feature"
 
   Scenario: I create new label
-    Given I visit new label page
+    Given I visit project "Shop" new label page
     When I submit new label 'support'
     Then I should see label 'support'
 
@@ -25,6 +25,19 @@ Feature: Project Labels
     Then I should not see label 'bug'
 
   Scenario: I create a label with invalid color
-    Given I visit new label page
+    Given I visit project "Shop" new label page
     When I submit new label with invalid color
     Then I should see label color error message
+
+  Scenario: I create a label that already exists
+    Given I visit project "Shop" new label page
+    When I submit new label 'bug'
+    Then I should see label label exist error message
+
+  Scenario: I create the same label on another project
+    Given I own project "Forum"
+    And I visit project "Forum" labels page
+    And I visit project "Forum" new label page
+    When I submit new label 'bug'
+    Then I should see label 'bug'
+
diff --git a/features/steps/project/labels.rb b/features/steps/project/labels.rb
index 12ce23da8329a..8320405e096fd 100644
--- a/features/steps/project/labels.rb
+++ b/features/steps/project/labels.rb
@@ -31,18 +31,36 @@ class ProjectLabels < Spinach::FeatureSteps
     click_button 'Save'
   end
 
+  step 'I submit new label \'bug\'' do
+    fill_in 'Title', with: 'bug'
+    fill_in 'Background Color', with: '#F95610'
+    click_button 'Save'
+  end
+
   step 'I submit new label with invalid color' do
     fill_in 'Title', with: 'support'
     fill_in 'Background Color', with: '#12'
     click_button 'Save'
   end
 
+  step 'I should see label label exist error message' do
+    within '.label-form' do
+      page.should have_content 'Title has already been taken'
+    end
+  end
+
   step 'I should see label color error message' do
     within '.label-form' do
       page.should have_content 'Color is invalid'
     end
   end
 
+  step 'I should see label \'bug\'' do
+    within '.manage-labels-list' do
+      page.should have_content 'bug'
+    end
+  end
+
   step 'I should not see label \'bug\'' do
     within '.manage-labels-list' do
       page.should_not have_content 'bug'
diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb
index 4e97dba20b392..0d06383509f08 100644
--- a/features/steps/shared/paths.rb
+++ b/features/steps/shared/paths.rb
@@ -287,10 +287,22 @@ module SharedPaths
   end
 
   step 'I visit project "Shop" labels page' do
+    project = Project.find_by(name: 'Shop')
     visit project_labels_path(project)
   end
 
-  step 'I visit new label page' do
+  step 'I visit project "Forum" labels page' do
+    project = Project.find_by(name: 'Forum')
+    visit project_labels_path(project)
+  end
+
+  step 'I visit project "Shop" new label page' do
+    project = Project.find_by(name: 'Shop')
+    visit new_project_label_path(project)
+  end
+
+  step 'I visit project "Forum" new label page' do
+    project = Project.find_by(name: 'Forum')
     visit new_project_label_path(project)
   end
 
-- 
GitLab