test_server 0.0.11 → 0.1.0
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.
- data/README.md +97 -3
- data/Rakefile +1 -1
- data/app/assets/images/ajax-loader.gif +0 -0
- data/app/assets/javascripts/application.js +47 -28
- data/app/assets/stylesheets/application.scss +13 -0
- data/app/controllers/javascript_controller.rb +10 -5
- data/app/views/xhr/show.haml +15 -22
- data/lib/test_server/locales/en.yml +3 -2
- data/lib/test_server/version.rb +1 -1
- data/lib/test_server/web_helper.rb +8 -0
- data/lib/test_server.rb +1 -0
- data/script/acceptance_test +4 -0
- data/script/bootstrap +63 -0
- data/script/ci +7 -0
- data/script/console +14 -0
- data/script/release +3 -0
- data/script/test_web +23 -0
- data/script/unit_test +7 -0
- data/share/archlinux/PKGBUILD.sh.erb +2 -2
- data/spec/features/fetch_data_via_javascript_spec.rb +45 -6
- data/spec/support/capybara.rb +3 -3
- data/test_server.gemspec +2 -0
- metadata +42 -2
data/README.md
CHANGED
@@ -1,9 +1,31 @@
|
|
1
|
-
# TestServer
|
1
|
+
# TestServer - the endpoint for your proxy server tests
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/dg-vrnetze/test_server)
|
4
|
+
[](https://codeclimate.com/github/dg-vrnetze/test_server)
|
5
|
+
[](https://coveralls.io/r/dg-vrnetze/test_server?branch=master)
|
6
|
+
[](http://badge.fury.io/rb/test_server)
|
7
|
+
|
8
|
+
|
9
|
+
`test_server` *serves two main purposes:*
|
10
|
+
|
11
|
+
* end point for your proxy tests.
|
12
|
+
* load generator via simple website driven by javascript
|
13
|
+
|
14
|
+
*Behind the scenes it mainly uses ...*
|
15
|
+
|
16
|
+
* [jquery](http://jquery.com/)
|
17
|
+
* [sinatra](http://www.sinatrarb.com)
|
18
|
+
* and other wonderfull gems
|
19
|
+
|
20
|
+
*Possible use cases:*
|
21
|
+
|
22
|
+
* Provide static data via web application to make your tests reliable
|
23
|
+
* Generate load via browsers typically used by your users
|
4
24
|
|
5
25
|
## Installation
|
6
26
|
|
27
|
+
### Rubygems
|
28
|
+
|
7
29
|
Add this line to your application's Gemfile:
|
8
30
|
|
9
31
|
gem 'test_server'
|
@@ -16,9 +38,81 @@ Or install it yourself as:
|
|
16
38
|
|
17
39
|
$ gem install test_server
|
18
40
|
|
41
|
+
### Archlinux
|
42
|
+
|
43
|
+
```bash
|
44
|
+
# Install via yaourt
|
45
|
+
yaourt -S test_server
|
46
|
+
|
47
|
+
# Install via cower + makepkg
|
48
|
+
cower -d test_server
|
49
|
+
cd <dir>
|
50
|
+
makepkg -is
|
51
|
+
```
|
52
|
+
|
53
|
+
### Firewall rules
|
54
|
+
|
55
|
+
Following you can find an example configuration for iptables to secure your server. It
|
56
|
+
opens ports only for your proxy servers to access `test_server`.
|
57
|
+
|
58
|
+
```bash
|
59
|
+
# default policies
|
60
|
+
iptables -P INPUT -j DROP
|
61
|
+
iptables -P FORWARD -j DROP
|
62
|
+
iptables -P OUTPUT -j ACCEPT
|
63
|
+
|
64
|
+
# user defined chains
|
65
|
+
iptables -N TCP
|
66
|
+
iptables -N UDP
|
67
|
+
|
68
|
+
# rules
|
69
|
+
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|
70
|
+
iptables -A INPUT -i lo -j ACCEPT
|
71
|
+
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
|
72
|
+
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
|
73
|
+
iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
|
74
|
+
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j TCP
|
75
|
+
iptables -A INPUT -p tcp -m recent --set --name TCP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with tcp-reset
|
76
|
+
iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with icmp-port-unreachable
|
77
|
+
iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
|
78
|
+
iptables -A TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with tcp-reset
|
79
|
+
iptables -A TCP -s <public ips proxies> -p tcp -m tcp --dport 8000 -j ACCEPT
|
80
|
+
iptables -A UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with icmp-port-unreachable
|
81
|
+
COMMIT
|
82
|
+
```
|
83
|
+
|
84
|
+
## Screenshots
|
85
|
+
|
86
|
+
To be defined...
|
87
|
+
|
19
88
|
## Usage
|
20
89
|
|
21
|
-
|
90
|
+
*Starting Web Application*
|
91
|
+
|
92
|
+
```
|
93
|
+
% test_server serve
|
94
|
+
```
|
95
|
+
|
96
|
+
*Load testing*
|
97
|
+
|
98
|
+
Point your browser to `http://<your-domain.org>/v1/test/javascript/xhr/string`.
|
99
|
+
Fill out the form and run test.
|
100
|
+
|
101
|
+
*Testing your proxies*
|
102
|
+
|
103
|
+
* Write tests using `capybara` + `rspec`.
|
104
|
+
|
105
|
+
or
|
106
|
+
|
107
|
+
* Use [`proxy_tester`](https://github.com/dg-vrnetze/proxy_tester) for a fully
|
108
|
+
featured solution for writing proxy tests (**RECOMMENDED**). `proxy_tester` uses
|
109
|
+
`capybara` and `rspec`, but provides lots of helpers for writing proxy tests
|
110
|
+
to reduce the work on your site.
|
111
|
+
|
112
|
+
## List of test end points
|
113
|
+
|
114
|
+
To be defined. Hopefully I can provide a `controller` which handles this within
|
115
|
+
the application.
|
22
116
|
|
23
117
|
## Contributing
|
24
118
|
|
data/Rakefile
CHANGED
@@ -68,7 +68,7 @@ end
|
|
68
68
|
namespace :package do
|
69
69
|
desc 'build arch linux package'
|
70
70
|
task :archlinux => [gem_file, archlinux_build_directory] do
|
71
|
-
FileUtils.mv ::File.join(pkg_directory, "#{software}-#{version}.gem"), archlinux_build_directory
|
71
|
+
#FileUtils.mv ::File.join(pkg_directory, "#{software}-#{version}.gem"), archlinux_build_directory
|
72
72
|
|
73
73
|
generator = Filegen::Rubygen.new
|
74
74
|
template = File.read(File.expand_path('../share/archlinux/PKGBUILD.sh.erb', __FILE__))
|
Binary file
|
@@ -1,14 +1,6 @@
|
|
1
1
|
//= require jquery
|
2
2
|
//= require bootstrap-sass/dist/js/bootstrap
|
3
3
|
|
4
|
-
//$(document).ready(function(){
|
5
|
-
// $(".lp_show_fields").click(function(e){
|
6
|
-
// e.preventDefault()
|
7
|
-
// $(".lp_fields_close, .lp_fields_open").toggle();
|
8
|
-
// $(".lp_button_show_fields_close, .lp_button_show_fields_open").toggle();
|
9
|
-
// });
|
10
|
-
//});
|
11
|
-
|
12
4
|
function escapeHTML(s) {
|
13
5
|
return String(s).replace(/&(?!\w+;)/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
14
6
|
}
|
@@ -24,13 +16,15 @@ function result(url, timeout, start_time, result) {
|
|
24
16
|
}
|
25
17
|
|
26
18
|
$('#result').toggle(true);
|
27
|
-
$('#
|
19
|
+
$('#result_table_header').after('<tr class="ts-result-row ' + result_klass + '"><td>' + url + '</td><td>' + timeout + '</td><td>' + run_time + '</td><td>' + result + '</td></tr>');
|
20
|
+
|
28
21
|
}
|
29
22
|
|
30
23
|
$(document).ready(function(){
|
31
24
|
$("#reset").click(function () {
|
32
25
|
$('#form')[0].reset();
|
33
26
|
$('.ts-result-row').remove();
|
27
|
+
$('#result').toggle(false);
|
34
28
|
});
|
35
29
|
});
|
36
30
|
|
@@ -38,28 +32,53 @@ $(document).ready(function(){
|
|
38
32
|
$("#submit").click(function (e) {
|
39
33
|
e.preventDefault();
|
40
34
|
|
41
|
-
var url = escapeHTML($('#url').val())
|
42
|
-
var timeout = escapeHTML($('#timeout').val() * 1000)
|
43
|
-
var count = escapeHTML($('#count').val())
|
35
|
+
var url = escapeHTML($('#url').val());
|
36
|
+
var timeout = escapeHTML($('#timeout').val() * 1000);
|
37
|
+
var count = escapeHTML($('#count').val());
|
44
38
|
|
45
|
-
|
39
|
+
repeat_requests(url, count, timeout);
|
40
|
+
});
|
41
|
+
});
|
46
42
|
|
47
|
-
|
43
|
+
function repeat_requests(url, count, timeout) {
|
44
|
+
var repeat = $('#repeat').is(":checked");
|
45
|
+
var requests = [];
|
48
46
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
result(url, timeout, start_time, 'ok');
|
55
|
-
},
|
56
|
-
error: function(){
|
57
|
-
result(url, timeout, start_time, 'fail');
|
58
|
-
}
|
59
|
-
});
|
47
|
+
var success_callback = function() {
|
48
|
+
$('#request-spinner').toggle(false);
|
49
|
+
|
50
|
+
if (repeat == true) {
|
51
|
+
setTimeout(repeat_requests(url, count, timeout), 1000);
|
60
52
|
}
|
53
|
+
};
|
61
54
|
|
62
|
-
|
63
|
-
|
55
|
+
var failure_callback = function() {
|
56
|
+
$('#request-spinner').toggle(false);
|
57
|
+
};
|
58
|
+
|
59
|
+
$('#request-spinner').toggle(true);
|
64
60
|
|
65
|
-
|
61
|
+
for(i = 0; i < count; i++) {
|
62
|
+
requests.push(sendAjax(url, timeout));
|
63
|
+
}
|
64
|
+
|
65
|
+
$.when.apply(undefined, requests).then(function(results){success_callback()}, function(results){failure_callback()});
|
66
|
+
}
|
67
|
+
|
68
|
+
function sendAjax(url, timeout) {
|
69
|
+
var start_time = new Date().getTime();
|
70
|
+
|
71
|
+
return $.ajax(
|
72
|
+
{
|
73
|
+
url: url,
|
74
|
+
timeout: timeout,
|
75
|
+
cache: false,
|
76
|
+
success: function() {
|
77
|
+
result(url, timeout, start_time, 'ok');
|
78
|
+
},
|
79
|
+
error: function(){
|
80
|
+
result(url, timeout, start_time, 'fail');
|
81
|
+
}
|
82
|
+
}
|
83
|
+
);
|
84
|
+
}
|
@@ -110,6 +110,10 @@ a:focus {
|
|
110
110
|
display: inline-block;
|
111
111
|
}
|
112
112
|
|
113
|
+
.ts-field-repeat {
|
114
|
+
@extend .checkbox;
|
115
|
+
}
|
116
|
+
|
113
117
|
.ts-field-count {
|
114
118
|
@extend .form-control;
|
115
119
|
display: inline-block;
|
@@ -148,3 +152,12 @@ a:focus {
|
|
148
152
|
.ts-result-failed-request {
|
149
153
|
color: red;
|
150
154
|
}
|
155
|
+
|
156
|
+
#request-spinner {
|
157
|
+
margin: 20px;
|
158
|
+
display: none;
|
159
|
+
}
|
160
|
+
|
161
|
+
.ts-inline {
|
162
|
+
display: inline;
|
163
|
+
}
|
@@ -2,6 +2,12 @@
|
|
2
2
|
module TestServer
|
3
3
|
module App
|
4
4
|
class JavascriptController < ApplicationController
|
5
|
+
use Rack::Cors do
|
6
|
+
allow do
|
7
|
+
origins '*'
|
8
|
+
resource '*', :headers => :any, :methods => [:get, :post]
|
9
|
+
end
|
10
|
+
end
|
5
11
|
|
6
12
|
before do
|
7
13
|
param :no_cache, Boolean, default: false
|
@@ -11,18 +17,17 @@ module TestServer
|
|
11
17
|
|
12
18
|
configure_caching(params)
|
13
19
|
end
|
14
|
-
|
20
|
+
|
21
|
+
get '/xhr/url/?' do
|
15
22
|
param :count, Integer, default: 10
|
16
23
|
param :timeout, Integer, default: 10
|
17
24
|
param :url, String
|
25
|
+
param :repeat, Boolean, default: false
|
18
26
|
|
19
27
|
@count = params[:count]
|
20
28
|
@url = params[:url]
|
21
29
|
@timeout = params[:timeout]
|
22
|
-
|
23
|
-
#@data = encode do
|
24
|
-
# generate_string(params[:count])
|
25
|
-
#end
|
30
|
+
@repeat = params[:repeat]
|
26
31
|
|
27
32
|
haml :'xhr/show', layout: :application
|
28
33
|
end
|
data/app/views/xhr/show.haml
CHANGED
@@ -10,29 +10,22 @@
|
|
10
10
|
.ts-form-group
|
11
11
|
%label{ for: :url}
|
12
12
|
= t('views.javascript.xhr.fields.url')
|
13
|
-
%input#url.ts-field-url{ type: :url, name: :url, value: @url }
|
14
|
-
|
13
|
+
%input#url.ts-field-url{ type: :url, name: :url, value: @url, placeholder: 'http://www.example.org' }
|
14
|
+
.ts-field-repeat
|
15
|
+
%label
|
16
|
+
%input#repeat{ type: :checkbox, value: @repeat }
|
17
|
+
= t('views.javascript.xhr.fields.repeat')
|
18
|
+
%button#submit.ts-button-submit{type: 'submit', name: 'submit', value: t('views.application.buttons.submit'), 'data-toggle' => 'modal', 'data-target' => '#notification'}
|
15
19
|
= t('views.application.buttons.submit')
|
16
|
-
%a#reset.ts-button-reset{href: '#'}
|
20
|
+
%a#reset.ts-button-reset{href: '#', name: 'reset'}
|
17
21
|
= t('views.application.buttons.reset')
|
22
|
+
%span.ts-inline#request-spinner
|
23
|
+
%img{ src: '/assets/ajax-loader.gif', alt: t('views.javascript.xhr.spinner.text') }
|
24
|
+
= t('views.javascript.xhr.spinner.text')
|
18
25
|
|
19
26
|
%table#result.ts-result-table
|
20
|
-
%
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
.modal#notification{ role: 'dialog' , tabindex: '-1'}
|
26
|
-
.modal-dialog
|
27
|
-
.modal-content
|
28
|
-
.modal-header
|
29
|
-
%button.ts-button-close-headline{ type: 'button', 'data-dismiss' => 'modal', 'aria-hidden' => 'true'}
|
30
|
-
×
|
31
|
-
%h4
|
32
|
-
= t('views.dialogs.notification.title')
|
33
|
-
.modal-body
|
34
|
-
%p.ts-text-centered
|
35
|
-
= t('views.javascript.xhr.notification.text')
|
36
|
-
.modal-footer
|
37
|
-
%button.ts-button-close{ type: 'button', 'data-dismiss' => 'modal' }
|
38
|
-
= t('views.application.buttons.close')
|
27
|
+
%tr#result_table_header
|
28
|
+
%th= t('views.javascript.xhr.result_table.url')
|
29
|
+
%th= t('views.javascript.xhr.result_table.timeout')
|
30
|
+
%th= t('views.javascript.xhr.result_table.runtime')
|
31
|
+
%th= t('views.javascript.xhr.result_table.status')
|
@@ -62,11 +62,12 @@ en:
|
|
62
62
|
url: URL
|
63
63
|
count: Count
|
64
64
|
timeout: Timeout (s)
|
65
|
+
repeat: Repeat Requests
|
65
66
|
result_table:
|
66
67
|
url: URL
|
67
68
|
runtime: Runtime (ms)
|
68
69
|
timeout: Timeout (ms)
|
69
70
|
status: Status
|
70
|
-
|
71
|
-
text:
|
71
|
+
spinner:
|
72
|
+
text: Requests were sent. Waiting for results.
|
72
73
|
|
data/lib/test_server/version.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module TestServer
|
3
3
|
module WebHelper
|
4
|
+
def base_url
|
5
|
+
mutex = Mutex.new
|
6
|
+
|
7
|
+
mutex.synchronize do
|
8
|
+
@base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
4
12
|
def h(text)
|
5
13
|
Rack::Utils.escape_html(text)
|
6
14
|
end
|
data/lib/test_server.rb
CHANGED
data/script/bootstrap
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
function puts() {
|
4
|
+
echo -e $1 >&2
|
5
|
+
}
|
6
|
+
|
7
|
+
function install_package() {
|
8
|
+
if which pacman > /dev/null; then
|
9
|
+
if [ -z "$(pacman -Ss "^$1\$" | grep installed)" ]; then
|
10
|
+
puts "Installing $1"
|
11
|
+
sudo pacman -S --noconfirm $1
|
12
|
+
fi
|
13
|
+
else
|
14
|
+
puts "Please install $1 from your operating system repository."
|
15
|
+
fi
|
16
|
+
}
|
17
|
+
|
18
|
+
function install_gem() {
|
19
|
+
if which gem > /dev/null; then
|
20
|
+
if [ -z "$(gem list -l "^$1\$")" ]; then
|
21
|
+
puts "Installing $1"
|
22
|
+
gem install --no-ri --no-rdoc $1
|
23
|
+
fi
|
24
|
+
else
|
25
|
+
puts "Please install $1 via rubygems."
|
26
|
+
fi
|
27
|
+
}
|
28
|
+
|
29
|
+
function install_node() {
|
30
|
+
if which npm > /dev/null; then
|
31
|
+
if [ -z "$(npm list -g $1 | grep bower)" ]; then
|
32
|
+
puts "Installing $1"
|
33
|
+
npm install -g $1
|
34
|
+
fi
|
35
|
+
else
|
36
|
+
puts "Please install $1 via npm"
|
37
|
+
fi
|
38
|
+
}
|
39
|
+
|
40
|
+
function file_exist() {
|
41
|
+
if [ -f $1 ]; then
|
42
|
+
puts "$2"
|
43
|
+
return 0
|
44
|
+
else
|
45
|
+
puts "Warning file \"$1\" does not exist. Maybe this can cause problems during bootstrapping"
|
46
|
+
return 1
|
47
|
+
fi
|
48
|
+
}
|
49
|
+
|
50
|
+
echo "Bootstrapping development environment for application.." >&2
|
51
|
+
|
52
|
+
install_package ruby
|
53
|
+
install_package nodejs
|
54
|
+
install_package phantomjs
|
55
|
+
|
56
|
+
install_gem bundler
|
57
|
+
bundle install
|
58
|
+
|
59
|
+
file_exist "$HOME/.npmrc" "I found a .npmrc. Please make sure your npm configuration works with global install for users. If not please add something like \"prefix = /home/user/.local/share/npm\" to your .bashrc/.zshrc + export PATH=/home/user/.local/share/npm/bin:\$PATH"
|
60
|
+
|
61
|
+
install_node bower
|
62
|
+
|
63
|
+
bower install
|
data/script/ci
ADDED
data/script/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH << ::File.expand_path('../../lib', __FILE__)
|
4
|
+
|
5
|
+
# Pull in all of the gems including those in the `test` group
|
6
|
+
require 'bundler'
|
7
|
+
Bundler.require :default, :test, :development
|
8
|
+
|
9
|
+
require 'irb'
|
10
|
+
require 'irb/completion'
|
11
|
+
require 'test_server'
|
12
|
+
|
13
|
+
ARGV.clear
|
14
|
+
IRB.start
|
data/script/release
ADDED
data/script/test_web
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'sinatra/base'
|
4
|
+
|
5
|
+
class Webserver < Sinatra::Base
|
6
|
+
set :logging, :true
|
7
|
+
|
8
|
+
post '/rspec/:test' do
|
9
|
+
case params[:test]
|
10
|
+
when 'send'
|
11
|
+
return params[:data]
|
12
|
+
else
|
13
|
+
not_found
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
get '/rspec/:test' do
|
18
|
+
params[:test]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Webserver.set :bind,'127.0.0.1'
|
23
|
+
Webserver.run!
|
data/script/unit_test
ADDED
@@ -9,9 +9,9 @@ license=('MIT')
|
|
9
9
|
depends=('ruby' 'libatomic_ops')
|
10
10
|
install=${pkgname}.install
|
11
11
|
makedepends=(rubygems filegen phantomjs)
|
12
|
-
|
12
|
+
source=(http://gems.rubyforge.org/gems/$pkgname-$pkgver.gem)
|
13
13
|
backup=etc/${pkgname}/config.yaml
|
14
|
-
source=($pkgname-$pkgver.gem)
|
14
|
+
#source=($pkgname-$pkgver.gem)
|
15
15
|
noextract=($pkgname-$pkgver.gem)
|
16
16
|
<%= lookup('sha') %>
|
17
17
|
|
@@ -2,17 +2,56 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe 'Fetch data via javascript', :js do
|
5
|
-
|
6
|
-
|
5
|
+
before :each do
|
6
|
+
config = Class.new do
|
7
|
+
include FeduxOrg::Stdlib::Filesystem
|
8
|
+
|
9
|
+
def root_directory
|
10
|
+
::File.expand_path('../../../', __FILE__)
|
11
|
+
end
|
12
|
+
|
13
|
+
def log_level
|
14
|
+
:unknown
|
15
|
+
end
|
16
|
+
|
17
|
+
def access_log
|
18
|
+
File.join(working_directory, 'access.log')
|
19
|
+
end
|
20
|
+
|
21
|
+
def reload_config_signal
|
22
|
+
'USR1'
|
23
|
+
end
|
24
|
+
end.new
|
25
|
+
|
26
|
+
TestServer.config = config
|
7
27
|
|
8
|
-
|
28
|
+
Capybara.app = Rack::Builder.new do
|
29
|
+
map '/' do
|
30
|
+
run TestServer::App::JavascriptController
|
31
|
+
end
|
32
|
+
|
33
|
+
map '/assets' do
|
34
|
+
run TestServer::App::AssetsController.assets
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context '/xhr/url/' do
|
40
|
+
it 'submits requests to url' do
|
41
|
+
url = '/v1/test/javascript/xhr/url'
|
42
|
+
visit '/xhr/url/'
|
9
43
|
|
10
44
|
within '#form' do
|
11
|
-
fill_in 'url', :with =>
|
45
|
+
fill_in 'url', :with => url
|
46
|
+
fill_in 'count', :with => 1
|
12
47
|
end
|
13
48
|
|
14
|
-
|
15
|
-
|
49
|
+
|
50
|
+
click_button('submit')
|
51
|
+
|
52
|
+
first '.ts-result-row'
|
53
|
+
|
54
|
+
expect(page).to have_content(url)
|
16
55
|
end
|
17
56
|
|
18
57
|
end
|
data/spec/support/capybara.rb
CHANGED
@@ -8,9 +8,9 @@ end
|
|
8
8
|
|
9
9
|
RSpec.configure do |c|
|
10
10
|
c.include TestServer::SpecHelper::Capybara
|
11
|
-
c.
|
12
|
-
Capybara.
|
13
|
-
Capybara.
|
11
|
+
c.before(:all) do
|
12
|
+
Capybara.default_driver = :rack_test
|
13
|
+
Capybara.javascript_driver = :poltergeist
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/test_server.gemspec
CHANGED
@@ -36,5 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_runtime_dependency 'pager'
|
37
37
|
spec.add_runtime_dependency 'sinatra-param'
|
38
38
|
spec.add_runtime_dependency 'sinatra-contrib'
|
39
|
+
spec.add_runtime_dependency 'sinatra-advanced-routes'
|
40
|
+
spec.add_runtime_dependency 'rack-cors'
|
39
41
|
spec.add_runtime_dependency 'thor'
|
40
42
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test_server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-04-
|
12
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -299,6 +299,38 @@ dependencies:
|
|
299
299
|
- - ! '>='
|
300
300
|
- !ruby/object:Gem::Version
|
301
301
|
version: '0'
|
302
|
+
- !ruby/object:Gem::Dependency
|
303
|
+
name: sinatra-advanced-routes
|
304
|
+
requirement: !ruby/object:Gem::Requirement
|
305
|
+
none: false
|
306
|
+
requirements:
|
307
|
+
- - ! '>='
|
308
|
+
- !ruby/object:Gem::Version
|
309
|
+
version: '0'
|
310
|
+
type: :runtime
|
311
|
+
prerelease: false
|
312
|
+
version_requirements: !ruby/object:Gem::Requirement
|
313
|
+
none: false
|
314
|
+
requirements:
|
315
|
+
- - ! '>='
|
316
|
+
- !ruby/object:Gem::Version
|
317
|
+
version: '0'
|
318
|
+
- !ruby/object:Gem::Dependency
|
319
|
+
name: rack-cors
|
320
|
+
requirement: !ruby/object:Gem::Requirement
|
321
|
+
none: false
|
322
|
+
requirements:
|
323
|
+
- - ! '>='
|
324
|
+
- !ruby/object:Gem::Version
|
325
|
+
version: '0'
|
326
|
+
type: :runtime
|
327
|
+
prerelease: false
|
328
|
+
version_requirements: !ruby/object:Gem::Requirement
|
329
|
+
none: false
|
330
|
+
requirements:
|
331
|
+
- - ! '>='
|
332
|
+
- !ruby/object:Gem::Version
|
333
|
+
version: '0'
|
302
334
|
- !ruby/object:Gem::Dependency
|
303
335
|
name: thor
|
304
336
|
requirement: !ruby/object:Gem::Requirement
|
@@ -334,6 +366,7 @@ files:
|
|
334
366
|
- LICENSE.md
|
335
367
|
- README.md
|
336
368
|
- Rakefile
|
369
|
+
- app/assets/images/ajax-loader.gif
|
337
370
|
- app/assets/javascripts/application.js
|
338
371
|
- app/assets/stylesheets/application.scss
|
339
372
|
- app/controllers/application_controller.rb
|
@@ -383,6 +416,13 @@ files:
|
|
383
416
|
- lib/test_server/ui_logger.rb
|
384
417
|
- lib/test_server/version.rb
|
385
418
|
- lib/test_server/web_helper.rb
|
419
|
+
- script/acceptance_test
|
420
|
+
- script/bootstrap
|
421
|
+
- script/ci
|
422
|
+
- script/console
|
423
|
+
- script/release
|
424
|
+
- script/test_web
|
425
|
+
- script/unit_test
|
386
426
|
- share/archlinux/Makefile
|
387
427
|
- share/archlinux/PKGBUILD.sh.erb
|
388
428
|
- share/archlinux/config.yaml.erb
|