1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#!/usr/bin/env perl
use strict;
use warnings;
BEGIN {
use File::Basename qw(dirname);
use File::Spec;
my $d = dirname(File::Spec->rel2abs($0));
require "$d/../setenv.pl";
}
use Getopt::Long ':config' => qw(pass_through auto_help);
my ($run_server, $run_cypress, $vagrant);
my $config_file = 'conf/general.yml-example';
my $cobrand = 'fixmystreet';
my $coords = '51.532851,-2.284277';
my $area_id = 2608;
my $name = 'Borsetshire';
my $mapit_url = 'https://mapit.uk/';
GetOptions(
'config=s' => \$config_file,
'server' => \$run_server,
'cypress' => \$run_cypress,
'vagrant' => \$vagrant,
'cobrand=s' => \$cobrand,
'coords=s' => \$coords,
'area_id=s' => \$area_id,
'name=s' => \$name,
'mapit_url=s' => \$mapit_url,
);
if ($vagrant) {
# Test inception
system('vagrant ssh -c "cd fixmystreet && bin/browser-tests --server 2>/dev/null" &');
require IO::Socket;
sub check_connection {
my $remote = IO::Socket::INET->new(Proto => "tcp", PeerAddr => "localhost", PeerPort => 3001) or return;
$remote->autoflush(1);
print $remote "GET / HTTP/1.0\r\n\r\n";
while (<$remote>) { return 1; }
0;
}
local $| = 1;
print 'Waiting for test server';
while (!check_connection()) {
print '.'; sleep 1;
}
print " done\n";
system('bin/browser-tests', '--cypress', @ARGV);
system('vagrant', 'ssh', '-c', 'kill $(cat /tmp/cypress-server.pid)');
exit;
}
if (!$run_server && !$run_cypress) {
# If asked for neither, run both
$run_server = $run_cypress = 1;
}
sub run {
my $cmd = shift @ARGV;
die "Must specify a cypress command\n" unless $cmd || !$run_cypress;
if ($run_server) {
require FixMyStreet::TestAppProve;
require t::Mock::MapIt;
my $config_out = FixMyStreet::TestAppProve->get_config({
config_file => $config_file,
# Want this to be like .com
ALLOWED_COBRANDS => [ $cobrand ],
MAPIT_URL => $mapit_url,
BASE_URL => 'http://localhost:3001',
});
$ENV{FMS_OVERRIDE_CONFIG} = $config_out;
# Set up, and load in some data
system('bin/make_css', 'fixmystreet.com');
system('bin/fixmystreet.com/fixture', '--nonrandom', '--coords', $coords, '--name', $name, '--area-id', $area_id, '--commit');
}
my $pid;
if ($run_server && $run_cypress) {
$pid = fork();
die if not defined $pid;
}
if (($run_cypress && !$run_server) || $pid) {
# Parent, run the test runner (then kill the child)
my $exit = system("cypress", $cmd, '--config', 'fixturesFolder=false,pluginsFile=false,supportFile=false,blacklistHosts=[gaze.mysociety.org,*.openstreetmap.org]', '--project', '.cypress', '--env', "cobrand=$cobrand", @ARGV);
kill 'TERM', $pid if $pid;
exit $exit >> 8;
} else {
# Child, run the server on port 3001
local $ENV{FIXMYSTREET_APP_DEBUG} = 0;
require Plack::Runner;
my $runner = Plack::Runner->new;
$runner->parse_options('--listen', ':3001', '-s', 'Starman', '--env', 'deployment', '--pid', '/tmp/cypress-server.pid');
$runner->run;
}
}
run();
__END__
=head1 NAME
browser-tests - Run Cypress browser tests, set up for FixMyStreet.
=head1 SYNOPSIS
browser-tests [running options] [fixture options] [cypress options]
Running options:
--config provide an override general.yml file
--server only run the test server, not cypress
--cypress only run cypress, not the test server
--vagrant run test server inside Vagrant, cypress outside
--help this help message
Fixture option:
--cobrand Cobrand to use, default 'fixmystreet'
--coords Default co-ordinates for created reports
--area_id Area ID to use for created body
--name Name to use for created body
--mapit_url MapIt URL to use, default mock
Use browser-tests instead of running cypress directly, so that a clean
database is set up for Cypress to use, not affecting your normal dev database.
If you're running FixMyStreet in a VM, you can use this script to run the test
server in the VM and Cypress outside of it.
$ browser-tests open # to run interactively
$ browser-tests run # run headlessly
$ browser-tests run --record --key # record and upload a run
$ browser-tests --vagrant run # run if you use Vagrant
You need to have installed cypress already using npm, and it needs to be on
your PATH.
=cut
|