@@ -7,83 +7,118 @@ use async_std::task::{Context, Poll};
7
7
use std:: pin:: Pin ;
8
8
use std:: sync:: Mutex ;
9
9
10
- #[ macro_export]
11
- macro_rules! assert {
12
- ( $actual: expr, $expected_file: expr, $block: expr) => {
13
- task:: block_on( async {
14
- use async_std:: io:: prelude:: * ;
15
- $block. await . unwrap( ) ;
16
- let mut actual = $actual. to_string( ) . await ;
17
- let mut expected = std:: string:: String :: new( ) ;
18
- $expected_file. read_to_string( & mut expected) . await . unwrap( ) ;
19
- match expected. find( "{DATE}" ) {
20
- Some ( i) => {
21
- expected. replace_range( i..i + 6 , "" ) ;
22
- match expected. get( i..i + 1 ) {
23
- Some ( byte) => {
24
- let j = actual[ i..] . find( byte) . expect( "Byte not found" ) ;
25
- actual. replace_range( i..i + j, "" ) ;
26
- }
27
- None => expected. replace_range( i.., "" ) ,
28
- }
29
- }
30
- None => { }
31
- }
32
- pretty_assertions:: assert_eq!( actual, expected) ;
33
- } )
34
- } ;
10
+ #[ derive( Clone ) ]
11
+ pub struct TestCase {
12
+ request_fixture : Arc < File > ,
13
+ response_fixture : Arc < Mutex < File > > ,
14
+ result : Arc < Mutex < File > > ,
35
15
}
36
16
37
- pub async fn read_fixture ( name : & str ) -> TestFile {
38
- let directory: PathBuf = env ! ( "CARGO_MANIFEST_DIR" ) . into ( ) ;
39
- let path: PathBuf = format ! ( "tests/fixtures/{}.txt" , name) . into ( ) ;
40
- let file = File :: open ( directory. join ( path) )
41
- . await
42
- . expect ( "Reading fixture file didn't work" ) ;
43
- let temp = std:: env:: temp_dir ( ) . join ( "foo.txt" ) ;
44
- let temp = OpenOptions :: new ( )
45
- . read ( true )
46
- . write ( true )
47
- . open ( temp)
48
- . await
49
- . unwrap ( ) ;
50
- TestFile ( Arc :: new ( file) , Arc :: new ( Mutex :: new ( temp) ) )
51
- }
17
+ impl TestCase {
18
+ pub async fn new ( request_file_path : & str , response_file_path : & str ) -> TestCase {
19
+ let request_fixture = File :: open ( fixture_path ( & request_file_path) )
20
+ . await
21
+ . expect ( & format ! (
22
+ "Could not open request fixture file: {:?}" ,
23
+ & fixture_path( request_file_path)
24
+ ) ) ;
25
+ let request_fixture = Arc :: new ( request_fixture) ;
52
26
53
- #[ derive( Clone ) ]
54
- pub struct TestFile ( Arc < File > , Arc < Mutex < File > > ) ;
27
+ let response_fixture =
28
+ File :: open ( fixture_path ( & response_file_path) )
29
+ . await
30
+ . expect ( & format ! (
31
+ "Could not open response fixture file: {:?}" ,
32
+ & fixture_path( response_file_path)
33
+ ) ) ;
34
+ let response_fixture = Arc :: new ( Mutex :: new ( response_fixture) ) ;
35
+
36
+ let temp = std:: env:: temp_dir ( ) . join ( "result.txt" ) ;
37
+ let temp = OpenOptions :: new ( )
38
+ . read ( true )
39
+ . write ( true )
40
+ . create ( true )
41
+ . open ( temp)
42
+ . await
43
+ . expect ( "Could not read temporary file where response will be written to" ) ;
44
+ let result = Arc :: new ( Mutex :: new ( temp) ) ;
45
+
46
+ TestCase {
47
+ request_fixture,
48
+ response_fixture,
49
+ result,
50
+ }
51
+ }
55
52
56
- impl TestFile {
57
- pub async fn to_string ( self ) -> String {
53
+ pub async fn read_result ( & self ) -> String {
58
54
use async_std:: prelude:: * ;
59
- let mut buf = String :: new ( ) ;
60
- let mut file = self . 1 . lock ( ) . unwrap ( ) ;
55
+ let mut result = String :: new ( ) ;
56
+ let mut file = self . result . lock ( ) . unwrap ( ) ;
61
57
file. seek ( SeekFrom :: Start ( 0 ) ) . await . unwrap ( ) ;
62
- dbg ! ( file. read_to_string( & mut buf ) . await . unwrap( ) ) ;
63
- buf
58
+ file. read_to_string ( & mut result ) . await . unwrap ( ) ;
59
+ result
64
60
}
61
+
62
+ pub async fn read_expected ( & self ) -> String {
63
+ use async_std:: prelude:: * ;
64
+ let mut expected = std:: string:: String :: new ( ) ;
65
+ self . response_fixture
66
+ . lock ( )
67
+ . unwrap ( )
68
+ . read_to_string ( & mut expected)
69
+ . await
70
+ . unwrap ( ) ;
71
+ expected
72
+ }
73
+
74
+ pub async fn assert ( self ) {
75
+ let mut actual = self . read_result ( ) . await ;
76
+ let mut expected = self . read_expected ( ) . await ;
77
+
78
+ // munge actual and expected so that we don't rely on dates matching exactly
79
+ match expected. find ( "{DATE}" ) {
80
+ Some ( i) => {
81
+ expected. replace_range ( i..i + 6 , "" ) ;
82
+ match expected. get ( i..i + 1 ) {
83
+ Some ( byte) => {
84
+ let j = actual[ i..] . find ( byte) . expect ( "Byte not found" ) ;
85
+ actual. replace_range ( i..i + j, "" ) ;
86
+ }
87
+ None => expected. replace_range ( i.., "" ) ,
88
+ }
89
+ }
90
+ None => { }
91
+ }
92
+
93
+ pretty_assertions:: assert_eq!( actual, expected) ;
94
+ }
95
+ }
96
+
97
+ fn fixture_path ( relative_path : & str ) -> PathBuf {
98
+ let directory: PathBuf = env ! ( "CARGO_MANIFEST_DIR" ) . into ( ) ;
99
+ directory. join ( "tests" ) . join ( relative_path)
65
100
}
66
101
67
- impl Read for TestFile {
102
+ impl Read for TestCase {
68
103
fn poll_read (
69
104
self : Pin < & mut Self > ,
70
105
cx : & mut Context ,
71
106
buf : & mut [ u8 ] ,
72
107
) -> Poll < io:: Result < usize > > {
73
- Pin :: new ( & mut & * self . 0 ) . poll_read ( cx, buf)
108
+ Pin :: new ( & mut & * self . request_fixture ) . poll_read ( cx, buf)
74
109
}
75
110
}
76
111
77
- impl Write for TestFile {
112
+ impl Write for TestCase {
78
113
fn poll_write ( self : Pin < & mut Self > , cx : & mut Context , buf : & [ u8 ] ) -> Poll < io:: Result < usize > > {
79
- Pin :: new ( & mut & * self . 1 . lock ( ) . unwrap ( ) ) . poll_write ( cx, buf)
114
+ Pin :: new ( & mut & * self . result . lock ( ) . unwrap ( ) ) . poll_write ( cx, buf)
80
115
}
81
116
82
117
fn poll_flush ( self : Pin < & mut Self > , cx : & mut Context ) -> Poll < io:: Result < ( ) > > {
83
- Pin :: new ( & mut & * self . 1 . lock ( ) . unwrap ( ) ) . poll_flush ( cx)
118
+ Pin :: new ( & mut & * self . result . lock ( ) . unwrap ( ) ) . poll_flush ( cx)
84
119
}
85
120
86
121
fn poll_close ( self : Pin < & mut Self > , cx : & mut Context ) -> Poll < io:: Result < ( ) > > {
87
- Pin :: new ( & mut & * self . 1 . lock ( ) . unwrap ( ) ) . poll_close ( cx)
122
+ Pin :: new ( & mut & * self . result . lock ( ) . unwrap ( ) ) . poll_close ( cx)
88
123
}
89
124
}
0 commit comments