perkins 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 (100) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.env.example +4 -0
  4. data/.gitignore +19 -0
  5. data/.pryrc +3 -0
  6. data/.rspec +2 -0
  7. data/Gemfile +18 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +71 -0
  10. data/Rakefile +28 -0
  11. data/TODO.md +4 -0
  12. data/bin/perkins +6 -0
  13. data/db/migrate/20150130143030_create_repo.rb +18 -0
  14. data/db/migrate/20150130143050_create_builds.rb +20 -0
  15. data/db/schema.rb +38 -0
  16. data/examples/config.rb +12 -0
  17. data/examples/database.yml +17 -0
  18. data/examples/mongo.yml +13 -0
  19. data/lib/core_ext/hash/compact.rb +8 -0
  20. data/lib/core_ext/hash/deep_merge.rb +15 -0
  21. data/lib/core_ext/hash/deep_symbolize_keys.rb +20 -0
  22. data/lib/core_ext/object/false.rb +5 -0
  23. data/lib/core_ext/string/indent.rb +5 -0
  24. data/lib/core_ext/string/unindent.rb +5 -0
  25. data/lib/perkins/.DS_Store +0 -0
  26. data/lib/perkins/application.rb +40 -0
  27. data/lib/perkins/assets/images/github.svg +4 -0
  28. data/lib/perkins/assets/images/spinner.svg +23 -0
  29. data/lib/perkins/assets/javascripts/app.js +9 -0
  30. data/lib/perkins/assets/javascripts/log_view.js.coffee +95 -0
  31. data/lib/perkins/assets/javascripts/perkings.js.coffee +40 -0
  32. data/lib/perkins/assets/javascripts/vendor/ansiparse.js +187 -0
  33. data/lib/perkins/assets/javascripts/vendor/jquery.timeago.js +189 -0
  34. data/lib/perkins/assets/javascripts/vendor/log.js +2 -0
  35. data/lib/perkins/assets/javascripts/vendor/minispade.js +55 -0
  36. data/lib/perkins/assets/stylesheets/app.css +2 -0
  37. data/lib/perkins/assets/stylesheets/log.css.scss +115 -0
  38. data/lib/perkins/assets/stylesheets/styles.css.scss +199 -0
  39. data/lib/perkins/auth/github.rb +181 -0
  40. data/lib/perkins/build/data/env.rb +84 -0
  41. data/lib/perkins/build/data/var.rb +60 -0
  42. data/lib/perkins/build/data.rb +167 -0
  43. data/lib/perkins/build/script/bundler.rb +76 -0
  44. data/lib/perkins/build/script/go.rb +100 -0
  45. data/lib/perkins/build/script/helpers.rb +39 -0
  46. data/lib/perkins/build/script/jdk.rb +43 -0
  47. data/lib/perkins/build/script/ruby.rb +31 -0
  48. data/lib/perkins/build/script/rvm.rb +73 -0
  49. data/lib/perkins/build/script/stages.rb +28 -0
  50. data/lib/perkins/build/script/templates/footer.sh +3 -0
  51. data/lib/perkins/build/script/templates/header.sh +201 -0
  52. data/lib/perkins/build/script/templates/xcode.sh +21 -0
  53. data/lib/perkins/build/script.rb +167 -0
  54. data/lib/perkins/build/shell/dsl.rb +104 -0
  55. data/lib/perkins/build/shell/node.rb +121 -0
  56. data/lib/perkins/build/shell.rb +16 -0
  57. data/lib/perkins/build.rb +27 -0
  58. data/lib/perkins/build_report.rb +11 -0
  59. data/lib/perkins/cli.rb +42 -0
  60. data/lib/perkins/commit.rb +30 -0
  61. data/lib/perkins/dsl/app_proxy.rb +23 -0
  62. data/lib/perkins/dsl.rb +12 -0
  63. data/lib/perkins/listener.rb +38 -0
  64. data/lib/perkins/logger.rb +12 -0
  65. data/lib/perkins/notifier.rb +5 -0
  66. data/lib/perkins/repo.rb +145 -0
  67. data/lib/perkins/runner.rb +124 -0
  68. data/lib/perkins/server.rb +314 -0
  69. data/lib/perkins/thor_utils.rb +79 -0
  70. data/lib/perkins/version.rb +3 -0
  71. data/lib/perkins/views/401.haml +1 -0
  72. data/lib/perkins/views/builds.haml +46 -0
  73. data/lib/perkins/views/index.haml +6 -0
  74. data/lib/perkins/views/layout.haml +53 -0
  75. data/lib/perkins/views/menu.haml +18 -0
  76. data/lib/perkins/views/orgs.haml +101 -0
  77. data/lib/perkins/views/profile.haml +31 -0
  78. data/lib/perkins/views/readme.md +20 -0
  79. data/lib/perkins/views/repos/config.haml +72 -0
  80. data/lib/perkins/views/repos/github.haml +76 -0
  81. data/lib/perkins/views/repos/menu.haml +17 -0
  82. data/lib/perkins/views/repos/repo.haml +64 -0
  83. data/lib/perkins/views/repos/spinner.haml +3 -0
  84. data/lib/perkins/webhooks/github.rb +12 -0
  85. data/lib/perkins/worker.rb +33 -0
  86. data/lib/perkins.rb +36 -0
  87. data/perkins.gemspec +52 -0
  88. data/spec/fixtures/.travis.yml +8 -0
  89. data/spec/fixtures/config.yml +6 -0
  90. data/spec/lib/build/build_spec.rb +58 -0
  91. data/spec/lib/commit_spec.rb +6 -0
  92. data/spec/lib/dsl_spec.rb +17 -0
  93. data/spec/lib/listener_spec.rb +30 -0
  94. data/spec/lib/repo_spec.rb +110 -0
  95. data/spec/lib/runner_spec.rb +76 -0
  96. data/spec/lib/server_spec.rb +108 -0
  97. data/spec/spec_helper.rb +67 -0
  98. data/spec/support/auth.rb +30 -0
  99. data/spec/support/github_api.rb +177 -0
  100. metadata +503 -0
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
2
+
3
+ require "perkins/dsl"
4
+
5
+ describe "Repo" do
6
+
7
+ let(:app){
8
+ perkins_app
9
+ }
10
+
11
+ it "app should be configured" do
12
+ expect($redis.class).to be == Redis::Namespace
13
+ expect(app.github_client_id).to_not be_blank
14
+ expect(app.github_client_secret).to_not be_blank
15
+ end
16
+
17
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
2
+
3
+ require "perkins/dsl"
4
+
5
+ describe "Listener" do
6
+
7
+ let(:app){
8
+ Perkins.application() do |app|
9
+ app.redis = Redis.new
10
+ app.server = { host: "localhost", port:1234 }
11
+ end
12
+ }
13
+
14
+ context "runner config" do
15
+
16
+ it "should generate a redis build data" do
17
+ data = {name: "lazy_high_charts" , sha: "2eed41547227ac03113613a54e8d7305fce982f0"}.to_json
18
+ l = Perkins::Listener.new
19
+ l.app = app
20
+ $redis.flushdb
21
+ allow(Perkins::Repo).to receive(:find).and_return(true)
22
+ allow(Perkins::Worker).to receive(:perform).and_return(true)
23
+
24
+ #expect(l).to receive(:exec_runner).with("commits", data)
25
+ l.exec_runner("commits", data)
26
+ expect(Perkins::Worker).to have_received(:perform)
27
+ r = Perkins::Repo.create
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,110 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
2
+
3
+ #require "fakeredis"
4
+
5
+ #$redis = Redis.new
6
+
7
+ describe "Repo" do
8
+
9
+ let(:user_api) {
10
+ Octokit::Client.new(
11
+ login: ENV['LOGIN'],
12
+ access_token: ENV['ACCESS_TOKEN']
13
+ )
14
+ }
15
+
16
+ let(:file){
17
+ f = File.expand_path(File.dirname(__FILE__) + '/../fixtures/.travis.yml')
18
+ Travis::Yaml.parse( File.open(f).read )
19
+ }
20
+
21
+ let(:github_user){
22
+ Warden::GitHub::User.new
23
+ }
24
+
25
+ before(:each) do
26
+ perkins_app
27
+ allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
28
+ @user = Warden::GitHub::User.new
29
+ Perkins::Repo.sync_github_repos(@user)
30
+ end
31
+
32
+ it "all should return repos" do
33
+ expect(Perkins::Repo.all).to_not be_blank
34
+ expect(Perkins::Repo.all.size).to be == Perkins::Repo.synced_records.size
35
+ end
36
+
37
+
38
+ it "all should return repos" do
39
+ expect(Perkins::Repo.first).to_not be_blank
40
+ end
41
+
42
+ it "all should return repos" do
43
+ r = Perkins::Repo.first
44
+ expect(r.name).to_not be_blank
45
+ expect(r.id).to_not be_blank
46
+ expect(r.url).to_not be_blank
47
+ #expect(r.local_path).to_not be_blank
48
+ end
49
+
50
+ context "loaded repo" do
51
+ before :each do
52
+ @repo = Perkins::Repo.first
53
+ @repo.load_git
54
+ expect(@repo.git).to be_instance_of(Git::Base)
55
+ @path = @repo.git.dir.path
56
+ end
57
+
58
+ it "should download repo" do
59
+ expect(File.exists?(@path)).to be_present
60
+ end
61
+
62
+ it "should have a default runner" do
63
+ expect(@repo.runner).to_not be_blank
64
+ end
65
+
66
+ it "should have branches" do
67
+ expect(@repo.runner_branch).to be == ["master"]
68
+ expect(@repo.branches).to include("master")
69
+ end
70
+ end
71
+
72
+ context "runner config" do
73
+ before :each do
74
+ @repo = Perkins::Repo.first
75
+ allow_any_instance_of(Perkins::Repo).to receive(:check_config_existence).and_return(file)
76
+ @repo.load_git
77
+ expect(@repo.git).to be_instance_of(Git::Base)
78
+ @path = @repo.git.dir.path
79
+ end
80
+
81
+ it "should have a runner" do
82
+ expect(@repo.runner).to be_instance_of(Perkins::Runner)
83
+ end
84
+
85
+ it "run run run" do
86
+ sha = @repo.git.log.map(&:sha).first
87
+ @repo.runner.run(sha)
88
+ #expect(@repo.runner.status).to be == true
89
+ #expect(@repo.runner.response).to_not be_blank
90
+ end
91
+ end
92
+
93
+ context "receive commit" do
94
+ before :each do
95
+ allow_any_instance_of(Perkins::Repo).to receive(:check_config_existence).and_return(file)
96
+ @repo = Perkins::Repo.first
97
+ @repo.load_git
98
+ expect(@repo.git).to be_instance_of(Git::Base)
99
+ @path = @repo.git.dir.path
100
+ end
101
+
102
+ it "receive commit" do
103
+ sha = @repo.git.log.map(&:sha).first
104
+ @repo.add_commit(sha, "master")
105
+ expect(@repo.new_commit).to be_instance_of(Perkins::Commit)
106
+ end
107
+
108
+ end
109
+
110
+ end
@@ -0,0 +1,76 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
2
+
3
+ describe "Runner" do
4
+
5
+ let(:user_api) {
6
+ Octokit::Client.new(
7
+ login: ENV['LOGIN'],
8
+ access_token: ENV['ACCESS_TOKEN']
9
+ )
10
+ }
11
+
12
+ let(:file){
13
+ f = File.expand_path(File.dirname(__FILE__) + '/../fixtures/.travis.yml')
14
+ Travis::Yaml.parse( File.open(f).read )
15
+ }
16
+
17
+ let(:github_user){
18
+ Warden::GitHub::User.new
19
+ }
20
+
21
+ before(:each) do
22
+ perkins_app
23
+ Perkins::Repo.delete_all
24
+ allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
25
+ @user = Warden::GitHub::User.new
26
+ Perkins::Repo.sync_github_repos(@user)
27
+
28
+ to_add = Perkins::Repo.synced_records.where(name: "michelson/BigBroda").first
29
+ Perkins::Repo.add_from_github(to_add.gb_id)
30
+ end
31
+
32
+
33
+ context "in repo" do
34
+ let( :repo ){ Perkins::Repo.first }
35
+ before :each do
36
+ #expect(repo.load_git).to be_instance_of(Git::Base)
37
+ @runner = Perkins::Runner.new
38
+ @runner.config = file
39
+ @runner.repo = repo
40
+ #allow_any_instance_of(Perkins::Repo).to receive(:clone_or_load).and_return(true)
41
+ #allow_any_instance_of(Perkins::Repo).to receive(:git).and_return(Git::Base.new)
42
+ end
43
+
44
+ it "runner should raise error in case it fails" do
45
+
46
+ expect{@runner.run!}.to raise_error
47
+ end
48
+
49
+ it "should install bundler" do
50
+ #allow_any_instance_of(Git::Base).to receive(:chdir).and_return(true)
51
+ expect{@runner.run("master")}.to_not raise_error
52
+ #expect(Git::Base).to have_received(:chdir)
53
+
54
+ expect(@runner.duration).to be > 0
55
+ expect(@runner).to_not be_running
56
+
57
+ end
58
+ end
59
+
60
+ context "a go repo" do
61
+ let( :repo ){ Perkins::Repo.find_by(name: "michelson/godard") }
62
+ before :each do
63
+ repo.clone_or_load
64
+ @runner = repo.runner
65
+ end
66
+
67
+ it "should install bundler" do
68
+ expect{@runner.run("master")}.to_not raise_error
69
+ expect(@runner.duration).to be > 0
70
+ expect(@runner).to_not be_running
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+
@@ -0,0 +1,108 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
2
+
3
+ #require 'hello_world' # <-- your sinatra app
4
+ require 'rspec'
5
+ require 'rack/test'
6
+
7
+ require 'dotenv'
8
+ Dotenv.load
9
+
10
+ describe 'Server App' do
11
+ include Rack::Test::Methods
12
+
13
+ let(:body) { { :ref=>"refs/heads/another-branch" }.to_json }
14
+
15
+ let(:user_api) {
16
+ Octokit::Client.new(
17
+ login: ENV['LOGIN'],
18
+ access_token: ENV['ACCESS_TOKEN']
19
+ )
20
+ }
21
+
22
+ let(:file){
23
+ f = File.expand_path(File.dirname(__FILE__) + '/../fixtures/.travis.yml')
24
+ Travis::Yaml.parse( File.open(f).read )
25
+ }
26
+
27
+ def app
28
+ a = Perkins::Server
29
+ a.set :perkins_application, perkins_app
30
+ a.set :github_options, {
31
+ :scopes => "admin:repo_hook,repo,user:email",
32
+ :secret => perkins_app.github_client_secret,
33
+ :client_id => perkins_app.github_client_id,
34
+ }
35
+ end
36
+
37
+ context "with app" do
38
+
39
+ before do
40
+ @user = make_user('login' => 'michelson')
41
+ login_as @user
42
+ end
43
+
44
+ it "index" do
45
+ get '/'
46
+ expect(last_response).to be_ok
47
+ end
48
+
49
+ it "show config" do
50
+ get "/config"
51
+ expect(last_response).to be_ok
52
+ expect(last_response.body).to include("github_client_id")
53
+ end
54
+
55
+ it "profile" do
56
+ allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
57
+ get "/me"
58
+ #puts last_response.body
59
+ expect(last_response).to be_ok
60
+ end
61
+
62
+ describe "github" do
63
+
64
+ it "sync" do
65
+
66
+ allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
67
+
68
+ get "/repos/sync"
69
+
70
+ follow_redirect!
71
+
72
+ expect("http://example.org/me").to be == last_request.url
73
+
74
+ expect(last_response).to be_ok
75
+
76
+ expect(Perkins::Repo.synced_records).to be_any
77
+ end
78
+
79
+ it "add repo" do
80
+ allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
81
+ a = Warden::GitHub::User.new
82
+ Perkins::Repo.sync_github_repos(a)
83
+ repo = Perkins::Repo.synced_records.first
84
+ get "/repos/add/#{repo.gb_id}"
85
+ follow_redirect!
86
+ expect("http://example.org/me").to be == last_request.url
87
+ expect(last_response).to be_ok
88
+ expect(Perkins::Repo.find(repo.id).github_data).to_not be_blank
89
+ end
90
+
91
+ it "find a repo" do
92
+ allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
93
+ a = Warden::GitHub::User.new
94
+ Perkins::Repo.sync_github_repos(a)
95
+ allow_any_instance_of(Perkins::Repo).to receive(:check_config_existence).and_return(file)
96
+ get "/repos/#{Perkins::Repo.last.github_data["full_name"]}"
97
+ expect(last_response.body).to include(Perkins::Repo.last.name)
98
+ end
99
+
100
+ it "receive hook" do
101
+
102
+ end
103
+
104
+ end
105
+
106
+
107
+ end
108
+ end
@@ -0,0 +1,67 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ ENV['RACK_ENV'] = 'test'
3
+ require 'rspec'
4
+ require 'database_cleaner'
5
+ #require 'webmock/rspec'
6
+ require 'debugger'
7
+ require File.join(File.dirname(__FILE__), '../lib', 'perkins')
8
+ require "pry"
9
+ require "git"
10
+ require 'rack/test'
11
+
12
+ require "support/auth"
13
+ require "support/github_api"
14
+
15
+ require 'dotenv'
16
+ Dotenv.load
17
+
18
+ RSpec.configure do |config|
19
+
20
+ config.include(Rack::Test::Methods)
21
+ config.include(SinatraAuthGithubTestHelper)
22
+
23
+ def perkins_app
24
+ Perkins.application() do |app|
25
+ config do |c|
26
+ c.redis = {namespace: "perkins:test"}
27
+ c.database = "./examples/database.yml"
28
+ #c.server = { host: "localhost", port:1234 }
29
+ c.github_client_id = ENV['GITHUB_CLIENT_ID']
30
+ c.github_client_secret = ENV['GITHUB_SECRET']
31
+ end
32
+ end
33
+ end
34
+
35
+ #WebMock.disable_net_connect!(:allow => 'coveralls.io')
36
+
37
+ config.raise_errors_for_deprecations!
38
+
39
+ config.before(:all) do
40
+ perkins_app
41
+ @test_repo = "#{test_github_login}/#{test_github_repository}"
42
+ @test_org_repo = "#{test_github_org}/#{test_github_repository}"
43
+ end
44
+
45
+ config.before(:suite) do
46
+ perkins_app
47
+ DatabaseCleaner.clean_with(:truncation)
48
+ end
49
+
50
+ # this runs before each *_spec.rb, not before ALL specs
51
+ config.before(:all) do
52
+ DatabaseCleaner.clean_with(:truncation)
53
+ end
54
+
55
+ config.before(:each) do
56
+ DatabaseCleaner.strategy = :transaction
57
+ end
58
+
59
+ config.before(:each) do
60
+ DatabaseCleaner.start
61
+ end
62
+
63
+ #config.after(:each) do
64
+ # DatabaseCleaner.clean
65
+ #end
66
+
67
+ end
@@ -0,0 +1,30 @@
1
+ require 'warden/test/helpers'
2
+ require 'warden/github/user'
3
+
4
+ require "warden"
5
+
6
+ module SinatraAuthGithubTestHelper
7
+
8
+ include(Warden::Test::Helpers)
9
+
10
+ Warden.test_mode!
11
+ def make_user(attrs = {})
12
+ User.make(attrs)
13
+ end
14
+
15
+ class User < Warden::GitHub::User
16
+ def self.make(attrs = {})
17
+ default_attrs = {
18
+ 'login' => "test_user",
19
+ 'name' => "Test User",
20
+ 'email' => "test@example.com",
21
+ 'company' => "GitHub",
22
+ 'gravatar_id' => 'a'*32,
23
+ 'avatar_url' => 'https://a249.e.akamai.net/assets.github.com/images/gravatars/gravatar-140.png?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png'
24
+ }
25
+ default_attrs.merge! attrs
26
+ User.new(default_attrs)
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,177 @@
1
+ =begin
2
+ require 'vcr'
3
+ VCR.configure do |c|
4
+ c.configure_rspec_metadata!
5
+ c.filter_sensitive_data("<GITHUB_LOGIN>") do
6
+ test_github_login
7
+ end
8
+ c.filter_sensitive_data("<GITHUB_PASSWORD>") do
9
+ test_github_password
10
+ end
11
+ c.filter_sensitive_data("<<ACCESS_TOKEN>>") do
12
+ test_github_token
13
+ end
14
+ c.filter_sensitive_data("<GITHUB_CLIENT_ID>") do
15
+ test_github_client_id
16
+ end
17
+ c.filter_sensitive_data("<GITHUB_CLIENT_SECRET>") do
18
+ test_github_client_secret
19
+ end
20
+ c.define_cassette_placeholder("<GITHUB_TEST_REPOSITORY>") do
21
+ test_github_repository
22
+ end
23
+ c.define_cassette_placeholder("<GITHUB_TEST_ORGANIZATION>") do
24
+ test_github_org
25
+ end
26
+ c.define_cassette_placeholder("<GITHUB_TEST_ORG_TEAM_ID>") do
27
+ "10050505050000"
28
+ end
29
+
30
+ c.before_http_request(:real?) do |request|
31
+ next if request.headers['X-Vcr-Test-Repo-Setup']
32
+ next unless request.uri.include? test_github_repository
33
+
34
+ options = {
35
+ :headers => {'X-Vcr-Test-Repo-Setup' => 'true'},
36
+ :auto_init => true
37
+ }
38
+
39
+ test_repo = "#{test_github_login}/#{test_github_repository}"
40
+ if !oauth_client.repository?(test_repo, options)
41
+ Octokit.octokit_warn "NOTICE: Creating #{test_repo} test repository."
42
+ oauth_client.create_repository(test_github_repository, options)
43
+ end
44
+
45
+ test_org_repo = "#{test_github_org}/#{test_github_repository}"
46
+ if !oauth_client.repository?(test_org_repo, options)
47
+ Octokit.octokit_warn "NOTICE: Creating #{test_org_repo} test repository."
48
+ options[:organization] = test_github_org
49
+ oauth_client.create_repository(test_github_repository, options)
50
+ end
51
+ end
52
+
53
+ c.ignore_request do |request|
54
+ !!request.headers['X-Vcr-Test-Repo-Setup']
55
+ end
56
+
57
+ c.default_cassette_options = {
58
+ :serialize_with => :json,
59
+ # TODO: Track down UTF-8 issue and remove
60
+ :preserve_exact_body_bytes => true,
61
+ :decode_compressed_response => true,
62
+ :record => ENV['TRAVIS'] ? :none : :once
63
+ }
64
+ c.cassette_library_dir = 'spec/cassettes'
65
+ c.hook_into :webmock
66
+ end
67
+ =end
68
+
69
+ def test_github_login
70
+ ENV.fetch 'OCTOKIT_TEST_GITHUB_LOGIN', 'api-padawan'
71
+ end
72
+
73
+ def test_github_password
74
+ ENV.fetch 'OCTOKIT_TEST_GITHUB_PASSWORD', 'wow_such_password'
75
+ end
76
+
77
+ def test_github_token
78
+ ENV.fetch 'OCTOKIT_TEST_GITHUB_TOKEN', 'x' * 40
79
+ end
80
+
81
+ def test_github_client_id
82
+ ENV.fetch 'OCTOKIT_TEST_GITHUB_CLIENT_ID', 'x' * 21
83
+ end
84
+
85
+ def test_github_client_secret
86
+ ENV.fetch 'OCTOKIT_TEST_GITHUB_CLIENT_SECRET', 'x' * 40
87
+ end
88
+
89
+ def test_github_repository
90
+ ENV.fetch 'OCTOKIT_TEST_GITHUB_REPOSITORY', 'api-sandbox'
91
+ end
92
+
93
+ def test_github_org
94
+ ENV.fetch 'OCTOKIT_TEST_GITHUB_ORGANIZATION', 'api-playground'
95
+ end
96
+
97
+ def stub_delete(url)
98
+ stub_request(:delete, github_url(url))
99
+ end
100
+
101
+ def stub_get(url)
102
+ stub_request(:get, github_url(url))
103
+ end
104
+
105
+ def stub_head(url)
106
+ stub_request(:head, github_url(url))
107
+ end
108
+
109
+ def stub_patch(url)
110
+ stub_request(:patch, github_url(url))
111
+ end
112
+
113
+ def stub_post(url)
114
+ stub_request(:post, github_url(url))
115
+ end
116
+
117
+ def stub_put(url)
118
+ stub_request(:put, github_url(url))
119
+ end
120
+
121
+ def fixture_path
122
+ File.expand_path("../fixtures", __FILE__)
123
+ end
124
+
125
+ def fixture(file)
126
+ File.new(fixture_path + '/' + file)
127
+ end
128
+
129
+ def json_response(file)
130
+ {
131
+ :body => fixture(file),
132
+ :headers => {
133
+ :content_type => 'application/json; charset=utf-8'
134
+ }
135
+ }
136
+ end
137
+
138
+ def github_url(url)
139
+ return url if url =~ /^http/
140
+
141
+ url = File.join(Octokit.api_endpoint, url)
142
+ uri = Addressable::URI.parse(url)
143
+ uri.path.gsub!("v3//", "v3/")
144
+
145
+ uri.to_s
146
+ end
147
+
148
+ def basic_github_url(path, options = {})
149
+ url = File.join(Octokit.api_endpoint, path)
150
+ uri = Addressable::URI.parse(url)
151
+ uri.path.gsub!("v3//", "v3/")
152
+
153
+ uri.user = options.fetch(:login, test_github_login)
154
+ uri.password = options.fetch(:password, test_github_password)
155
+
156
+ uri.to_s
157
+ end
158
+
159
+ def basic_auth_client(login = test_github_login, password = test_github_password )
160
+ client = Octokit.client
161
+ client.login = test_github_login
162
+ client.password = test_github_password
163
+
164
+ client
165
+ end
166
+
167
+ def oauth_client
168
+ Octokit::Client.new(:access_token => test_github_token)
169
+ end
170
+
171
+ def use_vcr_placeholder_for(text, replacement)
172
+ VCR.configure do |c|
173
+ c.define_cassette_placeholder(replacement) do
174
+ text
175
+ end
176
+ end
177
+ end