local_pac 0.5.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile.lock +1 -3
  3. data/app/controllers/git_hook_controller.rb +25 -4
  4. data/app/controllers/lookup_controller.rb +1 -0
  5. data/app/locales/en.yml +9 -1
  6. data/bin/local_pac +5 -129
  7. data/config.ru +2 -2
  8. data/features/{show_status.feature_ → show_status.feature} +2 -1
  9. data/features/step_definitions.rb +4 -0
  10. data/lib/local_pac.rb +9 -2
  11. data/lib/local_pac/actions/get_system_information.rb +2 -2
  12. data/lib/local_pac/actions/handle_error.rb +26 -0
  13. data/lib/local_pac/actions/initialize_application.rb +71 -0
  14. data/lib/local_pac/actions/reload_local_storage.rb +2 -0
  15. data/lib/local_pac/actions/show_application_status.rb +39 -0
  16. data/lib/local_pac/actions/show_pac_file.rb +29 -0
  17. data/lib/local_pac/actions/validate_pac_file.rb +34 -0
  18. data/lib/local_pac/cli/main.rb +122 -0
  19. data/lib/local_pac/cli/reload.rb +8 -4
  20. data/lib/local_pac/cli/show.rb +34 -0
  21. data/lib/local_pac/cli/validate.rb +22 -0
  22. data/lib/local_pac/config.rb +1 -1
  23. data/lib/local_pac/error_handler.rb +60 -0
  24. data/lib/local_pac/exceptions.rb +6 -0
  25. data/lib/local_pac/git_storage.rb +30 -10
  26. data/lib/local_pac/pac_file_validator.rb +17 -2
  27. data/lib/local_pac/version.rb +1 -1
  28. data/local_pac.gemspec +0 -2
  29. data/script/acceptance_test +4 -0
  30. data/script/bootstrap +5 -0
  31. data/script/ci +3 -0
  32. data/script/release +3 -0
  33. data/script/unit_test +3 -0
  34. data/spec/actions/handle_error_spec.rb +29 -0
  35. data/spec/{initializer_spec.rb → actions/initialize_application_spec.rb} +3 -3
  36. data/spec/{application_status_spec.rb → actions/show_application_status_spec.rb} +5 -5
  37. data/spec/actions/show_pac_file_spec.rb +36 -0
  38. data/spec/actions/validate_pac_file_spec.rb +62 -0
  39. data/spec/error_handler_spec.rb +70 -0
  40. data/spec/features/check_git_push_spec.rb +34 -6
  41. data/spec/git_repository_spec.rb +1 -0
  42. data/spec/git_storage_spec.rb +33 -0
  43. data/spec/pac_file_validator_spec.rb +19 -10
  44. metadata +30 -26
  45. data/lib/local_pac/application_status.rb +0 -37
  46. data/lib/local_pac/initializer.rb +0 -69
@@ -1,4 +1,4 @@
1
1
  #main LocalPac
2
2
  module LocalPac
3
- VERSION = '0.5.0'
3
+ VERSION = '0.6.1'
4
4
  end
@@ -36,12 +36,10 @@ EOS
36
36
  spec.add_runtime_dependency 'sinatra'
37
37
  spec.add_runtime_dependency 'activesupport'
38
38
  spec.add_runtime_dependency 'pac'
39
- spec.add_runtime_dependency 'git_hook-pre_receive', '~>0.1.0'
40
39
  spec.add_runtime_dependency 'facter'
41
40
  spec.add_runtime_dependency 'pager'
42
41
  spec.add_runtime_dependency 'sys-proctable'
43
42
  spec.add_runtime_dependency 'sinatra-param'
44
43
  spec.add_runtime_dependency 'sinatra-contrib'
45
44
  spec.add_runtime_dependency 'rugged'
46
- # spec.add_runtime_dependency 'fedux_org-stdlib'
47
45
  end
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec cucumber
4
+ bundle exec rspec spec/features
@@ -0,0 +1,5 @@
1
+ #!/bin/sh
2
+
3
+ echo "Bootstrapping development environment for application.." >&2
4
+
5
+ gem install bundler && bundle install
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake test:coveralls
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake gem:release
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rspec
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Actions::HandleError do
5
+ context '#initialize' do
6
+ it 'requires an exception' do
7
+ expect {
8
+ Actions::HandleError.new(StandardError.new)
9
+ }.not_to raise_error
10
+ end
11
+ end
12
+
13
+ context '#run' do
14
+ it 'handles errors' do
15
+ action = Actions::HandleError.new(RuntimeError.new)
16
+
17
+ silence(:stderr) do
18
+ begin
19
+ action.run
20
+ rescue SystemExit => e
21
+ @err = e
22
+ end
23
+ end
24
+
25
+ expect(@err).to be_kind_of(SystemExit)
26
+ expect(@err.status).to be(99)
27
+ end
28
+ end
29
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe Initializer do
4
+ describe Actions::InitializeApplication do
5
5
 
6
6
  context '#run' do
7
7
  it 'creates all files/directories neccessary to run local_pac' do
@@ -18,7 +18,7 @@ describe Initializer do
18
18
  config_file = create_file('config_spec.yaml', config_string)
19
19
 
20
20
  config = LocalPac::Config.new(config_file)
21
- initializer = Initializer.new({
21
+ initializer = Actions::InitializeApplication.new({
22
22
  create_pid_directory: true,
23
23
  create_log_directory: true,
24
24
  create_sass_cache: true,
@@ -54,7 +54,7 @@ describe Initializer do
54
54
  config_file = create_file('config_spec.yaml', config_string)
55
55
 
56
56
  config = LocalPac::Config.new(config_file)
57
- initializer = Initializer.new({
57
+ initializer = Actions::InitializeApplication.new({
58
58
  pre_seed: true,
59
59
  create_local_storage: true,
60
60
  }, config)
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe ApplicationStatus do
4
+ describe Actions::ShowApplicationStatus do
5
5
  let(:valid_pac_file) do <<-EOS.strip_heredoc.chomp
6
6
  function FindProxyForURL(url, host) {
7
7
  return "DIRECT";
@@ -12,18 +12,18 @@ describe ApplicationStatus do
12
12
  context '#initialize' do
13
13
  it 'has no special requirements' do
14
14
  expect {
15
- ApplicationStatus.new
15
+ Actions::ShowApplicationStatus.new
16
16
  }.not_to raise_error
17
17
  end
18
18
 
19
19
  it 'let you deactivate paging' do
20
20
  expect {
21
- ApplicationStatus.new(pager: false)
21
+ Actions::ShowApplicationStatus.new(pager: false)
22
22
  }.not_to raise_error
23
23
  end
24
24
  end
25
25
 
26
- context '#show' do
26
+ context '#run' do
27
27
  it 'show application status' do
28
28
  git_repo = ::File.join(working_directory, 'data', 'storage.git')
29
29
 
@@ -41,7 +41,7 @@ describe ApplicationStatus do
41
41
  config = LocalPac::Config.new(config_file)
42
42
 
43
43
  result = capture(:stdout) do
44
- ApplicationStatus.new(pager: false, config: config).show
44
+ Actions::ShowApplicationStatus.new(pager: false, config: config).run
45
45
  end
46
46
 
47
47
  expect(result).to include('osfamily')
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Actions::ShowPacFile do
5
+ let(:valid_pac_file) do <<-EOS.strip_heredoc.chomp
6
+ function FindProxyForURL(url, host) {
7
+ return "DIRECT";
8
+ }
9
+ EOS
10
+ end
11
+
12
+ context '#initialize' do
13
+ it 'requires a git repository' do
14
+ expect {
15
+ Actions::ShowPacFile.new(working_directory, 'proxy.pac')
16
+ }.not_to raise_error
17
+ end
18
+ end
19
+
20
+ context '#run' do
21
+ it 'shows proxy.pac file' do
22
+ repo = GitRepository.create(working_directory)
23
+ repo.add_content('proxy.pac', 'asdf()')
24
+ repo.add_content('proxy1.pac', 'asd1f()')
25
+
26
+ action = Actions::ShowPacFile.new('proxy.pac', working_directory)
27
+
28
+ result = capture(:stdout) do
29
+ LocalPac.ui_logger.level = :info
30
+ action.run
31
+ end
32
+
33
+ expect(result).to include('asdf()')
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Actions::ValidatePacFile do
5
+ let(:valid_pac_file) do <<-EOS.strip_heredoc.chomp
6
+ function FindProxyForURL(url, host) {
7
+ return "DIRECT";
8
+ }
9
+ EOS
10
+ end
11
+
12
+ let(:invalid_pac_file) do <<-EOS.strip_heredoc.chomp
13
+ function FindProxyForURL(url, host) {
14
+ aasdf();
15
+ }
16
+ EOS
17
+ end
18
+
19
+ context '#initialize' do
20
+ it 'requires a file' do
21
+ file = create_file 'pac_file', valid_pac_file
22
+
23
+ expect {
24
+ Actions::ValidatePacFile.new(file)
25
+ }.not_to raise_error
26
+ end
27
+ end
28
+
29
+ context '#run' do
30
+ it 'outputs an info if pac file is valid' do
31
+ file = create_file 'pac_file', valid_pac_file
32
+
33
+ action = Actions::ValidatePacFile.new(file)
34
+
35
+ result = capture(:stdout) do
36
+ action.run
37
+ end
38
+
39
+ expect(result).to include('is a valid pac file')
40
+ end
41
+
42
+ it 'outputs an warning if pac file is invalid' do
43
+ file = create_file 'pac_file', invalid_pac_file
44
+
45
+ action = Actions::ValidatePacFile.new(file)
46
+
47
+ result = capture(:stdout) do
48
+ action.run
49
+ end
50
+
51
+ expect(result).to include('is not a valid pac file')
52
+ end
53
+
54
+ it 'raises an error if path is not a file' do
55
+ action = Actions::ValidatePacFile.new(working_directory)
56
+
57
+ expect {
58
+ action.run
59
+ }.to raise_error Exceptions::PacFileInvalid
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe ErrorHandler do
5
+ let(:exception) { StandardError.new }
6
+
7
+ context '.create' do
8
+ it 'requires an exception class, a message and a exit code' do
9
+ expect {
10
+ ErrorHandler.create(
11
+ exception: StandardError,
12
+ message: 'This is a standard error',
13
+ exit_code: 1,
14
+ )
15
+ }.not_to raise_error
16
+ end
17
+ end
18
+
19
+ context '.find' do
20
+ it 'finds a suitable error handler' do
21
+ ErrorHandler.create(
22
+ exception: StandardError,
23
+ message: 'This is a standard error',
24
+ exit_code: 1,
25
+ )
26
+
27
+ expect(ErrorHandler.find(exception)).not_to be_nil
28
+ end
29
+
30
+ it 'returns a default exception if the requested one cannote be found' do
31
+ expect(ErrorHandler.find(RuntimeError.new).exception).to be(StandardError)
32
+ end
33
+ end
34
+
35
+ context '#exception' do
36
+ it 'returns the exception' do
37
+ handler = ErrorHandler.create(
38
+ exception: StandardError,
39
+ message: 'This is a standard error',
40
+ exit_code: 1,
41
+ )
42
+
43
+ expect(handler.exception).to eq(StandardError)
44
+ end
45
+ end
46
+
47
+ context '#run' do
48
+ it 'runs the error handler' do
49
+ handler = ErrorHandler.new(
50
+ exception: StandardError,
51
+ message: 'This is a standard error',
52
+ exit_code: 1,
53
+ )
54
+ handler.original_message = 'blub'
55
+
56
+ LocalPac.ui_logger.level = :debug
57
+
58
+ result = capture(:stderr) do
59
+ begin
60
+ handler.run
61
+ rescue SystemExit => e
62
+ expect(e.status).to eq(1)
63
+ end
64
+ end
65
+
66
+ expect(result).to include('standard error')
67
+ expect(result).to include('blub')
68
+ end
69
+ end
70
+ end
@@ -40,8 +40,12 @@ describe 'Lookup proxy for url' do
40
40
  ::File.join(working_directory, 'git_repo.git')
41
41
  end
42
42
 
43
+ def reload_storage_signal
44
+ 'USR2'
45
+ end
46
+
43
47
  def api_key
44
- SecureRandom.hex
48
+ 'THIS_IS_THE_API_KEY'
45
49
  end
46
50
  end.new
47
51
 
@@ -62,7 +66,7 @@ describe 'Lookup proxy for url' do
62
66
  old_commit_id: commit1.oid,
63
67
  new_commit_id: commit2.oid,
64
68
  reference: 'refs/heads/master',
65
- api_key: LocalPac.config.api_key
69
+ api_key: 'THIS_IS_THE_API_KEY',
66
70
  }
67
71
 
68
72
  response = page.driver.post('/pre-receive', params )
@@ -85,7 +89,7 @@ describe 'Lookup proxy for url' do
85
89
  old_commit_id: commit1.oid,
86
90
  new_commit_id: commit3.oid,
87
91
  reference: 'refs/heads/master',
88
- api_key: LocalPac.config.api_key
92
+ api_key: 'THIS_IS_THE_API_KEY',
89
93
  }
90
94
 
91
95
  response = page.driver.post('/pre-receive', params )
@@ -97,9 +101,33 @@ describe 'Lookup proxy for url' do
97
101
  end
98
102
 
99
103
  it 'returns a error message for an invalid url' do
100
- visit('/blub-gith-hook')
101
- expect(page).to have_content('Unknown git hook...')
102
- expect(page).to have_content('/blub-gith-hook')
104
+ params = {
105
+ old_commit_id: 'asdf',
106
+ new_commit_id: 'asdf',
107
+ reference: 'refs/heads/master',
108
+ api_key: 'THIS_IS_THE_API_KEY',
109
+ }
110
+
111
+ response = page.driver.post('/blub-gith-hook', params )
112
+ json = JSON.parse(response.body)
113
+
114
+ expect(json['error_summary']).to eq('Unknown git hook...')
115
+ expect(json['error_details']).to include('/blub-gith-hook')
116
+ end
117
+
118
+ it 'fails on invalid api key' do
119
+ params = {
120
+ old_commit_id: 'asdf',
121
+ new_commit_id: 'asdf',
122
+ reference: 'refs/heads/master',
123
+ api_key: 'invalid',
124
+ }
125
+
126
+ response = page.driver.post('/pre-receive', params )
127
+ result = JSON.parse(response.body)['error_summary']
128
+
129
+ expect(result).to eq('Invalid API-key...')
130
+ expect(response.status).to eq(403)
103
131
  end
104
132
  end
105
133
  end
@@ -61,6 +61,7 @@ describe GitRepository do
61
61
  expect(f).to be(null_file)
62
62
  end
63
63
  end
64
+
64
65
  context '#added_files' do
65
66
  it 'returns all added files' do
66
67
  repo_path = File.join(working_directory, 'git_repo')
@@ -79,4 +79,37 @@ describe GitStorage do
79
79
  expect(result).to eq([pac_file])
80
80
  end
81
81
  end
82
+
83
+ context '#each_added_pac_file' do
84
+ it 'iterates over all added pac files' do
85
+ repo_path = File.join(working_directory, 'git_repo')
86
+ GitRepository.create(repo_path)
87
+
88
+ file_creator = double('file_creator')
89
+ null_file = double('null_file')
90
+
91
+ repo = GitRepository.new(repo_path, file_creator, null_file)
92
+ oid1 = repo.add_content('file1.pac', 'asdf1')
93
+ repo.add_content('file2.pac', 'asdf2')
94
+ oid3 = repo.add_content('file3.txt', 'asdf3')
95
+
96
+ pac_file = double('pac_file')
97
+ allow(pac_file).to receive(:extension?).with('.pac').and_return(true)
98
+ allow(pac_file).to receive(:path).and_return('proxy.pac')
99
+ allow(pac_file).to receive(:name).and_return(:proxy)
100
+
101
+ vcs = double('vcs')
102
+ allow(vcs).to receive(:added_files).and_return([pac_file])
103
+
104
+ vcs_engine = double('vcs_engine')
105
+ allow(vcs_engine).to receive(:new).and_return(vcs)
106
+
107
+ storage = GitStorage.new(git_repo, compressor, vcs_engine)
108
+
109
+ result = []
110
+ storage.each_added_pac_file(oid1, oid3) { |file| result << file}
111
+
112
+ expect(result).to eq([pac_file])
113
+ end
114
+ end
82
115
  end
@@ -1,26 +1,26 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PacFileValidator do
4
- context '#valid?' do
5
- let(:valid_pac_file) do <<-EOS.strip_heredoc
4
+ let(:valid_pac_file) do <<-EOS.strip_heredoc
6
5
  function FindProxyForURL(url, host) {
7
6
  return "DIRECT"
8
7
  }
9
- EOS
10
- end
8
+ EOS
9
+ end
11
10
 
12
- let(:invalid_pac_file1) do <<-EOS.strip_heredoc
11
+ let(:invalid_pac_file1) do <<-EOS.strip_heredoc
13
12
  function FindProxyForURL(url, host) {
14
- EOS
15
- end
13
+ EOS
14
+ end
16
15
 
17
- let(:invalid_pac_file2) do <<-EOS.strip_heredoc
16
+ let(:invalid_pac_file2) do <<-EOS.strip_heredoc
18
17
  function FindProxyForURL(url, host) {
19
18
  asdf();
20
19
  }
21
- EOS
22
- end
20
+ EOS
21
+ end
23
22
 
23
+ context '#valid?' do
24
24
  it 'returns true if file is valid' do
25
25
  file = double('PacFile')
26
26
  expect(file).to receive(:content).and_return(valid_pac_file)
@@ -42,4 +42,13 @@ describe PacFileValidator do
42
42
  expect(validator.valid?(file)).to be_false
43
43
  end
44
44
  end
45
+
46
+ context '#errors' do
47
+ it 'returns errors found during validation' do
48
+ file = double('PacFile')
49
+ expect(file).to receive(:content).and_return(invalid_pac_file2)
50
+ validator = PacFileValidator.new
51
+ expect(validator.errors(file)).to eq('asdf is not defined')
52
+ end
53
+ end
45
54
  end