proxy_tester 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 (103) hide show
  1. data/.gitignore +22 -0
  2. data/.rdebugrc +7 -0
  3. data/.rspec +3 -0
  4. data/.simplecov +8 -0
  5. data/Gemfile +37 -0
  6. data/Gemfile.lock +199 -0
  7. data/LICENSE.txt +22 -0
  8. data/Procfile +1 -0
  9. data/README.md +582 -0
  10. data/Rakefile +64 -0
  11. data/bin/proxy_tester +11 -0
  12. data/db/migrate/20140314_create_environment.rb +8 -0
  13. data/files/config.yaml +1 -0
  14. data/files/example-config.erb +12 -0
  15. data/files/example-spec_helper.rb.erb +23 -0
  16. data/files/example-test_case.rb.erb +27 -0
  17. data/files/example-test_cases-gemfile.rb.erb +9 -0
  18. data/files/example-user_file.erb +4 -0
  19. data/lib/proxy_tester/actions/add_examples_to_test_cases_directory.rb +125 -0
  20. data/lib/proxy_tester/actions/clone_repository.rb +39 -0
  21. data/lib/proxy_tester/actions/create_directory.rb +33 -0
  22. data/lib/proxy_tester/actions/create_file.rb +55 -0
  23. data/lib/proxy_tester/actions/create_output.rb +36 -0
  24. data/lib/proxy_tester/actions/handle_error.rb +37 -0
  25. data/lib/proxy_tester/actions/initialize_application.rb +70 -0
  26. data/lib/proxy_tester/actions/show_config.rb +10 -0
  27. data/lib/proxy_tester/capybara_proxy.rb +54 -0
  28. data/lib/proxy_tester/capybara_proxy_pac.rb +62 -0
  29. data/lib/proxy_tester/cli/main.rb +59 -0
  30. data/lib/proxy_tester/config.rb +100 -0
  31. data/lib/proxy_tester/data.rb +23 -0
  32. data/lib/proxy_tester/database_session.rb +15 -0
  33. data/lib/proxy_tester/environment.rb +21 -0
  34. data/lib/proxy_tester/erb_generator.rb +34 -0
  35. data/lib/proxy_tester/error_handler.rb +107 -0
  36. data/lib/proxy_tester/error_messages.rb +82 -0
  37. data/lib/proxy_tester/exceptions.rb +53 -0
  38. data/lib/proxy_tester/git_file.rb +31 -0
  39. data/lib/proxy_tester/git_null_file.rb +32 -0
  40. data/lib/proxy_tester/git_repository.rb +120 -0
  41. data/lib/proxy_tester/handle_error.rb +37 -0
  42. data/lib/proxy_tester/locales/en-rails.yml +205 -0
  43. data/lib/proxy_tester/locales/en.yml +42 -0
  44. data/lib/proxy_tester/main.rb +46 -0
  45. data/lib/proxy_tester/models/user.rb +17 -0
  46. data/lib/proxy_tester/pac_result.rb +50 -0
  47. data/lib/proxy_tester/rspec/helper.rb +211 -0
  48. data/lib/proxy_tester/rspec_runner.rb +43 -0
  49. data/lib/proxy_tester/template_file.rb +19 -0
  50. data/lib/proxy_tester/template_repository.rb +22 -0
  51. data/lib/proxy_tester/ui_logger.rb +30 -0
  52. data/lib/proxy_tester/user_database.rb +24 -0
  53. data/lib/proxy_tester/version.rb +3 -0
  54. data/lib/proxy_tester.rb +54 -0
  55. data/proxy_tester.gemspec +34 -0
  56. data/script/acceptance_test +4 -0
  57. data/script/bootstrap +56 -0
  58. data/script/ci +3 -0
  59. data/script/console +14 -0
  60. data/script/release +3 -0
  61. data/script/test_web +22 -0
  62. data/script/unit_test +3 -0
  63. data/spec/actions/add_examples_to_test_cases_directory_spec.rb +52 -0
  64. data/spec/actions/clone_repository_spec.rb +83 -0
  65. data/spec/actions/create_directory_spec.rb +59 -0
  66. data/spec/actions/create_file_spec.rb +139 -0
  67. data/spec/actions/create_output_spec.rb +46 -0
  68. data/spec/actions/handle_error_spec.rb +74 -0
  69. data/spec/actions/initialize_application_spec.rb +40 -0
  70. data/spec/actions/show_config_spec.rb +22 -0
  71. data/spec/capybara_proxy_pac_spec.rb +42 -0
  72. data/spec/capybara_proxy_spec.rb +76 -0
  73. data/spec/config_spec.rb +86 -0
  74. data/spec/data_spec.rb +34 -0
  75. data/spec/environment_spec.rb +25 -0
  76. data/spec/erb_generator_spec.rb +31 -0
  77. data/spec/examples/proxy.pac +7 -0
  78. data/spec/factories.rb +8 -0
  79. data/spec/features/check_ssl_sites_spec.rb +8 -0
  80. data/spec/git_file_spec.rb +46 -0
  81. data/spec/git_repository_spec.rb +111 -0
  82. data/spec/main_spec.rb +25 -0
  83. data/spec/pac_result_spec.rb +20 -0
  84. data/spec/proxy_tester_spec_helper_spec.rb +137 -0
  85. data/spec/rspec_runner_spec.rb +29 -0
  86. data/spec/spec_helper.rb +15 -0
  87. data/spec/support/capybara.rb +11 -0
  88. data/spec/support/database_cleaner.rb +14 -0
  89. data/spec/support/debugging.rb +3 -0
  90. data/spec/support/environment.rb +33 -0
  91. data/spec/support/example.rb +16 -0
  92. data/spec/support/factory_girl.rb +15 -0
  93. data/spec/support/filesystem.rb +19 -0
  94. data/spec/support/helper_features.rb +31 -0
  95. data/spec/support/matcher.rb +17 -0
  96. data/spec/support/reporting.rb +1 -0
  97. data/spec/support/rspec.rb +5 -0
  98. data/spec/support/string.rb +2 -0
  99. data/spec/template_file_spec.rb +25 -0
  100. data/spec/template_repository_spec.rb +44 -0
  101. data/spec/user_database_spec.rb +63 -0
  102. data/spec/user_spec.rb +62 -0
  103. metadata +398 -0
@@ -0,0 +1,137 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe 'Spec helper' do
5
+ let(:valid_pac_file_url) do <<-EOS.strip_heredoc.chomp
6
+ function FindProxyForURL(url, host) {
7
+ if (url == 'www.heise.de') {
8
+ return "DIRECT";
9
+ } else {
10
+ return "PROXY localhost2:3128";
11
+ }
12
+ }
13
+ EOS
14
+ end
15
+
16
+ before :each do
17
+ @__proxy = CapybaraProxy.new
18
+ end
19
+
20
+ context '#use_proxy' do
21
+ it 'defaults to host' do
22
+ @__proxy = double('proxy')
23
+ expect(proxy).to receive(:host=).with('localhost1')
24
+ expect(proxy).to receive(:port=).with('3128')
25
+
26
+ use_proxy 'localhost1:3128'
27
+ end
28
+
29
+ it 'fails on invalid symbol' do
30
+ expect {
31
+ use_proxy :asdf, 'localhost1:3128'
32
+ }.to raise_error Exceptions::SyntaxInvalid
33
+ end
34
+
35
+ it 'works with :host and connection string' do
36
+ @__proxy = double('proxy')
37
+ expect(proxy).to receive(:host=).with('localhost1')
38
+ expect(proxy).to receive(:port=).with('3128')
39
+
40
+ use_proxy :host, 'localhost1:3128'
41
+ end
42
+
43
+ it 'works with :pac and proxy pac' do
44
+ @__proxy_pac = double('proxy_pac')
45
+ expect(proxy_pac).to receive(:pac_file=).with('http://localhost1:4567')
46
+
47
+ use_proxy :pac, 'http://localhost1:4567'
48
+ end
49
+
50
+ it 'finds proxy for proxy pac' do
51
+ @__proxy = double('proxy')
52
+ expect(proxy).to receive(:host=).with('localhost2')
53
+ expect(proxy).to receive(:port=).with('3128')
54
+ allow(proxy).to receive(:as_phantomjs_arguments).and_return(%w{--proxy localhost2:3128})
55
+ allow(proxy).to receive(:to_sym).and_return(:localhost2_3128)
56
+
57
+ file = create_file 'proxy.pac', valid_pac_file_url
58
+ use_proxy :pac, file
59
+
60
+ begin
61
+ use_timeout(0) do
62
+ visit 'http://www.example.com'
63
+ end
64
+ rescue Exceptions::FetchUrlTimeout
65
+ end
66
+ end
67
+
68
+ it 'accepts an type as well (long form)' do
69
+ @__proxy = double('proxy')
70
+ expect(proxy).to receive(:host=).with('localhost1')
71
+ expect(proxy).to receive(:port=).with('3128')
72
+ expect(proxy).to receive(:type=).with(:none)
73
+
74
+ use_proxy :host, 'localhost1:3128', type: :none
75
+ end
76
+
77
+ it 'accepts an type as well (short form)' do
78
+ @__proxy = double('proxy')
79
+ expect(proxy).to receive(:host=).with('localhost1')
80
+ expect(proxy).to receive(:port=).with('3128')
81
+ expect(proxy).to receive(:type=).with(:none)
82
+
83
+ use_proxy 'localhost1:3128', type: :none
84
+ end
85
+ end
86
+
87
+ context '#use_time' do
88
+ it 'sets time for use in proxy pac' do
89
+ time = Time.now
90
+
91
+ @__proxy_pac = double('proxy_pac')
92
+ expect(proxy_pac).to receive(:time=).with(time)
93
+
94
+ use_time time
95
+ end
96
+ end
97
+
98
+ context '#use_client_ip' do
99
+ it 'sets client ip for use in proxy pac' do
100
+ client_ip = IPAddr.new('127.0.0.1').to_s
101
+
102
+ @__proxy_pac = double('proxy_pac')
103
+ expect(proxy_pac).to receive(:client_ip=).with(client_ip)
104
+
105
+ use_client_ip client_ip
106
+ end
107
+ end
108
+
109
+ context '#use_user' do
110
+ it 'works with a valid user' do
111
+ user = create :user
112
+
113
+ @__proxy = double('proxy')
114
+ expect(proxy).to receive(:user=).with(user)
115
+ allow(proxy).to receive(:as_phantomjs_arguments).and_return([])
116
+
117
+ use_user 'user'
118
+ end
119
+
120
+ it 'works with a valid user via proxy' do
121
+ create :user
122
+
123
+ use_proxy 'localhost:3128'
124
+ use_user 'user'
125
+
126
+ visit('http://www.example.org')
127
+ end
128
+
129
+ it 'fails with an invalid user' do
130
+ expect {
131
+ silence :stderr do
132
+ use_user 'user'
133
+ end
134
+ }.to raise_error Exceptions::ProxyUserInvalid
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe RspecRunner do
5
+ context '#initialize' do
6
+ #it 'accepts a config' do
7
+ # config = double('config')
8
+ # expect {
9
+ # RspecRunner.new(config)
10
+ # }.not_to raise_error
11
+ #end
12
+ end
13
+
14
+ #context '#run' do
15
+ # it 'runs test' do
16
+ # create_file 'test_rspec_runner_spec.rb', <<-EOS.strip_heredoc
17
+ # describe 'Test' do
18
+ # it 'is true' do
19
+ # expect(true).to be true
20
+ # end
21
+ # end
22
+ # EOS
23
+
24
+ # runner = RspecRunner.new(test_cases_directory: working_directory)
25
+ # runner.run
26
+ # end
27
+ #end
28
+
29
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ $LOAD_PATH << ::File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'simplecov'
5
+ SimpleCov.command_name 'rspec'
6
+ SimpleCov.start
7
+
8
+ # Pull in all of the gems including those in the `test` group
9
+ require 'bundler'
10
+ Bundler.require :default, :test, :development
11
+
12
+ # Loading support files
13
+ Dir.glob(::File.expand_path('../support/*.rb', __FILE__)).each { |f| require_relative f }
14
+
15
+ include ProxyTester
@@ -0,0 +1,11 @@
1
+ module ProxyTester
2
+ module SpecHelper
3
+ module Capybara
4
+ include ::Capybara::DSL
5
+ end
6
+ end
7
+ end
8
+
9
+ RSpec.configure do |c|
10
+ c.include ProxyTester::SpecHelper::Capybara
11
+ end
@@ -0,0 +1,14 @@
1
+ #encoding: utf-8
2
+ RSpec.configure do |config|
3
+
4
+ config.before(:suite) do
5
+ DatabaseCleaner.strategy = :transaction
6
+ # DatabaseCleaner.clean_with :truncation
7
+ end
8
+
9
+ config.around(:each) do |example|
10
+ DatabaseCleaner.start
11
+ example.run
12
+ DatabaseCleaner.clean
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ require 'pry'
3
+ require 'debugger'
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ require 'fedux_org/stdlib/environment'
3
+
4
+ module ProxyTester
5
+ module SpecHelper
6
+ module Environment
7
+ include FeduxOrg::Stdlib::Environment
8
+ alias_method :with_environment, :isolated_environment
9
+
10
+ def mock_stdin(&block)
11
+ old_stdin = $stdin
12
+ $stdin = double('stdin')
13
+
14
+ block.call
15
+ ensure
16
+ $stdin = old_stdin
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ RSpec.configure do |c|
23
+ c.include ProxyTester::SpecHelper::Environment
24
+ c.before(:suite) do
25
+ %w{
26
+ http_proxy
27
+ https_proxy
28
+ HTTP_PROXY
29
+ HTTPS_PROXY
30
+ }.each { |var| ENV.delete(var) }
31
+ end
32
+ end
33
+
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ module ProxyTester
4
+ module SpecHelper
5
+ module Example
6
+ def example_file(path)
7
+ File.expand_path("../../examples/#{path}", __FILE__)
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ RSpec.configure do |c|
14
+ c.include ProxyTester::SpecHelper::Example
15
+ end
16
+
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ RSpec.configure do |c|
3
+ c.include FactoryGirl::Syntax::Methods
4
+
5
+ c.before(:suite) do
6
+ FactoryGirl.find_definitions
7
+
8
+ begin
9
+ DatabaseCleaner.start
10
+ FactoryGirl.lint
11
+ ensure
12
+ DatabaseCleaner.clean
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ require 'fedux_org/stdlib/filesystem'
2
+
3
+ module ProxyTester
4
+ module SpecHelper
5
+ module Filesystem
6
+ include FeduxOrg::Stdlib::Filesystem
7
+
8
+ def root_directory
9
+ ::File.expand_path('../../../', __FILE__)
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ # encoding: utf-8
16
+ RSpec.configure do |c|
17
+ c.include ProxyTester::SpecHelper::Filesystem
18
+ c.before(:each) { cleanup_working_directory }
19
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ require_relative 'capybara'
3
+
4
+ module InternetBrowsingBnk
5
+ module SpecHelper
6
+ module Features
7
+ def search_for(options = {})
8
+ url = options.fetch(:url)
9
+ content = options.fetch(:content)
10
+ client_ip = options.fetch(:client_ip, nil)
11
+ time = options.fetch(:time, nil)
12
+ pac_file = options.fetch(:pac_file, '/file.pac')
13
+
14
+ visit(pac_file)
15
+ within('#search') do
16
+ fill_in 'url', :with => url
17
+ fill_in('client_ip', :with => client_ip) if client_ip
18
+ fill_in('time', :with => time) if time
19
+ end
20
+ click_on('Search')
21
+ expect(page).to have_content(content)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ # encoding: utf-8
28
+ RSpec.configure do |c|
29
+ c.include InternetBrowsingBnk::SpecHelper::Features
30
+ end
31
+
@@ -0,0 +1,17 @@
1
+ RSpec::Matchers.define :be_a_multiple_of do |expected|
2
+ match do |actual|
3
+ actual % expected == 0
4
+ end
5
+
6
+ failure_message_for_should do |actual|
7
+ "expected that #{actual} would be a precise multiple of #{expected}"
8
+ end
9
+
10
+ failure_message_for_should_not do |actual|
11
+ "expected that #{actual} would not be a precise multiple of #{expected}"
12
+ end
13
+
14
+ description do
15
+ "be a precise multiple of #{expected}"
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ require 'active_support/core_ext/kernel/reporting'
@@ -0,0 +1,5 @@
1
+ RSpec.configure do |c|
2
+ c.filter_run_including :focus => true
3
+ c.run_all_when_everything_filtered = true
4
+ c.treat_symbols_as_metadata_keys_with_true_values = true
5
+ end
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require 'active_support/core_ext/string/strip'
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe TemplateFile do
5
+ context '#initialize' do
6
+ it 'requires a path' do
7
+ TemplateFile.new('/path/asfd')
8
+ end
9
+ end
10
+
11
+ context '#name' do
12
+ it 'has a name based on path' do
13
+ file = TemplateFile.new('/path/asdf')
14
+ expect(file.name).to eq(:asdf)
15
+ end
16
+ end
17
+
18
+ context '#read' do
19
+ it 'reads content' do
20
+ file = create_file('asdf', 'content')
21
+ file = TemplateFile.new(file)
22
+ expect(file.read).to eq('content')
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe TemplateRepository do
5
+ let(:creator_klass) do
6
+ Class.new do
7
+ def initialize(path)
8
+ end
9
+
10
+ def name
11
+ :template
12
+ end
13
+
14
+ def content
15
+ 'content'
16
+ end
17
+ end
18
+ end
19
+
20
+ context '#initialize' do
21
+ it 'accepts a path' do
22
+ TemplateRepository.new('path', creator_klass)
23
+ end
24
+ end
25
+
26
+ context '#find' do
27
+
28
+ it 'finds a template by name' do
29
+ dir = create_directory('repo')
30
+ file = create_file('repo/template.erb')
31
+ repo = TemplateRepository.new(dir, creator_klass)
32
+ template_file = repo.find(::File.basename(file, '.*'))
33
+ expect(template_file.name).to eq(:template)
34
+ end
35
+
36
+ it 'finds a template by name' do
37
+ dir = create_directory('repo')
38
+ file = create_file('repo/template.erb')
39
+ repo = TemplateRepository.new(dir, creator_klass)
40
+ template_file = repo.find(::File.basename(file, '.*').to_sym)
41
+ expect(template_file.name).to eq(:template)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe UserDatabase do
5
+ let(:valid_user_file) {
6
+ create_file 'user.csv', <<-EOS.strip_heredoc
7
+ "user","password"
8
+ "user1","password1"
9
+ EOS
10
+ }
11
+
12
+ context '#initialize' do
13
+ it 'accepts a file for user database' do
14
+ expect {
15
+ UserDatabase.new(valid_user_file)
16
+ }.not_to raise_error
17
+ end
18
+ end
19
+
20
+ context '#create_users' do
21
+ it 'creates instances' do
22
+ creator = double('creator')
23
+ allow(creator).to receive(:create!)
24
+
25
+ db = UserDatabase.new(valid_user_file)
26
+ db.create_users(creator)
27
+ end
28
+
29
+ it 'raises an exception on invalid user record' do
30
+ message = Class.new do
31
+ class << self
32
+ attr_reader :i18n_scope
33
+ end
34
+
35
+ attr_reader :errors
36
+
37
+ def initialize
38
+ @errors = ActiveModel::Errors.new(self)
39
+ end
40
+ end.new
41
+
42
+ creator = double('creator')
43
+ allow(creator).to receive(:create!) { raise ActiveRecord::RecordInvalid, message }
44
+
45
+ db = UserDatabase.new(valid_user_file)
46
+
47
+ expect {
48
+ db.create_users(creator)
49
+ }.to raise_error Exceptions::UserRecordInvalid
50
+
51
+ end
52
+
53
+ it 'raises an exception if csv file does not exist' do
54
+ creator = double('creator')
55
+ allow(creator).to receive(:create!)
56
+
57
+ db = UserDatabase.new('asdf')
58
+ expect {
59
+ db.create_users(creator)
60
+ }.to raise_error Exceptions::UserFileNotFound
61
+ end
62
+ end
63
+ end
data/spec/user_spec.rb ADDED
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe User do
5
+ context '.create' do
6
+ it 'requires a name and a password' do
7
+ expect {
8
+ create(:user,
9
+ name: 'name',
10
+ password: 'password',
11
+ )
12
+ }.not_to raise_error
13
+ end
14
+
15
+ it 'fails on missing name' do
16
+ expect {
17
+ create(:user,
18
+ name: nil,
19
+ password: 'password',
20
+ )
21
+ }.to raise_error
22
+ end
23
+
24
+ it 'fails on missing password' do
25
+ expect {
26
+ create(:user,
27
+ name: 'user1',
28
+ password: nil,
29
+ )
30
+ }.to raise_error
31
+ end
32
+ end
33
+
34
+ context '.find_by!' do
35
+ it 'finds a user' do
36
+ create :user
37
+
38
+ expect {
39
+ User.find_by!(name: 'user')
40
+ }.not_to raise_error
41
+ end
42
+ end
43
+
44
+ context '.load_from' do
45
+ it 'creates users from source' do
46
+ source = double('source')
47
+ expect(source).to receive(:create_users).with(User)
48
+
49
+ User.load_from source
50
+ end
51
+ end
52
+
53
+ context '#to_s' do
54
+ it 'returns the user as textual representation' do
55
+ user = create(:user,
56
+ name: 'name',
57
+ password: 'password',
58
+ )
59
+ expect(user.to_string).to eq('name:password')
60
+ end
61
+ end
62
+ end