Commit bd1b15ec294171af5146ebfdcc5c521fa293fae4
Exists in
spb-stable
and in
3 other branches
Merge branch 'branch-via-api' into 'master'
Refactor branches API Preparing for new feature: Create branches via API
Showing
9 changed files
with
335 additions
and
317 deletions
Show diff stats
doc/api/README.md
| ... | ... | @@ -0,0 +1,167 @@ |
| 1 | +# Branches | |
| 2 | + | |
| 3 | +## List repository branches | |
| 4 | + | |
| 5 | +Get a list of repository branches from a project, sorted by name alphabetically. | |
| 6 | + | |
| 7 | +``` | |
| 8 | +GET /projects/:id/repository/branches | |
| 9 | +``` | |
| 10 | + | |
| 11 | +Parameters: | |
| 12 | + | |
| 13 | ++ `id` (required) - The ID of a project | |
| 14 | + | |
| 15 | +```json | |
| 16 | +[ | |
| 17 | + { | |
| 18 | + "name": "master", | |
| 19 | + "commit": { | |
| 20 | + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 21 | + "parents": [ | |
| 22 | + { | |
| 23 | + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 24 | + } | |
| 25 | + ], | |
| 26 | + "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 27 | + "message": "add projects API", | |
| 28 | + "author": { | |
| 29 | + "name": "John Smith", | |
| 30 | + "email": "john@example.com" | |
| 31 | + }, | |
| 32 | + "committer": { | |
| 33 | + "name": "John Smith", | |
| 34 | + "email": "john@example.com" | |
| 35 | + }, | |
| 36 | + "authored_date": "2012-06-27T05:51:39-07:00", | |
| 37 | + "committed_date": "2012-06-28T03:44:20-07:00" | |
| 38 | + }, | |
| 39 | + "protected": true | |
| 40 | + } | |
| 41 | +] | |
| 42 | +``` | |
| 43 | + | |
| 44 | + | |
| 45 | +## Get single repository branch | |
| 46 | + | |
| 47 | +Get a single project repository branch. | |
| 48 | + | |
| 49 | +``` | |
| 50 | +GET /projects/:id/repository/branches/:branch | |
| 51 | +``` | |
| 52 | + | |
| 53 | +Parameters: | |
| 54 | + | |
| 55 | ++ `id` (required) - The ID of a project | |
| 56 | ++ `branch` (required) - The name of the branch | |
| 57 | + | |
| 58 | +```json | |
| 59 | +{ | |
| 60 | + "name": "master", | |
| 61 | + "commit": { | |
| 62 | + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 63 | + "parents": [ | |
| 64 | + { | |
| 65 | + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 66 | + } | |
| 67 | + ], | |
| 68 | + "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 69 | + "message": "add projects API", | |
| 70 | + "author": { | |
| 71 | + "name": "John Smith", | |
| 72 | + "email": "john@example.com" | |
| 73 | + }, | |
| 74 | + "committer": { | |
| 75 | + "name": "John Smith", | |
| 76 | + "email": "john@example.com" | |
| 77 | + }, | |
| 78 | + "authored_date": "2012-06-27T05:51:39-07:00", | |
| 79 | + "committed_date": "2012-06-28T03:44:20-07:00" | |
| 80 | + }, | |
| 81 | + "protected": true | |
| 82 | +} | |
| 83 | +``` | |
| 84 | + | |
| 85 | + | |
| 86 | +## Protect repository branch | |
| 87 | + | |
| 88 | +Protects a single project repository branch. This is an idempotent function, protecting an already | |
| 89 | +protected repository branch still returns a `200 Ok` status code. | |
| 90 | + | |
| 91 | +``` | |
| 92 | +PUT /projects/:id/repository/branches/:branch/protect | |
| 93 | +``` | |
| 94 | + | |
| 95 | +Parameters: | |
| 96 | + | |
| 97 | ++ `id` (required) - The ID of a project | |
| 98 | ++ `branch` (required) - The name of the branch | |
| 99 | + | |
| 100 | +```json | |
| 101 | +{ | |
| 102 | + "name": "master", | |
| 103 | + "commit": { | |
| 104 | + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 105 | + "parents": [ | |
| 106 | + { | |
| 107 | + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 108 | + } | |
| 109 | + ], | |
| 110 | + "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 111 | + "message": "add projects API", | |
| 112 | + "author": { | |
| 113 | + "name": "John Smith", | |
| 114 | + "email": "john@example.com" | |
| 115 | + }, | |
| 116 | + "committer": { | |
| 117 | + "name": "John Smith", | |
| 118 | + "email": "john@example.com" | |
| 119 | + }, | |
| 120 | + "authored_date": "2012-06-27T05:51:39-07:00", | |
| 121 | + "committed_date": "2012-06-28T03:44:20-07:00" | |
| 122 | + }, | |
| 123 | + "protected": true | |
| 124 | +} | |
| 125 | +``` | |
| 126 | + | |
| 127 | + | |
| 128 | +## Unprotect repository branch | |
| 129 | + | |
| 130 | +Unprotects a single project repository branch. This is an idempotent function, unprotecting an already | |
| 131 | +unprotected repository branch still returns a `200 Ok` status code. | |
| 132 | + | |
| 133 | +``` | |
| 134 | +PUT /projects/:id/repository/branches/:branch/unprotect | |
| 135 | +``` | |
| 136 | + | |
| 137 | +Parameters: | |
| 138 | + | |
| 139 | ++ `id` (required) - The ID of a project | |
| 140 | ++ `branch` (required) - The name of the branch | |
| 141 | + | |
| 142 | +```json | |
| 143 | +{ | |
| 144 | + "name": "master", | |
| 145 | + "commit": { | |
| 146 | + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 147 | + "parents": [ | |
| 148 | + { | |
| 149 | + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 150 | + } | |
| 151 | + ], | |
| 152 | + "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 153 | + "message": "add projects API", | |
| 154 | + "author": { | |
| 155 | + "name": "John Smith", | |
| 156 | + "email": "john@example.com" | |
| 157 | + }, | |
| 158 | + "committer": { | |
| 159 | + "name": "John Smith", | |
| 160 | + "email": "john@example.com" | |
| 161 | + }, | |
| 162 | + "authored_date": "2012-06-27T05:51:39-07:00", | |
| 163 | + "committed_date": "2012-06-28T03:44:20-07:00" | |
| 164 | + }, | |
| 165 | + "protected": false | |
| 166 | +} | |
| 167 | +``` | ... | ... |
doc/api/repositories.md
| 1 | -## List repository branches | |
| 2 | - | |
| 3 | -Get a list of repository branches from a project, sorted by name alphabetically. | |
| 4 | - | |
| 5 | -``` | |
| 6 | -GET /projects/:id/repository/branches | |
| 7 | -``` | |
| 8 | - | |
| 9 | -Parameters: | |
| 10 | - | |
| 11 | -+ `id` (required) - The ID of a project | |
| 12 | - | |
| 13 | -```json | |
| 14 | -[ | |
| 15 | - { | |
| 16 | - "name": "master", | |
| 17 | - "commit": { | |
| 18 | - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 19 | - "parents": [ | |
| 20 | - { | |
| 21 | - "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 22 | - } | |
| 23 | - ], | |
| 24 | - "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 25 | - "message": "add projects API", | |
| 26 | - "author": { | |
| 27 | - "name": "John Smith", | |
| 28 | - "email": "john@example.com" | |
| 29 | - }, | |
| 30 | - "committer": { | |
| 31 | - "name": "John Smith", | |
| 32 | - "email": "john@example.com" | |
| 33 | - }, | |
| 34 | - "authored_date": "2012-06-27T05:51:39-07:00", | |
| 35 | - "committed_date": "2012-06-28T03:44:20-07:00" | |
| 36 | - }, | |
| 37 | - "protected": true | |
| 38 | - } | |
| 39 | -] | |
| 40 | -``` | |
| 41 | - | |
| 42 | - | |
| 43 | -## Get single repository branch | |
| 44 | - | |
| 45 | -Get a single project repository branch. | |
| 46 | - | |
| 47 | -``` | |
| 48 | -GET /projects/:id/repository/branches/:branch | |
| 49 | -``` | |
| 50 | - | |
| 51 | -Parameters: | |
| 52 | - | |
| 53 | -+ `id` (required) - The ID of a project | |
| 54 | -+ `branch` (required) - The name of the branch | |
| 55 | - | |
| 56 | -```json | |
| 57 | -{ | |
| 58 | - "name": "master", | |
| 59 | - "commit": { | |
| 60 | - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 61 | - "parents": [ | |
| 62 | - { | |
| 63 | - "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 64 | - } | |
| 65 | - ], | |
| 66 | - "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 67 | - "message": "add projects API", | |
| 68 | - "author": { | |
| 69 | - "name": "John Smith", | |
| 70 | - "email": "john@example.com" | |
| 71 | - }, | |
| 72 | - "committer": { | |
| 73 | - "name": "John Smith", | |
| 74 | - "email": "john@example.com" | |
| 75 | - }, | |
| 76 | - "authored_date": "2012-06-27T05:51:39-07:00", | |
| 77 | - "committed_date": "2012-06-28T03:44:20-07:00" | |
| 78 | - }, | |
| 79 | - "protected": true | |
| 80 | -} | |
| 81 | -``` | |
| 82 | - | |
| 83 | - | |
| 84 | -## Protect repository branch | |
| 85 | - | |
| 86 | -Protects a single project repository branch. This is an idempotent function, protecting an already | |
| 87 | -protected repository branch still returns a `200 Ok` status code. | |
| 88 | - | |
| 89 | -``` | |
| 90 | -PUT /projects/:id/repository/branches/:branch/protect | |
| 91 | -``` | |
| 92 | - | |
| 93 | -Parameters: | |
| 94 | - | |
| 95 | -+ `id` (required) - The ID of a project | |
| 96 | -+ `branch` (required) - The name of the branch | |
| 97 | - | |
| 98 | -```json | |
| 99 | -{ | |
| 100 | - "name": "master", | |
| 101 | - "commit": { | |
| 102 | - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 103 | - "parents": [ | |
| 104 | - { | |
| 105 | - "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 106 | - } | |
| 107 | - ], | |
| 108 | - "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 109 | - "message": "add projects API", | |
| 110 | - "author": { | |
| 111 | - "name": "John Smith", | |
| 112 | - "email": "john@example.com" | |
| 113 | - }, | |
| 114 | - "committer": { | |
| 115 | - "name": "John Smith", | |
| 116 | - "email": "john@example.com" | |
| 117 | - }, | |
| 118 | - "authored_date": "2012-06-27T05:51:39-07:00", | |
| 119 | - "committed_date": "2012-06-28T03:44:20-07:00" | |
| 120 | - }, | |
| 121 | - "protected": true | |
| 122 | -} | |
| 123 | -``` | |
| 124 | - | |
| 125 | - | |
| 126 | -## Unprotect repository branch | |
| 127 | - | |
| 128 | -Unprotects a single project repository branch. This is an idempotent function, unprotecting an already | |
| 129 | -unprotected repository branch still returns a `200 Ok` status code. | |
| 130 | - | |
| 131 | -``` | |
| 132 | -PUT /projects/:id/repository/branches/:branch/unprotect | |
| 133 | -``` | |
| 134 | - | |
| 135 | -Parameters: | |
| 136 | - | |
| 137 | -+ `id` (required) - The ID of a project | |
| 138 | -+ `branch` (required) - The name of the branch | |
| 139 | - | |
| 140 | -```json | |
| 141 | -{ | |
| 142 | - "name": "master", | |
| 143 | - "commit": { | |
| 144 | - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", | |
| 145 | - "parents": [ | |
| 146 | - { | |
| 147 | - "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" | |
| 148 | - } | |
| 149 | - ], | |
| 150 | - "tree": "46e82de44b1061621357f24c05515327f2795a95", | |
| 151 | - "message": "add projects API", | |
| 152 | - "author": { | |
| 153 | - "name": "John Smith", | |
| 154 | - "email": "john@example.com" | |
| 155 | - }, | |
| 156 | - "committer": { | |
| 157 | - "name": "John Smith", | |
| 158 | - "email": "john@example.com" | |
| 159 | - }, | |
| 160 | - "authored_date": "2012-06-27T05:51:39-07:00", | |
| 161 | - "committed_date": "2012-06-28T03:44:20-07:00" | |
| 162 | - }, | |
| 163 | - "protected": false | |
| 164 | -} | |
| 165 | -``` | |
| 166 | - | |
| 167 | - | |
| 168 | 1 | ## List project repository tags |
| 169 | 2 | |
| 170 | 3 | Get a list of repository tags from a project, sorted by name in reverse alphabetical order. | ... | ... |
lib/api/api.rb
| ... | ... | @@ -0,0 +1,70 @@ |
| 1 | +require 'mime/types' | |
| 2 | + | |
| 3 | +module API | |
| 4 | + # Projects API | |
| 5 | + class Branches < Grape::API | |
| 6 | + before { authenticate! } | |
| 7 | + before { authorize! :download_code, user_project } | |
| 8 | + | |
| 9 | + resource :projects do | |
| 10 | + # Get a project repository branches | |
| 11 | + # | |
| 12 | + # Parameters: | |
| 13 | + # id (required) - The ID of a project | |
| 14 | + # Example Request: | |
| 15 | + # GET /projects/:id/repository/branches | |
| 16 | + get ":id/repository/branches" do | |
| 17 | + present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project | |
| 18 | + end | |
| 19 | + | |
| 20 | + # Get a single branch | |
| 21 | + # | |
| 22 | + # Parameters: | |
| 23 | + # id (required) - The ID of a project | |
| 24 | + # branch (required) - The name of the branch | |
| 25 | + # Example Request: | |
| 26 | + # GET /projects/:id/repository/branches/:branch | |
| 27 | + get ":id/repository/branches/:branch" do | |
| 28 | + @branch = user_project.repo.heads.find { |item| item.name == params[:branch] } | |
| 29 | + not_found!("Branch does not exist") if @branch.nil? | |
| 30 | + present @branch, with: Entities::RepoObject, project: user_project | |
| 31 | + end | |
| 32 | + | |
| 33 | + # Protect a single branch | |
| 34 | + # | |
| 35 | + # Parameters: | |
| 36 | + # id (required) - The ID of a project | |
| 37 | + # branch (required) - The name of the branch | |
| 38 | + # Example Request: | |
| 39 | + # PUT /projects/:id/repository/branches/:branch/protect | |
| 40 | + put ":id/repository/branches/:branch/protect" do | |
| 41 | + authorize_admin_project | |
| 42 | + | |
| 43 | + @branch = user_project.repository.find_branch(params[:branch]) | |
| 44 | + not_found! unless @branch | |
| 45 | + protected_branch = user_project.protected_branches.find_by(name: @branch.name) | |
| 46 | + user_project.protected_branches.create(name: @branch.name) unless protected_branch | |
| 47 | + | |
| 48 | + present @branch, with: Entities::RepoObject, project: user_project | |
| 49 | + end | |
| 50 | + | |
| 51 | + # Unprotect a single branch | |
| 52 | + # | |
| 53 | + # Parameters: | |
| 54 | + # id (required) - The ID of a project | |
| 55 | + # branch (required) - The name of the branch | |
| 56 | + # Example Request: | |
| 57 | + # PUT /projects/:id/repository/branches/:branch/unprotect | |
| 58 | + put ":id/repository/branches/:branch/unprotect" do | |
| 59 | + authorize_admin_project | |
| 60 | + | |
| 61 | + @branch = user_project.repository.find_branch(params[:branch]) | |
| 62 | + not_found! unless @branch | |
| 63 | + protected_branch = user_project.protected_branches.find_by(name: @branch.name) | |
| 64 | + protected_branch.destroy if protected_branch | |
| 65 | + | |
| 66 | + present @branch, with: Entities::RepoObject, project: user_project | |
| 67 | + end | |
| 68 | + end | |
| 69 | + end | |
| 70 | +end | ... | ... |
lib/api/commits.rb
| 1 | 1 | require 'mime/types' |
| 2 | 2 | |
| 3 | 3 | module API |
| 4 | - # Projects API | |
| 4 | + # Projects commits API | |
| 5 | 5 | class Commits < Grape::API |
| 6 | 6 | before { authenticate! } |
| 7 | 7 | before { authorize! :download_code, user_project } |
| 8 | 8 | |
| 9 | 9 | resource :projects do |
| 10 | - helpers do | |
| 11 | - def handle_project_member_errors(errors) | |
| 12 | - if errors[:project_access].any? | |
| 13 | - error!(errors[:project_access], 422) | |
| 14 | - end | |
| 15 | - not_found! | |
| 16 | - end | |
| 17 | - end | |
| 18 | - | |
| 19 | 10 | # Get a project repository commits |
| 20 | 11 | # |
| 21 | 12 | # Parameters: | ... | ... |
lib/api/repositories.rb
| ... | ... | @@ -15,66 +15,6 @@ module API |
| 15 | 15 | not_found! |
| 16 | 16 | end |
| 17 | 17 | end |
| 18 | - | |
| 19 | - # Get a project repository branches | |
| 20 | - # | |
| 21 | - # Parameters: | |
| 22 | - # id (required) - The ID of a project | |
| 23 | - # Example Request: | |
| 24 | - # GET /projects/:id/repository/branches | |
| 25 | - get ":id/repository/branches" do | |
| 26 | - present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project | |
| 27 | - end | |
| 28 | - | |
| 29 | - # Get a single branch | |
| 30 | - # | |
| 31 | - # Parameters: | |
| 32 | - # id (required) - The ID of a project | |
| 33 | - # branch (required) - The name of the branch | |
| 34 | - # Example Request: | |
| 35 | - # GET /projects/:id/repository/branches/:branch | |
| 36 | - get ":id/repository/branches/:branch" do | |
| 37 | - @branch = user_project.repo.heads.find { |item| item.name == params[:branch] } | |
| 38 | - not_found!("Branch does not exist") if @branch.nil? | |
| 39 | - present @branch, with: Entities::RepoObject, project: user_project | |
| 40 | - end | |
| 41 | - | |
| 42 | - # Protect a single branch | |
| 43 | - # | |
| 44 | - # Parameters: | |
| 45 | - # id (required) - The ID of a project | |
| 46 | - # branch (required) - The name of the branch | |
| 47 | - # Example Request: | |
| 48 | - # PUT /projects/:id/repository/branches/:branch/protect | |
| 49 | - put ":id/repository/branches/:branch/protect" do | |
| 50 | - authorize_admin_project | |
| 51 | - | |
| 52 | - @branch = user_project.repository.find_branch(params[:branch]) | |
| 53 | - not_found! unless @branch | |
| 54 | - protected_branch = user_project.protected_branches.find_by(name: @branch.name) | |
| 55 | - user_project.protected_branches.create(name: @branch.name) unless protected_branch | |
| 56 | - | |
| 57 | - present @branch, with: Entities::RepoObject, project: user_project | |
| 58 | - end | |
| 59 | - | |
| 60 | - # Unprotect a single branch | |
| 61 | - # | |
| 62 | - # Parameters: | |
| 63 | - # id (required) - The ID of a project | |
| 64 | - # branch (required) - The name of the branch | |
| 65 | - # Example Request: | |
| 66 | - # PUT /projects/:id/repository/branches/:branch/unprotect | |
| 67 | - put ":id/repository/branches/:branch/unprotect" do | |
| 68 | - authorize_admin_project | |
| 69 | - | |
| 70 | - @branch = user_project.repository.find_branch(params[:branch]) | |
| 71 | - not_found! unless @branch | |
| 72 | - protected_branch = user_project.protected_branches.find_by(name: @branch.name) | |
| 73 | - protected_branch.destroy if protected_branch | |
| 74 | - | |
| 75 | - present @branch, with: Entities::RepoObject, project: user_project | |
| 76 | - end | |
| 77 | - | |
| 78 | 18 | # Get a project repository tags |
| 79 | 19 | # |
| 80 | 20 | # Parameters: | ... | ... |
| ... | ... | @@ -0,0 +1,95 @@ |
| 1 | +require 'spec_helper' | |
| 2 | +require 'mime/types' | |
| 3 | + | |
| 4 | +describe API::API do | |
| 5 | + include ApiHelpers | |
| 6 | + before(:each) { enable_observers } | |
| 7 | + after(:each) {disable_observers} | |
| 8 | + | |
| 9 | + let(:user) { create(:user) } | |
| 10 | + let(:user2) { create(:user) } | |
| 11 | + let!(:project) { create(:project, creator_id: user.id) } | |
| 12 | + let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) } | |
| 13 | + let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) } | |
| 14 | + | |
| 15 | + describe "GET /projects/:id/repository/branches" do | |
| 16 | + it "should return an array of project branches" do | |
| 17 | + get api("/projects/#{project.id}/repository/branches", user) | |
| 18 | + response.status.should == 200 | |
| 19 | + json_response.should be_an Array | |
| 20 | + json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name | |
| 21 | + end | |
| 22 | + end | |
| 23 | + | |
| 24 | + describe "GET /projects/:id/repository/branches/:branch" do | |
| 25 | + it "should return the branch information for a single branch" do | |
| 26 | + get api("/projects/#{project.id}/repository/branches/new_design", user) | |
| 27 | + response.status.should == 200 | |
| 28 | + | |
| 29 | + json_response['name'].should == 'new_design' | |
| 30 | + json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' | |
| 31 | + json_response['protected'].should == false | |
| 32 | + end | |
| 33 | + | |
| 34 | + it "should return a 403 error if guest" do | |
| 35 | + get api("/projects/#{project.id}/repository/branches", user2) | |
| 36 | + response.status.should == 403 | |
| 37 | + end | |
| 38 | + | |
| 39 | + it "should return a 404 error if branch is not available" do | |
| 40 | + get api("/projects/#{project.id}/repository/branches/unknown", user) | |
| 41 | + response.status.should == 404 | |
| 42 | + end | |
| 43 | + end | |
| 44 | + | |
| 45 | + describe "PUT /projects/:id/repository/branches/:branch/protect" do | |
| 46 | + it "should protect a single branch" do | |
| 47 | + put api("/projects/#{project.id}/repository/branches/new_design/protect", user) | |
| 48 | + response.status.should == 200 | |
| 49 | + | |
| 50 | + json_response['name'].should == 'new_design' | |
| 51 | + json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' | |
| 52 | + json_response['protected'].should == true | |
| 53 | + end | |
| 54 | + | |
| 55 | + it "should return a 404 error if branch not found" do | |
| 56 | + put api("/projects/#{project.id}/repository/branches/unknown/protect", user) | |
| 57 | + response.status.should == 404 | |
| 58 | + end | |
| 59 | + | |
| 60 | + it "should return a 403 error if guest" do | |
| 61 | + put api("/projects/#{project.id}/repository/branches/new_design/protect", user2) | |
| 62 | + response.status.should == 403 | |
| 63 | + end | |
| 64 | + | |
| 65 | + it "should return success when protect branch again" do | |
| 66 | + put api("/projects/#{project.id}/repository/branches/new_design/protect", user) | |
| 67 | + put api("/projects/#{project.id}/repository/branches/new_design/protect", user) | |
| 68 | + response.status.should == 200 | |
| 69 | + end | |
| 70 | + end | |
| 71 | + | |
| 72 | + describe "PUT /projects/:id/repository/branches/:branch/unprotect" do | |
| 73 | + it "should unprotect a single branch" do | |
| 74 | + put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user) | |
| 75 | + response.status.should == 200 | |
| 76 | + | |
| 77 | + json_response['name'].should == 'new_design' | |
| 78 | + json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' | |
| 79 | + json_response['protected'].should == false | |
| 80 | + end | |
| 81 | + | |
| 82 | + it "should return success when unprotect branch" do | |
| 83 | + put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user) | |
| 84 | + response.status.should == 404 | |
| 85 | + end | |
| 86 | + | |
| 87 | + it "should return success when unprotect branch again" do | |
| 88 | + put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user) | |
| 89 | + put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user) | |
| 90 | + response.status.should == 200 | |
| 91 | + end | |
| 92 | + end | |
| 93 | + | |
| 94 | + | |
| 95 | +end | ... | ... |
spec/requests/api/repositories_spec.rb
| ... | ... | @@ -14,86 +14,6 @@ describe API::API do |
| 14 | 14 | |
| 15 | 15 | before { project.team << [user, :reporter] } |
| 16 | 16 | |
| 17 | - | |
| 18 | - describe "GET /projects/:id/repository/branches" do | |
| 19 | - it "should return an array of project branches" do | |
| 20 | - get api("/projects/#{project.id}/repository/branches", user) | |
| 21 | - response.status.should == 200 | |
| 22 | - json_response.should be_an Array | |
| 23 | - json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name | |
| 24 | - end | |
| 25 | - end | |
| 26 | - | |
| 27 | - describe "GET /projects/:id/repository/branches/:branch" do | |
| 28 | - it "should return the branch information for a single branch" do | |
| 29 | - get api("/projects/#{project.id}/repository/branches/new_design", user) | |
| 30 | - response.status.should == 200 | |
| 31 | - | |
| 32 | - json_response['name'].should == 'new_design' | |
| 33 | - json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' | |
| 34 | - json_response['protected'].should == false | |
| 35 | - end | |
| 36 | - | |
| 37 | - it "should return a 403 error if guest" do | |
| 38 | - get api("/projects/#{project.id}/repository/branches", user2) | |
| 39 | - response.status.should == 403 | |
| 40 | - end | |
| 41 | - | |
| 42 | - it "should return a 404 error if branch is not available" do | |
| 43 | - get api("/projects/#{project.id}/repository/branches/unknown", user) | |
| 44 | - response.status.should == 404 | |
| 45 | - end | |
| 46 | - end | |
| 47 | - | |
| 48 | - describe "PUT /projects/:id/repository/branches/:branch/protect" do | |
| 49 | - it "should protect a single branch" do | |
| 50 | - put api("/projects/#{project.id}/repository/branches/new_design/protect", user) | |
| 51 | - response.status.should == 200 | |
| 52 | - | |
| 53 | - json_response['name'].should == 'new_design' | |
| 54 | - json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' | |
| 55 | - json_response['protected'].should == true | |
| 56 | - end | |
| 57 | - | |
| 58 | - it "should return a 404 error if branch not found" do | |
| 59 | - put api("/projects/#{project.id}/repository/branches/unknown/protect", user) | |
| 60 | - response.status.should == 404 | |
| 61 | - end | |
| 62 | - | |
| 63 | - it "should return a 403 error if guest" do | |
| 64 | - put api("/projects/#{project.id}/repository/branches/new_design/protect", user2) | |
| 65 | - response.status.should == 403 | |
| 66 | - end | |
| 67 | - | |
| 68 | - it "should return success when protect branch again" do | |
| 69 | - put api("/projects/#{project.id}/repository/branches/new_design/protect", user) | |
| 70 | - put api("/projects/#{project.id}/repository/branches/new_design/protect", user) | |
| 71 | - response.status.should == 200 | |
| 72 | - end | |
| 73 | - end | |
| 74 | - | |
| 75 | - describe "PUT /projects/:id/repository/branches/:branch/unprotect" do | |
| 76 | - it "should unprotect a single branch" do | |
| 77 | - put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user) | |
| 78 | - response.status.should == 200 | |
| 79 | - | |
| 80 | - json_response['name'].should == 'new_design' | |
| 81 | - json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' | |
| 82 | - json_response['protected'].should == false | |
| 83 | - end | |
| 84 | - | |
| 85 | - it "should return success when unprotect branch" do | |
| 86 | - put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user) | |
| 87 | - response.status.should == 404 | |
| 88 | - end | |
| 89 | - | |
| 90 | - it "should return success when unprotect branch again" do | |
| 91 | - put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user) | |
| 92 | - put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user) | |
| 93 | - response.status.should == 200 | |
| 94 | - end | |
| 95 | - end | |
| 96 | - | |
| 97 | 17 | describe "GET /projects/:id/repository/tags" do |
| 98 | 18 | it "should return an array of project tags" do |
| 99 | 19 | get api("/projects/#{project.id}/repository/tags", user) | ... | ... |