vx-service_connector 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +10 -0
  9. data/lib/vx/service_connector.rb +37 -0
  10. data/lib/vx/service_connector/base.rb +27 -0
  11. data/lib/vx/service_connector/github.rb +49 -0
  12. data/lib/vx/service_connector/github/commits.rb +33 -0
  13. data/lib/vx/service_connector/github/deploy_keys.rb +29 -0
  14. data/lib/vx/service_connector/github/files.rb +21 -0
  15. data/lib/vx/service_connector/github/hooks.rb +33 -0
  16. data/lib/vx/service_connector/github/notices.rb +40 -0
  17. data/lib/vx/service_connector/github/payload.rb +124 -0
  18. data/lib/vx/service_connector/github/repos.rb +52 -0
  19. data/lib/vx/service_connector/gitlab_v3.rb +29 -0
  20. data/lib/vx/service_connector/gitlab_v3/deploy_keys.rb +20 -0
  21. data/lib/vx/service_connector/gitlab_v3/repos.rb +28 -0
  22. data/lib/vx/service_connector/model.rb +82 -0
  23. data/lib/vx/service_connector/version.rb +5 -0
  24. data/spec/fixtures/github/add_deploy_key.json +6 -0
  25. data/spec/fixtures/github/commit.json +83 -0
  26. data/spec/fixtures/github/create_hook.json +12 -0
  27. data/spec/fixtures/github/create_status.json +5 -0
  28. data/spec/fixtures/github/deploy_keys.json +8 -0
  29. data/spec/fixtures/github/hooks.json +18 -0
  30. data/spec/fixtures/github/org_repos.json +51 -0
  31. data/spec/fixtures/github/orgs.json +8 -0
  32. data/spec/fixtures/github/payload/closed_pull_request.json +392 -0
  33. data/spec/fixtures/github/payload/foreign_pull_request.json +1 -0
  34. data/spec/fixtures/github/payload/pull_request.json +392 -0
  35. data/spec/fixtures/github/payload/push.json +92 -0
  36. data/spec/fixtures/github/payload/push_tag.json +135 -0
  37. data/spec/fixtures/github/user_repos.json +48 -0
  38. data/spec/fixtures/gitlab_v3/deploy_keys.json +14 -0
  39. data/spec/fixtures/gitlab_v3/projects.json +72 -0
  40. data/spec/lib/github_payload_spec.rb +136 -0
  41. data/spec/lib/github_spec.rb +159 -0
  42. data/spec/lib/gitlab_v3_spec.rb +44 -0
  43. data/spec/lib/model_spec.rb +37 -0
  44. data/spec/lib/service_connector_spec.rb +30 -0
  45. data/spec/spec_helper.rb +14 -0
  46. data/spec/support/create.rb +6 -0
  47. data/spec/support/github_web_mocks.rb +101 -0
  48. data/spec/support/gitlab_v3_mocks.rb +29 -0
  49. data/spec/support/read_fixture.rb +12 -0
  50. data/vx-service_connector.gemspec +28 -0
  51. metadata +203 -0
@@ -0,0 +1,135 @@
1
+ {
2
+ "ref":"refs/tags/v0.0.1",
3
+ "after":"2d6e206be0b94c9694af0ad37a7bf44207500b9f",
4
+ "before":"0000000000000000000000000000000000000000",
5
+ "created":true,
6
+ "deleted":false,
7
+ "forced":true,
8
+ "compare":"https://github.com/evrone/serverist-sample_storage/compare/v0.0.1",
9
+ "commits":null,
10
+ "head_commit":{
11
+ "id":"c391528c6fd03cbf9bc74b8ac42e0a50d953eeea",
12
+ "distinct":true,
13
+ "message":"move redis methods to module Config, add static_sample_storage and dynamic_sample_storage to SampleStorage module",
14
+ "timestamp":"2013-12-04T06:55:04-08:00",
15
+ "url":"https://github.com/evrone/serverist-sample_storage/commit/c391528c6fd03cbf9bc74b8ac42e0a50d953eeea",
16
+ "author":{
17
+ "name":"Dmitry Galinsky",
18
+ "email":"dima.exe@gmail.com",
19
+ "username":"dima-exe"
20
+ },
21
+ "committer":{
22
+ "name":"Dmitry Galinsky",
23
+ "email":"dima.exe@gmail.com",
24
+ "username":"dima-exe"
25
+ },
26
+ "added":[
27
+ "lib/serverist/sample_storage/config.rb",
28
+ "spec/lib/config_spec.rb"
29
+ ],
30
+ "removed":null,
31
+ "modified":[
32
+ "lib/serverist/sample_storage.rb",
33
+ "lib/serverist/sample_storage/redis.rb",
34
+ "spec/lib/sample_storage_spec.rb",
35
+ "spec/spec_helper.rb"
36
+ ]
37
+ },
38
+ "repository":{
39
+ "id":14926202,
40
+ "name":"serverist-sample_storage",
41
+ "url":"https://github.com/evrone/serverist-sample_storage",
42
+ "description":"",
43
+ "watchers":0,
44
+ "stargazers":0,
45
+ "forks":0,
46
+ "fork":false,
47
+ "size":84,
48
+ "owner":{
49
+ "name":"evrone",
50
+ "email":"oleg@evrone.com"
51
+ },
52
+ "private":false,
53
+ "open_issues":0,
54
+ "has_issues":true,
55
+ "has_downloads":true,
56
+ "has_wiki":true,
57
+ "language":"Ruby",
58
+ "created_at":1386167861,
59
+ "pushed_at":1386168924,
60
+ "master_branch":"master",
61
+ "organization":"evrone"
62
+ },
63
+ "pusher":{
64
+ "name":"dima-exe",
65
+ "email":"dima.exe@gmail.com"
66
+ },
67
+ "token":"4328934d-7c7a-4f44-b731-605d83d9ba40",
68
+ "repo_callback":{
69
+ "ref":"refs/tags/v0.0.1",
70
+ "after":"2d6e206be0b94c9694af0ad37a7bf44207500b9f",
71
+ "before":"0000000000000000000000000000000000000000",
72
+ "created":true,
73
+ "deleted":false,
74
+ "forced":true,
75
+ "compare":"https://github.com/evrone/serverist-sample_storage/compare/v0.0.1",
76
+ "commits":null,
77
+ "head_commit":{
78
+ "id":"c391528c6fd03cbf9bc74b8ac42e0a50d953eeea",
79
+ "distinct":true,
80
+ "message":"move redis methods to module Config, add static_sample_storage and dynamic_sample_storage to SampleStorage module",
81
+ "timestamp":"2013-12-04T06:55:04-08:00",
82
+ "url":"https://github.com/evrone/serverist-sample_storage/commit/c391528c6fd03cbf9bc74b8ac42e0a50d953eeea",
83
+ "author":{
84
+ "name":"Dmitry Galinsky",
85
+ "email":"dima.exe@gmail.com",
86
+ "username":"dima-exe"
87
+ },
88
+ "committer":{
89
+ "name":"Dmitry Galinsky",
90
+ "email":"dima.exe@gmail.com",
91
+ "username":"dima-exe"
92
+ },
93
+ "added":[
94
+ "lib/serverist/sample_storage/config.rb",
95
+ "spec/lib/config_spec.rb"
96
+ ],
97
+ "removed":null,
98
+ "modified":[
99
+ "lib/serverist/sample_storage.rb",
100
+ "lib/serverist/sample_storage/redis.rb",
101
+ "spec/lib/sample_storage_spec.rb",
102
+ "spec/spec_helper.rb"
103
+ ]
104
+ },
105
+ "repository":{
106
+ "id":14926202,
107
+ "name":"serverist-sample_storage",
108
+ "url":"https://github.com/evrone/serverist-sample_storage",
109
+ "description":"",
110
+ "watchers":0,
111
+ "stargazers":0,
112
+ "forks":0,
113
+ "fork":false,
114
+ "size":84,
115
+ "owner":{
116
+ "name":"evrone",
117
+ "email":"oleg@evrone.com"
118
+ },
119
+ "private":false,
120
+ "open_issues":0,
121
+ "has_issues":true,
122
+ "has_downloads":true,
123
+ "has_wiki":true,
124
+ "language":"Ruby",
125
+ "created_at":1386167861,
126
+ "pushed_at":1386168924,
127
+ "master_branch":"master",
128
+ "organization":"evrone"
129
+ },
130
+ "pusher":{
131
+ "name":"dima-exe",
132
+ "email":"dima.exe@gmail.com"
133
+ }
134
+ }
135
+ }
@@ -0,0 +1,48 @@
1
+ [
2
+ {
3
+ "id": 1296269,
4
+ "owner": {
5
+ "login": "octocat",
6
+ "id": 1,
7
+ "avatar_url": "https://github.com/images/error/octocat_happy.gif",
8
+ "gravatar_id": "somehexcode",
9
+ "url": "https://api.github.com/users/octocat",
10
+ "html_url": "https://github.com/octocat",
11
+ "followers_url": "https://api.github.com/users/octocat/followers",
12
+ "following_url": "https://api.github.com/users/octocat/following{/other_user}",
13
+ "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
14
+ "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
15
+ "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
16
+ "organizations_url": "https://api.github.com/users/octocat/orgs",
17
+ "repos_url": "https://api.github.com/users/octocat/repos",
18
+ "events_url": "https://api.github.com/users/octocat/events{/privacy}",
19
+ "received_events_url": "https://api.github.com/users/octocat/received_events",
20
+ "type": "User",
21
+ "site_admin": false
22
+ },
23
+ "name": "Hello-World",
24
+ "full_name": "octocat/user",
25
+ "description": "This your first repo!",
26
+ "private": false,
27
+ "fork": true,
28
+ "url": "https://api.github.com/repos/octocat/Hello-World",
29
+ "html_url": "https://github.com/octocat/Hello-World",
30
+ "clone_url": "https://github.com/octocat/Hello-World.git",
31
+ "git_url": "git://github.com/octocat/Hello-World.git",
32
+ "ssh_url": "git@github.com:octocat/Hello-World.git",
33
+ "svn_url": "https://svn.github.com/octocat/Hello-World",
34
+ "mirror_url": "git://git.example.com/octocat/Hello-World",
35
+ "homepage": "https://github.com",
36
+ "language": null,
37
+ "forks_count": 9,
38
+ "stargazers_count": 80,
39
+ "watchers_count": 80,
40
+ "size": 108,
41
+ "default_branch": "master",
42
+ "master_branch": "master",
43
+ "open_issues_count": 0,
44
+ "pushed_at": "2011-01-26T19:06:43Z",
45
+ "created_at": "2011-01-26T19:01:12Z",
46
+ "updated_at": "2011-01-26T19:14:43Z"
47
+ }
48
+ ]
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "id": 1,
4
+ "title" : "Public key",
5
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
6
+ "created_at":"2013-10-02T10:12:29Z"
7
+ },
8
+ {
9
+ "id": 3,
10
+ "title" : "Another Public key",
11
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
12
+ "created_at":"2013-10-02T11:12:29Z"
13
+ }
14
+ ]
@@ -0,0 +1,72 @@
1
+ [
2
+ {
3
+ "id": 4,
4
+ "description": "description",
5
+ "default_branch": "master",
6
+ "public": false,
7
+ "visibility_level": 0,
8
+ "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
9
+ "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
10
+ "web_url": "http://example.com/diaspora/diaspora-client",
11
+ "owner": {
12
+ "id": 3,
13
+ "name": "Diaspora",
14
+ "created_at": "2013-09-30T13: 46: 02Z"
15
+ },
16
+ "name": "Diaspora Client",
17
+ "name_with_namespace": "Diaspora / Diaspora Client",
18
+ "path": "diaspora-client",
19
+ "path_with_namespace": "diaspora/diaspora-client",
20
+ "issues_enabled": true,
21
+ "merge_requests_enabled": true,
22
+ "wall_enabled": false,
23
+ "wiki_enabled": true,
24
+ "snippets_enabled": false,
25
+ "created_at": "2013-09-30T13: 46: 02Z",
26
+ "last_activity_at": "2013-09-30T13: 46: 02Z",
27
+ "namespace": {
28
+ "created_at": "2013-09-30T13: 46: 02Z",
29
+ "description": "",
30
+ "id": 3,
31
+ "name": "Diaspora",
32
+ "owner_id": 1,
33
+ "path": "diaspora",
34
+ "updated_at": "2013-09-30T13: 46: 02Z"
35
+ }
36
+ },
37
+ {
38
+ "id": 6,
39
+ "description": "description",
40
+ "default_branch": "master",
41
+ "public": false,
42
+ "visibility_level": 0,
43
+ "ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
44
+ "http_url_to_repo": "http://example.com/brightbox/puppet.git",
45
+ "web_url": "http://example.com/brightbox/puppet",
46
+ "owner": {
47
+ "id": 4,
48
+ "name": "Brightbox",
49
+ "created_at": "2013-09-30T13:46:02Z"
50
+ },
51
+ "name": "Puppet",
52
+ "name_with_namespace": "Brightbox / Puppet",
53
+ "path": "puppet",
54
+ "path_with_namespace": "brightbox/puppet",
55
+ "issues_enabled": true,
56
+ "merge_requests_enabled": true,
57
+ "wall_enabled": false,
58
+ "wiki_enabled": true,
59
+ "snippets_enabled": false,
60
+ "created_at": "2013-09-30T13:46:02Z",
61
+ "last_activity_at": "2013-09-30T13:46:02Z",
62
+ "namespace": {
63
+ "created_at": "2013-09-30T13:46:02Z",
64
+ "description": "",
65
+ "id": 4,
66
+ "name": "Brightbox",
67
+ "owner_id": 1,
68
+ "path": "brightbox",
69
+ "updated_at": "2013-09-30T13:46:02Z"
70
+ }
71
+ }
72
+ ]
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vx::ServiceConnector::Github::Payload do
4
+ let(:content) { read_json_fixture("github/payload/push") }
5
+ let(:payload) { described_class.new content }
6
+ subject { payload }
7
+
8
+ context "push" do
9
+ let(:url) { "https://github.com/evrone/ci-worker-test-repo/compare/b665f9023956...687753389908" }
10
+
11
+ its(:pull_request?) { should be_false }
12
+ its(:pull_request_number) { should be_nil }
13
+ its(:head) { should eq '84158c732ff1af3db9775a37a74ddc39f5c4078f' }
14
+ its(:base) { should eq 'b665f90239563c030f1b280a434b3d84daeda1bd' }
15
+ its(:branch) { should eq 'master' }
16
+ its(:branch_label) { should eq 'master' }
17
+ its(:url) { should eq url }
18
+
19
+ its(:pull_request_head_repo_id){ should be_nil }
20
+ its(:pull_request_base_repo_id){ should be_nil }
21
+ end
22
+
23
+ context "pull_request" do
24
+ let(:content) { read_json_fixture("github/payload/pull_request") }
25
+ let(:url) { "https://api.github.com/repos/evrone/cybergifts/pulls/177" }
26
+
27
+ its(:pull_request?) { should be_true }
28
+ its(:pull_request_number) { should eq 177 }
29
+ its(:head) { should eq '84158c732ff1af3db9775a37a74ddc39f5c4078f' }
30
+ its(:base) { should eq 'a1ea1a6807ab8de87e0d685b7d5dcad0c081254e' }
31
+ its(:branch) { should eq 'test' }
32
+ its(:branch_label) { should eq 'dima-exe:test' }
33
+ its(:url) { should eq url }
34
+
35
+ its(:pull_request_head_repo_id){ should eq 7155123 }
36
+ its(:pull_request_base_repo_id){ should eq 7155123 }
37
+ end
38
+
39
+ context "tag?" do
40
+ let(:content) { read_json_fixture("github/payload/push_tag") }
41
+ subject { payload.tag? }
42
+ it { should be_true }
43
+
44
+ context "when regular push" do
45
+ let(:content) { read_json_fixture("github/payload/push") }
46
+ it { should be_false }
47
+ end
48
+
49
+ context "when pull request" do
50
+ let(:content) { read_json_fixture("github/payload/pull_request") }
51
+ it { should be_false }
52
+ end
53
+ end
54
+
55
+ context "closed_pull_request?" do
56
+ subject { payload.closed_pull_request? }
57
+ context "when state is closed" do
58
+ let(:content) { read_json_fixture("github/payload/closed_pull_request") }
59
+ it { should be_true }
60
+ end
61
+ end
62
+
63
+ context "foreign_pull_request?" do
64
+ subject { payload.foreign_pull_request? }
65
+
66
+ context "when same repo" do
67
+ let(:content) { read_json_fixture("github/payload/pull_request") }
68
+ it { should be_false }
69
+ end
70
+
71
+ context "when different repo" do
72
+ let(:content) { read_json_fixture("github/payload/foreign_pull_request") }
73
+ it { should be_true }
74
+ end
75
+
76
+ context "when is not pull request" do
77
+ it { should be_false }
78
+ end
79
+ end
80
+
81
+ context "ignore?" do
82
+ subject { payload.ignore? }
83
+
84
+ context "when pull request" do
85
+ let(:content) { read_json_fixture("github/payload/foreign_pull_request") }
86
+ it { should be_false}
87
+
88
+ context "and is closed" do
89
+ before do
90
+ expect(payload).to receive(:closed_pull_request?) { true }
91
+ end
92
+ it { should be_true }
93
+ end
94
+
95
+ context "and same repo" do
96
+ let(:content) { read_json_fixture("github/payload/pull_request") }
97
+ it { should be_true }
98
+ end
99
+ end
100
+
101
+ context "when regular commit" do
102
+ it { should be_false }
103
+
104
+ context "and deleted branch" do
105
+ before do
106
+ expect(payload).to receive(:head) { '0000000000000000000000000000000000000000' }
107
+ end
108
+ it { should be_true }
109
+ end
110
+
111
+ context "and tag created" do
112
+ before do
113
+ expect(payload).to receive(:tag?) { true }
114
+ end
115
+ it { should be_true }
116
+ end
117
+ end
118
+ end
119
+
120
+ context "to_model" do
121
+ subject { payload.to_model }
122
+ it { should be_instance_of(Vx::ServiceConnector::Model::Payload) }
123
+
124
+ its(:values) { should eq(
125
+ [false,
126
+ nil,
127
+ "84158c732ff1af3db9775a37a74ddc39f5c4078f",
128
+ "b665f90239563c030f1b280a434b3d84daeda1bd",
129
+ "master",
130
+ "master",
131
+ "https://github.com/evrone/ci-worker-test-repo/compare/b665f9023956...687753389908",
132
+ false]
133
+ ) }
134
+ end
135
+
136
+ end
@@ -0,0 +1,159 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vx::ServiceConnector::Github do
4
+
5
+ include GithubWebMocks
6
+
7
+ let(:login) { 'login' }
8
+ let(:token) { 'token' }
9
+ let(:repo) { create :repo }
10
+ let(:github) { described_class.new login, token }
11
+
12
+ subject { github }
13
+
14
+ it { should be }
15
+
16
+ context "(notices)" do
17
+ let(:notices) { github.notices(repo) }
18
+
19
+ context "create" do
20
+ let(:sha) { 'sha' }
21
+ let(:url) { 'url' }
22
+ let(:desc) { 'description' }
23
+
24
+ { started: "pending", passed: "success", failed: "failure", errored: "error"}.each do |k,v|
25
+ context "#{k}" do
26
+ subject { notices.create sha, k, url, desc }
27
+ before { mock_create_notice(v) }
28
+ it { should be }
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ context "(repos)" do
35
+ subject { github.repos }
36
+
37
+ before do
38
+ mock_user_repos
39
+ mock_org_repos
40
+ mock_orgs
41
+ end
42
+
43
+ it { should have(2).item }
44
+
45
+ context "values" do
46
+ subject { github.repos.map(&:values) }
47
+ it { should eq(
48
+ [[1296269, "octocat/user", false,
49
+ "git@github.com:octocat/Hello-World.git",
50
+ "https://github.com/octocat/Hello-World",
51
+ "This your first repo!"],
52
+ [1296269, "octocat/org", false,
53
+ "git@github.com:octocat/Hello-World.git",
54
+ "https://github.com/octocat/Hello-World",
55
+ "This your first repo!"]]
56
+ ) }
57
+ end
58
+ end
59
+
60
+ context "(deploy_keys)" do
61
+ let(:key_name) { 'octocat@octomac' }
62
+ let(:public_key) { 'public key' }
63
+ let(:deploy_keys) { github.deploy_keys(repo) }
64
+
65
+ context "all" do
66
+ subject { deploy_keys.all }
67
+ before { mock_deploy_keys }
68
+ it { should have(1).item }
69
+ end
70
+
71
+ context "create" do
72
+ subject { deploy_keys.create key_name, public_key }
73
+ before { mock_add_deploy_key }
74
+ it { should be }
75
+ end
76
+
77
+ context "destroy" do
78
+ subject { deploy_keys.destroy key_name}
79
+
80
+ before do
81
+ mock_deploy_keys
82
+ mock_delete_deploy_key
83
+ end
84
+
85
+ it { should have(1).item }
86
+ end
87
+ end
88
+
89
+ context "(hooks)" do
90
+ let(:url) { 'url' }
91
+ let(:token) { 'token' }
92
+ let(:hooks) { github.hooks(repo) }
93
+
94
+ context "all" do
95
+ subject { hooks.all }
96
+ before { mock_hooks }
97
+ it { should have(1).item }
98
+ end
99
+
100
+ context "create" do
101
+ subject { hooks.create url, token }
102
+ before { mock_add_hook }
103
+ it { should be }
104
+ end
105
+
106
+ context "destroy" do
107
+ let(:mask) { "http://example.com" }
108
+ subject { hooks.destroy mask }
109
+ before do
110
+ mock_hooks
111
+ mock_remove_hook
112
+ end
113
+ it { should have(1).item }
114
+ end
115
+ end
116
+
117
+ context "(files)" do
118
+ let(:sha) { 'sha' }
119
+ let(:path) { 'path' }
120
+
121
+ context "get" do
122
+ subject { github.files(repo).get sha, path }
123
+
124
+ context "success" do
125
+ before { mock_get_file }
126
+ it { should eq 'content' }
127
+ end
128
+
129
+ context "not found" do
130
+ before { mock_get_file_not_found }
131
+ it { should be_nil }
132
+ end
133
+ end
134
+ end
135
+
136
+ context "(commits)" do
137
+ let(:sha) { 'sha' }
138
+
139
+ context "get" do
140
+ subject { github.commits(repo).get sha }
141
+
142
+ context "success" do
143
+ before { mock_get_commit }
144
+ it { should be }
145
+ its(:sha) { should eq '6dcb09b5b57875f334f61aebed695e2e4193db5e' }
146
+ its(:message) { should eq 'Fix all the bugs' }
147
+ its(:author) { should eq 'Monalisa Octocat' }
148
+ its(:author_email) { should eq 'support@github.com' }
149
+ its(:http_url) { should be_nil }
150
+ end
151
+
152
+ context "not found" do
153
+ before { mock_get_commit_not_found }
154
+ it { should be_nil }
155
+ end
156
+ end
157
+ end
158
+
159
+ end