Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
bwinf
medal
Commits
b55021fe
Commit
b55021fe
authored
Aug 06, 2019
by
Robert Czechowski
Browse files
Complete group code login test, clean up main.rs
parent
cd45a3e2
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/main.rs
View file @
b55021fe
...
@@ -29,31 +29,27 @@ extern crate webbrowser;
...
@@ -29,31 +29,27 @@ extern crate webbrowser;
pub
mod
config
;
pub
mod
config
;
pub
mod
contestreader_yaml
;
pub
mod
contestreader_yaml
;
mod
db_apply_migrations
;
pub
mod
db_conn
;
pub
mod
db_conn
;
pub
mod
functions
;
pub
mod
oauth_provider
;
mod
db_apply_migrations
;
mod
db_conn_postgres
;
mod
db_conn_postgres
;
mod
db_conn_sqlite
;
mod
db_conn_sqlite
;
mod
db_objects
;
mod
db_objects
;
pub
mod
functions
;
pub
mod
oauth_provider
;
mod
webfw_iron
;
mod
webfw_iron
;
use
db_conn
::{
MedalConnection
,
MedalObject
};
use
db_conn
::{
MedalConnection
,
MedalObject
};
use
functions
::
SetPassword
;
// TODO: Refactor, so we don't need to take this from there!
use
db_objects
::
*
;
use
db_objects
::
*
;
use
functions
::
SetPassword
;
// TODO: Refactor, so we don't need to take this from there!
use
webfw_iron
::
start_server
;
use
webfw_iron
::
start_server
;
use
std
::
fs
;
use
config
::
Config
;
use
std
::
path
;
use
std
::
path
::
Path
;
use
structopt
::
StructOpt
;
use
structopt
::
StructOpt
;
use
config
::
Config
;
use
std
::
path
::{
Path
,
PathBuf
}
;
fn
read_contest
(
p
:
&
path
::
PathBuf
)
->
Option
<
Contest
>
{
fn
read_contest
(
p
:
&
PathBuf
)
->
Option
<
Contest
>
{
use
std
::
fs
::
File
;
use
std
::
fs
::
File
;
use
std
::
io
::
Read
;
use
std
::
io
::
Read
;
...
@@ -67,8 +63,8 @@ fn read_contest(p: &path::PathBuf) -> Option<Contest> {
...
@@ -67,8 +63,8 @@ fn read_contest(p: &path::PathBuf) -> Option<Contest> {
}
}
fn
get_all_contest_info
(
task_dir
:
&
str
)
->
Vec
<
Contest
>
{
fn
get_all_contest_info
(
task_dir
:
&
str
)
->
Vec
<
Contest
>
{
fn
walk_me_recursively
(
p
:
&
path
::
PathBuf
,
contests
:
&
mut
Vec
<
Contest
>
)
{
fn
walk_me_recursively
(
p
:
&
PathBuf
,
contests
:
&
mut
Vec
<
Contest
>
)
{
if
let
Ok
(
paths
)
=
fs
::
read_dir
(
p
)
{
if
let
Ok
(
paths
)
=
std
::
fs
::
read_dir
(
p
)
{
for
path
in
paths
{
for
path
in
paths
{
let
p
=
path
.unwrap
()
.path
();
let
p
=
path
.unwrap
()
.path
();
walk_me_recursively
(
&
p
,
contests
);
walk_me_recursively
(
&
p
,
contests
);
...
@@ -81,7 +77,7 @@ fn get_all_contest_info(task_dir: &str) -> Vec<Contest> {
...
@@ -81,7 +77,7 @@ fn get_all_contest_info(task_dir: &str) -> Vec<Contest> {
};
};
let
mut
contests
=
Vec
::
new
();
let
mut
contests
=
Vec
::
new
();
match
fs
::
read_dir
(
task_dir
)
{
match
std
::
fs
::
read_dir
(
task_dir
)
{
Err
(
why
)
=>
println!
(
"Error opening tasks directory! {:?}"
,
why
.kind
()),
Err
(
why
)
=>
println!
(
"Error opening tasks directory! {:?}"
,
why
.kind
()),
Ok
(
paths
)
=>
{
Ok
(
paths
)
=>
{
for
path
in
paths
{
for
path
in
paths
{
...
@@ -164,6 +160,7 @@ fn prepare_and_start_server<C>(mut conn: C, config: Config, onlycontestscan: boo
...
@@ -164,6 +160,7 @@ fn prepare_and_start_server<C>(mut conn: C, config: Config, onlycontestscan: boo
match
start_server
(
conn
,
config
)
{
match
start_server
(
conn
,
config
)
{
Ok
(
_
)
=>
{
Ok
(
_
)
=>
{
println!
(
"Server started"
);
println!
(
"Server started"
);
#[cfg(feature
=
"webbrowser"
)]
#[cfg(feature
=
"webbrowser"
)]
{
{
if
let
(
Some
(
self_url
),
Some
(
true
))
=
(
self_url
,
open_browser
)
{
if
let
(
Some
(
self_url
),
Some
(
true
))
=
(
self_url
,
open_browser
)
{
...
@@ -242,7 +239,6 @@ fn main() {
...
@@ -242,7 +239,6 @@ fn main() {
mod
tests
{
mod
tests
{
use
super
::
*
;
use
super
::
*
;
use
reqwest
::
StatusCode
;
use
reqwest
::
StatusCode
;
use
std
::
io
::
Read
;
fn
start_server_and_fn
<
F
>
(
port
:
u16
,
set_user
:
Option
<
(
String
,
String
,
bool
)
>
,
f
:
F
)
fn
start_server_and_fn
<
F
>
(
port
:
u16
,
set_user
:
Option
<
(
String
,
String
,
bool
)
>
,
f
:
F
)
where
F
:
Fn
()
{
where
F
:
Fn
()
{
...
@@ -267,47 +263,55 @@ mod tests {
...
@@ -267,47 +263,55 @@ mod tests {
config
.port
=
Some
(
port
);
config
.port
=
Some
(
port
);
let
srvr
=
start_server
(
conn
,
config
);
let
srvr
=
start_server
(
conn
,
config
);
// Message server started
start_tx
.send
(())
.unwrap
();
start_tx
.send
(())
.unwrap
();
// Wait for test to finish
stop_rx
.recv
()
.unwrap
();
stop_rx
.recv
()
.unwrap
();
srvr
.unwrap
()
.close
()
.unwrap
();
srvr
.unwrap
()
.close
()
.unwrap
();
});
});
//
w
ait for server to start
:
//
W
ait for server to start
start_rx
.recv
()
.unwrap
();
start_rx
.recv
()
.unwrap
();
thread
::
sleep
(
time
::
Duration
::
from_millis
(
100
));
thread
::
sleep
(
time
::
Duration
::
from_millis
(
100
));
f
();
f
();
// Message test finished
stop_tx
.send
(())
.unwrap
();
stop_tx
.send
(())
.unwrap
();
}
}
fn
login
_for_tests
(
port
:
u16
,
client
:
&
reqwest
::
Client
,
username
:
&
str
,
password
:
&
str
)
->
reqwest
::
Response
{
fn
login
(
port
:
u16
,
client
:
&
reqwest
::
Client
,
username
:
&
str
,
password
:
&
str
)
->
reqwest
::
Response
{
let
params
=
[(
"username"
,
username
),
(
"password"
,
password
)];
let
params
=
[(
"username"
,
username
),
(
"password"
,
password
)];
let
resp
=
client
.post
(
&
format!
(
"http://localhost:{}/login"
,
port
))
.form
(
&
params
)
.send
()
.unwrap
();
let
resp
=
client
.post
(
&
format!
(
"http://localhost:{}/login"
,
port
))
.form
(
&
params
)
.send
()
.unwrap
();
resp
resp
}
}
fn
login_code
(
port
:
u16
,
client
:
&
reqwest
::
Client
,
code
:
&
str
)
->
reqwest
::
Response
{
let
params
=
[(
"code"
,
code
)];
let
resp
=
client
.post
(
&
format!
(
"http://localhost:{}/clogin"
,
port
))
.form
(
&
params
)
.send
()
.unwrap
();
resp
}
#[test]
#[test]
fn
start_server_and_check_requests
()
{
fn
start_server_and_check_requests
()
{
start_server_and_fn
(
8080
,
None
,
||
{
start_server_and_fn
(
8080
,
None
,
||
{
let
mut
resp
=
reqwest
::
get
(
"http://localhost:8080"
)
.unwrap
();
let
mut
resp
=
reqwest
::
get
(
"http://localhost:8080"
)
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
let
mut
content
=
String
::
new
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
let
content
=
resp
.text
(
)
.unwrap
();
assert
!
(
content
.contains
(
"Jugendwettbewerb Informatik</h1>"
));
assert
!
(
content
.contains
(
"Jugendwettbewerb Informatik</h1>"
));
assert
!
(
!
content
.contains
(
"Error"
));
assert
!
(
!
content
.contains
(
"Error"
));
assert
!
(
!
content
.contains
(
"Gruppenverwaltung"
));
assert
!
(
!
content
.contains
(
"Gruppenverwaltung"
));
let
mut
resp
=
reqwest
::
get
(
"http://localhost:8080/contest"
)
.unwrap
();
let
mut
resp
=
reqwest
::
get
(
"http://localhost:8080/contest"
)
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
let
mut
content
=
String
::
new
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
let
content
=
resp
.text
(
)
.unwrap
();
assert
!
(
content
.contains
(
"<h1>Wettbewerbe</h1>"
));
assert
!
(
content
.contains
(
"<h1>Wettbewerbe</h1>"
));
assert
!
(
!
content
.contains
(
"Error"
));
assert
!
(
!
content
.contains
(
"Error"
));
let
mut
resp
=
reqwest
::
get
(
"http://localhost:8080/group"
)
.unwrap
();
let
mut
resp
=
reqwest
::
get
(
"http://localhost:8080/group"
)
.unwrap
();
let
mut
content
=
String
::
new
();
let
content
=
resp
.text
()
.unwrap
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
assert
!
(
content
.contains
(
"<h1>Login</h1>"
));
assert
!
(
content
.contains
(
"<h1>Login</h1>"
));
})
})
}
}
...
@@ -316,10 +320,10 @@ mod tests {
...
@@ -316,10 +320,10 @@ mod tests {
fn
check_login_wrong_credentials
()
{
fn
check_login_wrong_credentials
()
{
start_server_and_fn
(
8081
,
None
,
||
{
start_server_and_fn
(
8081
,
None
,
||
{
let
client
=
reqwest
::
Client
::
new
();
let
client
=
reqwest
::
Client
::
new
();
let
mut
resp
=
login
_for_tests
(
8081
,
&
client
,
"nonexistingusername"
,
"wrongpassword"
);
let
mut
resp
=
login
(
8081
,
&
client
,
"nonexistingusername"
,
"wrongpassword"
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
let
mut
content
=
String
::
new
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
let
content
=
resp
.text
(
)
.unwrap
();
assert
!
(
content
.contains
(
"<h1>Login</h1>"
));
assert
!
(
content
.contains
(
"<h1>Login</h1>"
));
assert
!
(
content
.contains
(
"Login fehlgeschlagen."
));
assert
!
(
content
.contains
(
"Login fehlgeschlagen."
));
assert
!
(
!
content
.contains
(
"Error"
));
assert
!
(
!
content
.contains
(
"Error"
));
...
@@ -334,11 +338,10 @@ mod tests {
...
@@ -334,11 +338,10 @@ mod tests {
.build
()
.build
()
.unwrap
();
.unwrap
();
let
mut
resp
=
login
_for_tests
(
8082
,
&
client
,
"testusr"
,
"testpw"
);
let
mut
resp
=
login
(
8082
,
&
client
,
"testusr"
,
"testpw"
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
let
mut
content
=
String
::
new
();
let
content
=
resp
.text
()
.unwrap
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
assert
!
(
!
content
.contains
(
"Error"
));
assert
!
(
!
content
.contains
(
"Error"
));
let
mut
set_cookie
=
resp
.headers
()
.get_all
(
"Set-Cookie"
)
.iter
();
let
mut
set_cookie
=
resp
.headers
()
.get_all
(
"Set-Cookie"
)
.iter
();
...
@@ -348,8 +351,7 @@ mod tests {
...
@@ -348,8 +351,7 @@ mod tests {
let
mut
resp
=
client
.get
(
"http://localhost:8082"
)
.send
()
.unwrap
();
let
mut
resp
=
client
.get
(
"http://localhost:8082"
)
.send
()
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
let
mut
content
=
String
::
new
();
let
content
=
resp
.text
()
.unwrap
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
assert
!
(
!
content
.contains
(
"Error"
));
assert
!
(
!
content
.contains
(
"Error"
));
assert
!
(
!
content
.contains
(
"Gruppenverwaltung"
));
assert
!
(
!
content
.contains
(
"Gruppenverwaltung"
));
assert
!
(
content
.contains
(
"Eingeloggt als <em>testusr</em>"
));
assert
!
(
content
.contains
(
"Eingeloggt als <em>testusr</em>"
));
...
@@ -365,7 +367,7 @@ mod tests {
...
@@ -365,7 +367,7 @@ mod tests {
.build
()
.build
()
.unwrap
();
.unwrap
();
let
resp
=
login
_for_tests
(
8083
,
&
client
,
"testusr"
,
"testpw"
);
let
resp
=
login
(
8083
,
&
client
,
"testusr"
,
"testpw"
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
let
mut
set_cookie
=
resp
.headers
()
.get_all
(
"Set-Cookie"
)
.iter
();
let
mut
set_cookie
=
resp
.headers
()
.get_all
(
"Set-Cookie"
)
.iter
();
...
@@ -377,9 +379,8 @@ mod tests {
...
@@ -377,9 +379,8 @@ mod tests {
let
mut
resp
=
client
.get
(
"http://localhost:8083"
)
.send
()
.unwrap
();
let
mut
resp
=
client
.get
(
"http://localhost:8083"
)
.send
()
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
let
mut
content
=
String
::
new
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
let
content
=
resp
.text
()
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert
!
(
content
.contains
(
"Benutzername"
));
assert
!
(
content
.contains
(
"Benutzername"
));
assert
!
(
content
.contains
(
"Passwort"
));
assert
!
(
content
.contains
(
"Passwort"
));
assert
!
(
content
.contains
(
"Gruppencode / Teilnahmecode"
));
assert
!
(
content
.contains
(
"Gruppencode / Teilnahmecode"
));
...
@@ -395,7 +396,7 @@ mod tests {
...
@@ -395,7 +396,7 @@ mod tests {
.build
()
.build
()
.unwrap
();
.unwrap
();
let
resp
=
login
_for_tests
(
8084
,
&
client
,
"testusr"
,
"testpw"
);
let
resp
=
login
(
8084
,
&
client
,
"testusr"
,
"testpw"
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
let
mut
set_cookie
=
resp
.headers
()
.get_all
(
"Set-Cookie"
)
.iter
();
let
mut
set_cookie
=
resp
.headers
()
.get_all
(
"Set-Cookie"
)
.iter
();
...
@@ -404,27 +405,61 @@ mod tests {
...
@@ -404,27 +405,61 @@ mod tests {
let
mut
resp
=
client
.get
(
"http://localhost:8084"
)
.send
()
.unwrap
();
let
mut
resp
=
client
.get
(
"http://localhost:8084"
)
.send
()
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
let
mut
content
=
String
::
new
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
let
content
=
resp
.text
(
)
.unwrap
();
assert
!
(
content
.contains
(
"[Lehrer]"
));
assert
!
(
content
.contains
(
"[Lehrer]"
));
assert
!
(
content
.contains
(
"Gruppenverwaltung"
));
assert
!
(
content
.contains
(
"Gruppenverwaltung"
));
let
mut
resp
=
client
.get
(
"http://localhost:8084/group/"
)
.send
()
.unwrap
();
let
mut
resp
=
client
.get
(
"http://localhost:8084/group/"
)
.send
()
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
assert_eq!
(
resp
.status
(),
StatusCode
::
OK
);
let
mut
content
=
String
::
new
();
resp
.read_to_string
(
&
mut
content
)
.unwrap
();
let
content
=
resp
.text
(
)
.unwrap
();
assert
!
(
content
.contains
(
"Gruppe anlegen"
));
assert
!
(
content
.contains
(
"Gruppe anlegen"
));
let
params
=
[(
"name"
,
"
g
roupname"
),
(
"tag"
,
"
m
arker"
),
(
"csrf"
,
"76CfTPJaoz"
)];
let
params
=
[(
"name"
,
"
WrongG
roupname"
),
(
"tag"
,
"
WrongM
arker"
),
(
"csrf"
,
"76CfTPJaoz"
)];
let
resp
=
client
.post
(
"http://localhost:8084/group/"
)
.form
(
&
params
)
.send
()
.unwrap
();
let
resp
=
client
.post
(
"http://localhost:8084/group/"
)
.form
(
&
params
)
.send
()
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
FORBIDDEN
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FORBIDDEN
);
let
pos
=
content
.find
(
"type=
\"
hidden
\"
name=
\"
csrf
\"
value=
\"
"
)
.expect
(
"CSRF-Token not found"
);
let
pos
=
content
.find
(
"type=
\"
hidden
\"
name=
\"
csrf
\"
value=
\"
"
)
.expect
(
"CSRF-Token not found"
);
let
csrf
=
&
content
[
pos
+
33
..
pos
+
43
];
let
csrf
=
&
content
[
pos
+
33
..
pos
+
43
];
let
params
=
[(
"name"
,
"Groupname"
),
(
"tag"
,
"Marker"
),
(
"csrf"
,
csrf
)];
let
params
=
[(
"name"
,
"groupname"
),
(
"tag"
,
"marker"
),
(
"csrf"
,
csrf
)];
let
resp
=
client
.post
(
"http://localhost:8084/group/"
)
.form
(
&
params
)
.send
()
.unwrap
();
let
resp
=
client
.post
(
"http://localhost:8084/group/"
)
.form
(
&
params
)
.send
()
.unwrap
();
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
let
mut
resp
=
client
.get
(
"http://localhost:8084/group/"
)
.send
()
.unwrap
();
let
content
=
resp
.text
()
.unwrap
();
assert
!
(
!
content
.contains
(
"WrongGroupname"
));
let
pos
=
content
.find
(
"<td><a href=
\"
/group/1
\"
>Groupname</a></td>"
)
.expect
(
"Group not found"
);
let
groupcode
=
&
content
[
pos
+
58
..
pos
+
65
];
// New client to test group code login
let
client
=
reqwest
::
Client
::
builder
()
.cookie_store
(
true
)
.redirect
(
reqwest
::
RedirectPolicy
::
none
())
.build
()
.unwrap
();
let
resp
=
login_code
(
8084
,
&
client
,
groupcode
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
let
mut
resp
=
client
.get
(
resp
.headers
()
.get
(
reqwest
::
header
::
LOCATION
)
.unwrap
()
.to_str
()
.unwrap
())
.send
()
.unwrap
();
let
content
=
resp
.text
()
.unwrap
();
let
pos
=
content
.find
(
"<p>Login-Code: "
)
.expect
(
"Logincode not found"
);
let
logincode
=
&
content
[
pos
+
15
..
pos
+
24
];
// New client to test login code login
let
client
=
reqwest
::
Client
::
builder
()
.cookie_store
(
true
)
.redirect
(
reqwest
::
RedirectPolicy
::
none
())
.build
()
.unwrap
();
let
resp
=
login_code
(
8084
,
&
client
,
logincode
);
assert_eq!
(
resp
.status
(),
StatusCode
::
FOUND
);
let
mut
resp
=
client
.get
(
resp
.headers
()
.get
(
reqwest
::
header
::
LOCATION
)
.unwrap
()
.to_str
()
.unwrap
())
.send
()
.unwrap
();
let
content
=
resp
.text
()
.unwrap
();
assert
!
(
content
.contains
(
"Eingeloggt als <em></em>"
));
})
})
}
}
}
}
Robert Czechowski
@zgtm
mentioned in issue
#16 (closed)
·
Jan 31, 2020
mentioned in issue
#16 (closed)
mentioned in issue #16
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment