Skip to content

Commit f637fed

Browse files
authored
Merge pull request #79 from ArkhamCookie/diff-test
diff rendering tests
2 parents 4a1878e + 0cce4e1 commit f637fed

File tree

10 files changed

+1033
-0
lines changed

10 files changed

+1033
-0
lines changed

.editorconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ indent_size = 2
1313

1414
[*.{md,nix,py,sh,yml,yaml}]
1515
indent_style = space
16+
17+
[tests/data/*.html]
18+
indent_style = space

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ toml = "0.9.10"
2121

2222
[dev-dependencies]
2323
assert_cmd = "2.1.1"
24+
diff = "0.1.13"
2425

2526
[[bin]]
2627
name = "rustypage"

docs/config/examples/default.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
title = "RustyPage"
2+
3+
[[bookmarks]]
4+
link = "https://github.com"
5+
name = "GitHub"
6+
shortcut = "g"
7+
8+
[[bookmarks]]
9+
link = "https://arkhamcookie.com"
10+
name = "ArkhamCookie"

src/templates.rs

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,145 @@ impl Homepage {
9393
template.render()
9494
}
9595
}
96+
97+
#[cfg(test)]
98+
mod tests {
99+
use crate::config::Config;
100+
use crate::templates::Homepage;
101+
102+
use std::fs::{self, File};
103+
use std::io::Read;
104+
use std::path::PathBuf;
105+
106+
use diff;
107+
108+
/// Check the difference between 2 strings
109+
fn check_difference(left: String, right: String) -> bool {
110+
let mut not_different = true;
111+
112+
for difference in diff::lines(&left, &right) {
113+
match difference {
114+
diff::Result::Left(left) => {
115+
not_different = false;
116+
println!("l-{}", left);
117+
},
118+
diff::Result::Right(right) => {
119+
not_different = false;
120+
println!("r-{}", right);
121+
},
122+
_ => (),
123+
}
124+
}
125+
126+
return not_different;
127+
}
128+
129+
// TODO: Handle error `toml::from_str()`/Result error better
130+
/// Get config from a given file
131+
fn get_config_from_file(config_file: &PathBuf) -> Result<Config, ()> {
132+
let toml_string = fs::read_to_string(&config_file).expect("error getting config file string");
133+
134+
match toml::from_str(&toml_string) {
135+
Ok(config) => Ok(config),
136+
Err(error) => {
137+
eprintln!("ERROR: {}", error);
138+
Err(())
139+
},
140+
}
141+
}
142+
143+
#[test]
144+
/// Test rendering the bookmarks only config file
145+
fn bookmarks_only_diff_test() {
146+
let config_file_path: PathBuf = "./docs/config/examples/bookmarks-only.toml".into();
147+
let config = get_config_from_file(&config_file_path);
148+
149+
let homepage = Homepage::new(&config.expect("error getting config file"));
150+
151+
let mut rendered = Homepage::render(&homepage).expect("error rendering homepage");
152+
153+
let mut wanted = File::open("./tests/data/bookmarks-only.html").expect("error getting test file");
154+
let mut contents = String::new();
155+
let _ = wanted.read_to_string(&mut contents);
156+
157+
let not_different = check_difference(rendered, contents);
158+
159+
assert!(not_different)
160+
}
161+
162+
#[test]
163+
/// Test rendering the clock only config file
164+
fn clock_only_diff_test() {
165+
let config_file_path: PathBuf = "./docs/config/examples/clock-only.toml".into();
166+
let config = get_config_from_file(&config_file_path);
167+
168+
let homepage = Homepage::new(&config.expect("error getting config file"));
169+
170+
let mut rendered = Homepage::render(&homepage).expect("error rendering homepage");
171+
172+
let mut wanted = File::open("./tests/data/clock-only.html").expect("error getting test file");
173+
let mut contents = String::new();
174+
let _ = wanted.read_to_string(&mut contents);
175+
176+
let not_different = check_difference(rendered, contents);
177+
178+
assert!(not_different)
179+
}
180+
181+
#[test]
182+
/// Test rendering the default config file
183+
fn default_config_diff_test() {
184+
let config_file_path: PathBuf = "./docs/config/examples/default.toml".into();
185+
let config = get_config_from_file(&config_file_path);
186+
187+
let homepage = Homepage::new(&config.expect("error getting config file"));
188+
189+
let mut rendered = Homepage::render(&homepage).expect("error rendering homepage");
190+
191+
let mut wanted = File::open("./tests/data/default.html").expect("error getting test file");
192+
let mut contents = String::new();
193+
let _ = wanted.read_to_string(&mut contents);
194+
195+
let not_different = check_difference(rendered, contents);
196+
197+
assert!(not_different)
198+
}
199+
200+
#[test]
201+
/// Test rendering the "full" config file
202+
fn full_config_diff_test() {
203+
let config_file_path: PathBuf = "./docs/config/examples/full.toml".into();
204+
let config = get_config_from_file(&config_file_path);
205+
206+
let homepage = Homepage::new(&config.expect("error getting config file"));
207+
208+
let mut rendered = Homepage::render(&homepage).expect("error rendering homepage");
209+
210+
let mut wanted = File::open("./tests/data/full.html").expect("error getting test file");
211+
let mut contents = String::new();
212+
let _ = wanted.read_to_string(&mut contents);
213+
214+
let not_different = check_difference(rendered, contents);
215+
216+
assert!(not_different)
217+
}
218+
219+
#[test]
220+
/// Test rendering the search only config file
221+
fn search_only_config_diff_test() {
222+
let config_file_path: PathBuf = "./docs/config/examples/search-only.toml".into();
223+
let config = get_config_from_file(&config_file_path);
224+
225+
let homepage = Homepage::new(&config.expect("error getting config file"));
226+
227+
let mut rendered = Homepage::render(&homepage).expect("error rendering homepage");
228+
229+
let mut wanted = File::open("./tests/data/search-only.html").expect("error getting test file");
230+
let mut contents = String::new();
231+
let _ = wanted.read_to_string(&mut contents);
232+
233+
let not_different = check_difference(rendered, contents);
234+
235+
assert!(not_different)
236+
}
237+
}

tests/data/bookmarks-only.html

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8">
6+
<meta name="viewport" content="width=device-width, inital-scale=1">
7+
8+
<title>
9+
10+
Homepage
11+
12+
</title>
13+
14+
15+
<link
16+
href="data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADxxwAA8ccAAPHHAADwBwAA8AcAAOADAADwBwAA+A8AAPwfAAD+PwAA/38AAP//AAD//wAA"
17+
rel="icon" type="image/x-icon">
18+
19+
20+
<style>
21+
:root {
22+
--background: #FFFFFF;
23+
--text: #000000;
24+
--link: #0000EE;
25+
--surface-zero: #FFFFFF;
26+
--border: #000000;
27+
}
28+
</style>
29+
30+
<style>
31+
/** Styling */
32+
#clock {
33+
font-size: 40px;
34+
}
35+
36+
#search-btn,
37+
#search-input {
38+
border: 3px;
39+
border-style: solid;
40+
}
41+
42+
#search-btn {
43+
border-radius: 0 5px 5px 0;
44+
cursor: pointer;
45+
}
46+
47+
#search-input {
48+
outline: none;
49+
border-right: none;
50+
border-radius: 5px 0 0 5px;
51+
}
52+
53+
/** Positioning */
54+
body {
55+
display: flex;
56+
flex-direction: column;
57+
align-items: center;
58+
justify-content: center;
59+
height: 100vh;
60+
}
61+
62+
footer {
63+
position: fixed;
64+
bottom: 0;
65+
width: 100%;
66+
text-align: center;
67+
}
68+
69+
#clock {
70+
padding: 10px;
71+
}
72+
73+
#search-bar {
74+
margin-bottom: 3vh;
75+
}
76+
77+
#search-btn {
78+
width: 40px;
79+
height: 36px;
80+
vertical-align: -7px;
81+
}
82+
83+
#search-input {
84+
padding: 5px;
85+
height: 20px;
86+
width: 30vw;
87+
}
88+
89+
/** Coloring */
90+
body {
91+
background: var(--background);
92+
color: var(--text);
93+
}
94+
95+
a {
96+
color: var(--link);
97+
}
98+
99+
#search-btn {
100+
background-color: var(--border);
101+
}
102+
#search-btn > i > svg {
103+
stroke: var(--surface-zero);
104+
}
105+
106+
#search-input {
107+
background-color: var(--surface-zero);
108+
color: var(--text);
109+
}
110+
111+
#search-input,
112+
#search-btn {
113+
border-color: var(--border);
114+
}
115+
</style>
116+
</head>
117+
118+
<body>
119+
120+
121+
122+
123+
124+
<section id=bookmarks-section>
125+
126+
<div class="bookmark" id="bookmark-0">
127+
<a href="https://arkhamcookie.com">ArkhamCookie</a>
128+
</div>
129+
130+
131+
132+
</section>
133+
134+
135+
136+
<footer>
137+
<p><small>Made with <a href="https://github.com/ArkhamCookie/RustyPage">RustyPage</a>.</small></p>
138+
</footer>
139+
140+
</body>
141+
142+
</html>

0 commit comments

Comments
 (0)