Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
3ea955a6
Commit
3ea955a6
authored
Apr 05, 2016
by
Rémy Coutable
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve TeamcityService and its specs
Signed-off-by:
Rémy Coutable
<
remy@rymai.me
>
parent
06137079
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
203 additions
and
58 deletions
+203
-58
CHANGELOG
CHANGELOG
+1
-3
app/models/project_services/teamcity_service.rb
app/models/project_services/teamcity_service.rb
+3
-3
spec/models/project_services/teamcity_service_spec.rb
spec/models/project_services/teamcity_service_spec.rb
+199
-52
No files found.
CHANGELOG
View file @
3ea955a6
...
@@ -13,6 +13,7 @@ v 8.7.0 (unreleased)
...
@@ -13,6 +13,7 @@ v 8.7.0 (unreleased)
- Expose label description in API (Mariusz Jachimowicz)
- Expose label description in API (Mariusz Jachimowicz)
- Allow back dating on issues when created through the API
- Allow back dating on issues when created through the API
- Fix Error 500 after renaming a project path (Stan Hu)
- Fix Error 500 after renaming a project path (Stan Hu)
- Fix a bug whith trailing slash in teamcity_url (Charles May)
- Fix avatar stretching by providing a cropping feature
- Fix avatar stretching by providing a cropping feature
- API: Expose `subscribed` for issues and merge requests (Robert Schilling)
- API: Expose `subscribed` for issues and merge requests (Robert Schilling)
- Allow SAML to handle external users based on user's information !3530
- Allow SAML to handle external users based on user's information !3530
...
@@ -123,9 +124,6 @@ v 8.6.0
...
@@ -123,9 +124,6 @@ v 8.6.0
- Add information about `image` and `services` field at `job` level in the `.gitlab-ci.yml` documentation (Pat Turner)
- Add information about `image` and `services` field at `job` level in the `.gitlab-ci.yml` documentation (Pat Turner)
- HTTP error pages work independently from location and config (Artem Sidorenko)
- HTTP error pages work independently from location and config (Artem Sidorenko)
- Update `omniauth-saml` to 1.5.0 to allow for custom response attributes to be set
- Update `omniauth-saml` to 1.5.0 to allow for custom response attributes to be set
- Fix avatar stretching by providing a cropping feature (Johann Pardanaud)
- Fix a bug whith trailing slash in teamcity_url (Charles May)
- Don't load all of GitLab in mail_room
- Memoize @group in Admin::GroupsController (Yatish Mehta)
- Memoize @group in Admin::GroupsController (Yatish Mehta)
- Indicate how much an MR diverged from the target branch (Pierre de La Morinerie)
- Indicate how much an MR diverged from the target branch (Pierre de La Morinerie)
- Added omniauth-auth0 Gem (Daniel Carraro)
- Added omniauth-auth0 Gem (Daniel Carraro)
...
...
app/models/project_services/teamcity_service.rb
View file @
3ea955a6
...
@@ -91,7 +91,7 @@ class TeamcityService < CiService
...
@@ -91,7 +91,7 @@ class TeamcityService < CiService
).
to_s
).
to_s
auth
=
{
auth
=
{
username:
username
,
username:
username
,
password:
password
,
password:
password
}
}
@response
=
HTTParty
.
get
(
url
,
verify:
false
,
basic_auth:
auth
)
@response
=
HTTParty
.
get
(
url
,
verify:
false
,
basic_auth:
auth
)
end
end
...
@@ -108,7 +108,7 @@ class TeamcityService < CiService
...
@@ -108,7 +108,7 @@ class TeamcityService < CiService
built_id
=
@response
[
'build'
][
'id'
]
built_id
=
@response
[
'build'
][
'id'
]
URI
.
join
(
URI
.
join
(
teamcity_url
,
teamcity_url
,
"
#{
teamcity_url
}
/viewLog.html?buildId=
#{
built_id
}
&buildTypeId=
#{
build_type
}
"
"/viewLog.html?buildId=
#{
built_id
}
&buildTypeId=
#{
build_type
}
"
).
to_s
).
to_s
end
end
end
end
...
@@ -145,7 +145,7 @@ class TeamcityService < CiService
...
@@ -145,7 +145,7 @@ class TeamcityService < CiService
branch
=
Gitlab
::
Git
.
ref_name
(
data
[
:ref
])
branch
=
Gitlab
::
Git
.
ref_name
(
data
[
:ref
])
self
.
class
.
post
(
self
.
class
.
post
(
URI
.
join
(
teamcity_url
,
"/httpAuth/app/rest/buildQueue"
).
to_s
,
URI
.
join
(
teamcity_url
,
'/httpAuth/app/rest/buildQueue'
).
to_s
,
body:
"<build branchName=
\"
#{
branch
}
\"
>"
\
body:
"<build branchName=
\"
#{
branch
}
\"
>"
\
"<buildType id=
\"
#{
build_type
}
\"
/>"
\
"<buildType id=
\"
#{
build_type
}
\"
/>"
\
'</build>'
,
'</build>'
,
...
...
spec/models/project_services/teamcity_service_spec.rb
View file @
3ea955a6
...
@@ -21,73 +21,220 @@
...
@@ -21,73 +21,220 @@
require
'spec_helper'
require
'spec_helper'
describe
TeamcityService
,
models:
true
do
describe
TeamcityService
,
models:
true
do
describe
"Associations"
do
describe
'Associations'
do
it
{
is_expected
.
to
belong_to
:project
}
it
{
is_expected
.
to
belong_to
:project
}
it
{
is_expected
.
to
have_one
:service_hook
}
it
{
is_expected
.
to
have_one
:service_hook
}
end
end
describe
"Execute"
do
describe
'Validations'
do
let
(
:user
)
{
create
(
:user
)
}
describe
'#teamcity_url'
do
let
(
:project
)
{
create
(
:project
)
}
it
'does not validate the presence of teamcity_url if service is not active'
do
teamcity_service
=
service
context
"when a password was previously set"
do
teamcity_service
.
active
=
false
before
do
@teamcity_service
=
TeamcityService
.
create
(
expect
(
teamcity_service
).
not_to
validate_presence_of
(
:teamcity_url
)
project:
create
(
:project
),
properties:
{
teamcity_url:
'http://gitlab.com'
,
username:
'mic'
,
password:
"password"
}
)
end
end
it
"reset password if url changed"
do
it
'validates the presence of teamcity_url if service is active'
do
@teamcity_service
.
teamcity_url
=
'http://gitlab1.com'
teamcity_service
=
service
@teamcity_service
.
save
teamcity_service
.
active
=
true
expect
(
@teamcity_service
.
password
).
to
be_nil
expect
(
teamcity_service
).
to
validate_presence_of
(
:teamcity_url
)
end
end
describe
'#build_type'
do
it
'does not validate the presence of build_type if service is not active'
do
teamcity_service
=
service
teamcity_service
.
active
=
false
expect
(
teamcity_service
).
not_to
validate_presence_of
(
:build_type
)
end
it
'validates the presence of build_type if service is active'
do
teamcity_service
=
service
teamcity_service
.
active
=
true
expect
(
teamcity_service
).
to
validate_presence_of
(
:build_type
)
end
end
end
it
"does not reset password if username changed"
do
@teamcity_service
.
username
=
"some_name"
describe
'#username'
do
@teamcity_service
.
save
it
'does not validate the presence of username if service is not active'
do
expect
(
@teamcity_service
.
password
).
to
eq
(
"password"
)
teamcity_service
=
service
teamcity_service
.
active
=
false
expect
(
teamcity_service
).
not_to
validate_presence_of
(
:username
)
end
end
it
"does not reset password if new url is set together with password, even if it's the same password"
do
it
'does not validate the presence of username if username is nil'
do
@teamcity_service
.
teamcity_url
=
'http://gitlab_edited.com'
teamcity_service
=
service
@teamcity_service
.
password
=
'password'
teamcity_service
.
active
=
true
@teamcity_service
.
save
teamcity_service
.
password
=
nil
expect
(
@teamcity_service
.
password
).
to
eq
(
"password"
)
expect
(
@teamcity_service
.
teamcity_url
).
to
eq
(
"http://gitlab_edited.com"
)
expect
(
teamcity_service
).
not_to
validate_presence_of
(
:username
)
end
end
it
"should reset password if url changed, even if setter called multiple times"
do
it
'validates the presence of username if service is active and username is present'
do
@teamcity_service
.
teamcity_url
=
'http://gitlab1.com'
teamcity_service
=
service
@teamcity_service
.
teamcity_url
=
'http://gitlab1.com'
teamcity_service
.
active
=
true
@teamcity_service
.
save
teamcity_service
.
password
=
'secret'
expect
(
@teamcity_service
.
password
).
to
be_nil
expect
(
teamcity_service
).
to
validate_presence_of
(
:username
)
end
end
end
end
context
"when no password was previously set"
do
describe
'#password'
do
before
do
it
'does not validate the presence of password if service is not active'
do
@teamcity_service
=
TeamcityService
.
create
(
teamcity_service
=
service
project:
create
(
:project
),
teamcity_service
.
active
=
false
properties:
{
teamcity_url:
'http://gitlab.com'
,
expect
(
teamcity_service
).
not_to
validate_presence_of
(
:password
)
username:
'mic'
end
}
)
it
'does not validate the presence of password if username is nil'
do
teamcity_service
=
service
teamcity_service
.
active
=
true
teamcity_service
.
username
=
nil
expect
(
teamcity_service
).
not_to
validate_presence_of
(
:password
)
end
end
it
"saves password if new url is set together with password"
do
it
'validates the presence of password if service is active and username is present'
do
@teamcity_service
.
teamcity_url
=
'http://gitlab_edited.com'
teamcity_service
=
service
@teamcity_service
.
password
=
'password'
teamcity_service
.
active
=
true
@teamcity_service
.
save
teamcity_service
.
username
=
'john'
expect
(
@teamcity_service
.
password
).
to
eq
(
"password"
)
expect
(
@teamcity_service
.
teamcity_url
).
to
eq
(
"http://gitlab_edited.com"
)
expect
(
teamcity_service
).
to
validate_presence_of
(
:password
)
end
end
end
end
end
end
describe
'Callbacks'
do
describe
'before_update :reset_password'
do
context
'when a password was previously set'
do
it
'resets password if url changed'
do
teamcity_service
=
service
teamcity_service
.
teamcity_url
=
'http://gitlab1.com'
teamcity_service
.
save
expect
(
teamcity_service
.
password
).
to
be_nil
end
it
'does not reset password if username changed'
do
teamcity_service
=
service
teamcity_service
.
username
=
'some_name'
teamcity_service
.
save
expect
(
teamcity_service
.
password
).
to
eq
(
'password'
)
end
it
"does not reset password if new url is set together with password, even if it's the same password"
do
teamcity_service
=
service
teamcity_service
.
teamcity_url
=
'http://gitlab_edited.com'
teamcity_service
.
password
=
'password'
teamcity_service
.
save
expect
(
teamcity_service
.
password
).
to
eq
(
'password'
)
expect
(
teamcity_service
.
teamcity_url
).
to
eq
(
'http://gitlab_edited.com'
)
end
end
it
'saves password if new url is set together with password when no password was previously set'
do
teamcity_service
=
service
teamcity_service
.
password
=
nil
teamcity_service
.
teamcity_url
=
'http://gitlab_edited.com'
teamcity_service
.
password
=
'password'
teamcity_service
.
save
expect
(
teamcity_service
.
password
).
to
eq
(
'password'
)
expect
(
teamcity_service
.
teamcity_url
).
to
eq
(
'http://gitlab_edited.com'
)
end
end
end
describe
'#build_page'
do
it
'returns a specific URL when status is 500'
do
stub_request
(
status:
500
)
expect
(
service
.
build_page
(
'123'
,
'unused'
)).
to
eq
(
'http://gitlab.com/viewLog.html?buildTypeId=foo'
)
end
it
'returns a build URL when teamcity_url has no trailing slash'
do
stub_request
(
body:
%Q({"build":{"id":"666"}})
)
expect
(
service
(
teamcity_url:
'http://gitlab.com'
).
build_page
(
'123'
,
'unused'
)).
to
eq
(
'http://gitlab.com/viewLog.html?buildId=666&buildTypeId=foo'
)
end
it
'returns a build URL when teamcity_url has a trailing slash'
do
stub_request
(
body:
%Q({"build":{"id":"666"}})
)
expect
(
service
(
teamcity_url:
'http://gitlab.com/'
).
build_page
(
'123'
,
'unused'
)).
to
eq
(
'http://gitlab.com/viewLog.html?buildId=666&buildTypeId=foo'
)
end
end
describe
'#commit_status'
do
it
'sets commit status to :error when status is 500'
do
stub_request
(
status:
500
)
expect
(
service
.
commit_status
(
'123'
,
'unused'
)).
to
eq
(
:error
)
end
it
'sets commit status to "pending" when status is 404'
do
stub_request
(
status:
404
)
expect
(
service
.
commit_status
(
'123'
,
'unused'
)).
to
eq
(
'pending'
)
end
it
'sets commit status to "success" when build status contains SUCCESS'
do
stub_request
(
build_status:
'YAY SUCCESS!'
)
expect
(
service
.
commit_status
(
'123'
,
'unused'
)).
to
eq
(
'success'
)
end
it
'sets commit status to "failed" when build status contains FAILURE'
do
stub_request
(
build_status:
'NO FAILURE!'
)
expect
(
service
.
commit_status
(
'123'
,
'unused'
)).
to
eq
(
'failed'
)
end
it
'sets commit status to "pending" when build status contains Pending'
do
stub_request
(
build_status:
'NO Pending!'
)
expect
(
service
.
commit_status
(
'123'
,
'unused'
)).
to
eq
(
'pending'
)
end
it
'sets commit status to :error when build status is unknown'
do
stub_request
(
build_status:
'FOO BAR!'
)
expect
(
service
.
commit_status
(
'123'
,
'unused'
)).
to
eq
(
:error
)
end
end
def
service
(
teamcity_url:
'http://gitlab.com'
)
described_class
.
create
(
project:
build_stubbed
(
:empty_project
),
properties:
{
teamcity_url:
teamcity_url
,
username:
'mic'
,
password:
'password'
,
build_type:
'foo'
}
)
end
def
stub_request
(
status:
200
,
body:
nil
,
build_status:
'success'
)
teamcity_full_url
=
'http://mic:password@gitlab.com/httpAuth/app/rest/builds/branch:unspecified:any,number:123'
body
||=
%Q({"build":{"status":"
#{
build_status
}
","id":"666"}})
WebMock
.
stub_request
(
:get
,
teamcity_full_url
).
to_return
(
status:
status
,
headers:
{
'Content-Type'
=>
'application/json'
},
body:
body
)
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment