Skip to content

Commit ed4c752

Browse files
authored
complete unit tests (RedisJSON#587)
* complete unit tests * add tests for formatter * format code * run all tests
1 parent 3be1d81 commit ed4c752

File tree

3 files changed

+259
-10
lines changed

3 files changed

+259
-10
lines changed

.circleci/config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ commands:
153153
name: Run all tests
154154
command: |
155155
bash -l -c "python3 -m RLTest --version"
156-
bash -l -c "make pytest"
156+
bash -l -c "make test"
157157
timeout: 30m
158158
no_output_timeout: 30m
159159
- save_cache:

src/error.rs

+22-6
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ impl From<Error> for redis_module::RedisError {
7575

7676
#[cfg(test)]
7777
mod tests {
78-
// Note this useful idiom: importing names from outer (for mod tests) scope.
7978
use super::*;
79+
use serde_json::{Result, Value};
8080

8181
#[test]
8282
fn test_from_string() {
@@ -104,6 +104,12 @@ mod tests {
104104

105105
#[test]
106106
fn test_from_redis_error() {
107+
let err: Error = RedisError::short_read().into();
108+
assert_eq!(err.msg, "ERR ERR short read or OOM loading DB");
109+
}
110+
111+
#[test]
112+
fn test_from_error() {
107113
let err: Error = redis_module::error::Error::generic("error from Generic").into();
108114
assert_eq!(err.msg, "Store error: error from Generic");
109115

@@ -118,11 +124,12 @@ mod tests {
118124
assert_eq!(err.msg, "invalid digit found in string");
119125
}
120126

121-
// #[test]
122-
// fn test_from_serde_json_error() {
123-
// let err : Error = serde_json::Error "error from str".into();
124-
// assert_eq!(err.msg, "error from str");
125-
// }
127+
#[test]
128+
fn test_from_serde_json_error() {
129+
let res: Result<Value> = serde_json::from_str("{");
130+
let err: Error = res.unwrap_err().into();
131+
assert_eq!(err.msg, "EOF while parsing an object at line 1 column 1");
132+
}
126133

127134
#[test]
128135
fn test_from_jsonpath_error() {
@@ -135,4 +142,13 @@ mod tests {
135142
let err: Error = "error from str".into();
136143
assert_eq!(err.msg, "error from str");
137144
}
145+
146+
#[test]
147+
fn test_to_redis_error() {
148+
let err: redis_module::RedisError = Error {
149+
msg: "to RedisError".to_string(),
150+
}
151+
.into();
152+
assert_eq!(err.to_string(), "to RedisError".to_string());
153+
}
138154
}

src/formatter.rs

+236-3
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ impl<'a> RedisJsonFormatter<'a> {
5353
W: io::Write,
5454
{
5555
// Write new line if defined
56-
if let Some(n) = self.newline.as_ref() {
56+
if let Some(n) = self.newline {
5757
wr.write_all(n.as_bytes())?;
5858
}
5959

6060
// Ident the next line if defined
61-
if let Some(s) = self.indent.as_ref() {
61+
if let Some(s) = self.indent {
6262
let bytes = s.as_bytes();
6363
for _ in 0..self.current_indent {
6464
wr.write_all(bytes)?;
@@ -147,7 +147,7 @@ impl Formatter for RedisJsonFormatter<'_> {
147147
W: io::Write,
148148
{
149149
writer.write_all(b":")?;
150-
if let Some(s) = self.space.as_ref() {
150+
if let Some(s) = self.space {
151151
writer.write_all(s.as_bytes())
152152
} else {
153153
Ok(())
@@ -162,3 +162,236 @@ impl Formatter for RedisJsonFormatter<'_> {
162162
Ok(())
163163
}
164164
}
165+
166+
#[cfg(test)]
167+
mod tests {
168+
use super::*;
169+
170+
#[test]
171+
fn test_default_formatter() {
172+
let mut formatter = RedisJsonFormatter::new(None, None, None);
173+
let mut writer = vec![];
174+
175+
assert!(matches!(formatter.begin_array(&mut writer), Ok(())));
176+
assert_eq!(&writer[0..], b"[");
177+
178+
assert!(matches!(
179+
formatter.begin_array_value(&mut writer, true),
180+
Ok(())
181+
));
182+
assert_eq!(&writer[0..], b"[");
183+
184+
assert!(matches!(formatter.begin_object(&mut writer), Ok(())));
185+
assert_eq!(&writer[0..], b"[{");
186+
187+
assert!(matches!(
188+
formatter.begin_object_key(&mut writer, true),
189+
Ok(())
190+
));
191+
assert_eq!(&writer[0..], b"[{");
192+
193+
assert!(matches!(
194+
formatter.begin_object_key(&mut writer, false),
195+
Ok(())
196+
));
197+
assert_eq!(&writer[0..], b"[{,");
198+
199+
assert!(matches!(formatter.begin_object_value(&mut writer), Ok(())));
200+
assert_eq!(&writer[0..], b"[{,:");
201+
202+
assert!(matches!(formatter.end_object_value(&mut writer), Ok(())));
203+
assert_eq!(&writer[0..], b"[{,:");
204+
205+
assert!(matches!(formatter.end_object(&mut writer), Ok(())));
206+
assert_eq!(&writer[0..], b"[{,:}");
207+
208+
assert!(matches!(
209+
formatter.begin_array_value(&mut writer, true),
210+
Ok(())
211+
));
212+
assert_eq!(&writer[0..], b"[{,:}");
213+
214+
assert!(matches!(formatter.end_array_value(&mut writer), Ok(())));
215+
assert_eq!(&writer[0..], b"[{,:}");
216+
217+
assert!(matches!(
218+
formatter.begin_array_value(&mut writer, false),
219+
Ok(())
220+
));
221+
assert_eq!(&writer[0..], b"[{,:},");
222+
223+
assert!(matches!(formatter.end_array(&mut writer), Ok(())));
224+
assert_eq!(&writer[0..], b"[{,:},]");
225+
}
226+
227+
#[test]
228+
fn test_ident_formatter() {
229+
let mut formatter = RedisJsonFormatter::new(Some("_"), None, None);
230+
let mut writer = vec![];
231+
232+
assert!(matches!(formatter.begin_array(&mut writer), Ok(())));
233+
assert_eq!(&writer[0..], b"[");
234+
235+
assert!(matches!(
236+
formatter.begin_array_value(&mut writer, true),
237+
Ok(())
238+
));
239+
assert_eq!(&writer[0..], b"[_");
240+
241+
assert!(matches!(formatter.begin_object(&mut writer), Ok(())));
242+
assert_eq!(&writer[0..], b"[_{");
243+
244+
assert!(matches!(
245+
formatter.begin_object_key(&mut writer, true),
246+
Ok(())
247+
));
248+
assert_eq!(&writer[0..], b"[_{__");
249+
250+
assert!(matches!(
251+
formatter.begin_object_key(&mut writer, false),
252+
Ok(())
253+
));
254+
assert_eq!(&writer[0..], b"[_{__,__");
255+
256+
assert!(matches!(formatter.begin_object_value(&mut writer), Ok(())));
257+
assert_eq!(&writer[0..], b"[_{__,__:");
258+
259+
assert!(matches!(formatter.end_object_value(&mut writer), Ok(())));
260+
assert_eq!(&writer[0..], b"[_{__,__:");
261+
262+
assert!(matches!(formatter.end_object(&mut writer), Ok(())));
263+
assert_eq!(&writer[0..], b"[_{__,__:_}");
264+
265+
assert!(matches!(
266+
formatter.begin_array_value(&mut writer, true),
267+
Ok(())
268+
));
269+
assert_eq!(&writer[0..], b"[_{__,__:_}_");
270+
271+
assert!(matches!(formatter.end_array_value(&mut writer), Ok(())));
272+
assert_eq!(&writer[0..], b"[_{__,__:_}_");
273+
274+
assert!(matches!(
275+
formatter.begin_array_value(&mut writer, false),
276+
Ok(())
277+
));
278+
assert_eq!(&writer[0..], b"[_{__,__:_}_,_");
279+
280+
assert!(matches!(formatter.end_array(&mut writer), Ok(())));
281+
assert_eq!(&writer[0..], b"[_{__,__:_}_,_]");
282+
}
283+
284+
#[test]
285+
fn test_space_formatter() {
286+
let mut formatter = RedisJsonFormatter::new(None, Some("s"), None);
287+
let mut writer = vec![];
288+
289+
assert!(matches!(formatter.begin_array(&mut writer), Ok(())));
290+
assert_eq!(&writer[0..], b"[");
291+
292+
assert!(matches!(
293+
formatter.begin_array_value(&mut writer, true),
294+
Ok(())
295+
));
296+
assert_eq!(&writer[0..], b"[");
297+
298+
assert!(matches!(formatter.begin_object(&mut writer), Ok(())));
299+
assert_eq!(&writer[0..], b"[{");
300+
301+
assert!(matches!(
302+
formatter.begin_object_key(&mut writer, true),
303+
Ok(())
304+
));
305+
assert_eq!(&writer[0..], b"[{");
306+
307+
assert!(matches!(
308+
formatter.begin_object_key(&mut writer, false),
309+
Ok(())
310+
));
311+
assert_eq!(&writer[0..], b"[{,");
312+
313+
assert!(matches!(formatter.begin_object_value(&mut writer), Ok(())));
314+
assert_eq!(&writer[0..], b"[{,:s");
315+
316+
assert!(matches!(formatter.end_object_value(&mut writer), Ok(())));
317+
assert_eq!(&writer[0..], b"[{,:s");
318+
319+
assert!(matches!(formatter.end_object(&mut writer), Ok(())));
320+
assert_eq!(&writer[0..], b"[{,:s}");
321+
322+
assert!(matches!(
323+
formatter.begin_array_value(&mut writer, true),
324+
Ok(())
325+
));
326+
assert_eq!(&writer[0..], b"[{,:s}");
327+
328+
assert!(matches!(formatter.end_array_value(&mut writer), Ok(())));
329+
assert_eq!(&writer[0..], b"[{,:s}");
330+
331+
assert!(matches!(
332+
formatter.begin_array_value(&mut writer, false),
333+
Ok(())
334+
));
335+
assert_eq!(&writer[0..], b"[{,:s},");
336+
337+
assert!(matches!(formatter.end_array(&mut writer), Ok(())));
338+
assert_eq!(&writer[0..], b"[{,:s},]");
339+
}
340+
341+
#[test]
342+
fn test_new_line_formatter() {
343+
let mut formatter = RedisJsonFormatter::new(None, None, Some("n"));
344+
let mut writer = vec![];
345+
346+
assert!(matches!(formatter.begin_array(&mut writer), Ok(())));
347+
assert_eq!(&writer[0..], b"[");
348+
349+
assert!(matches!(
350+
formatter.begin_array_value(&mut writer, true),
351+
Ok(())
352+
));
353+
assert_eq!(&writer[0..], b"[n");
354+
355+
assert!(matches!(formatter.begin_object(&mut writer), Ok(())));
356+
assert_eq!(&writer[0..], b"[n{");
357+
358+
assert!(matches!(
359+
formatter.begin_object_key(&mut writer, true),
360+
Ok(())
361+
));
362+
assert_eq!(&writer[0..], b"[n{n");
363+
364+
assert!(matches!(
365+
formatter.begin_object_key(&mut writer, false),
366+
Ok(())
367+
));
368+
assert_eq!(&writer[0..], b"[n{n,n");
369+
370+
assert!(matches!(formatter.begin_object_value(&mut writer), Ok(())));
371+
assert_eq!(&writer[0..], b"[n{n,n:");
372+
373+
assert!(matches!(formatter.end_object_value(&mut writer), Ok(())));
374+
assert_eq!(&writer[0..], b"[n{n,n:");
375+
376+
assert!(matches!(formatter.end_object(&mut writer), Ok(())));
377+
assert_eq!(&writer[0..], b"[n{n,n:n}");
378+
379+
assert!(matches!(
380+
formatter.begin_array_value(&mut writer, true),
381+
Ok(())
382+
));
383+
assert_eq!(&writer[0..], b"[n{n,n:n}n");
384+
385+
assert!(matches!(formatter.end_array_value(&mut writer), Ok(())));
386+
assert_eq!(&writer[0..], b"[n{n,n:n}n");
387+
388+
assert!(matches!(
389+
formatter.begin_array_value(&mut writer, false),
390+
Ok(())
391+
));
392+
assert_eq!(&writer[0..], b"[n{n,n:n}n,n");
393+
394+
assert!(matches!(formatter.end_array(&mut writer), Ok(())));
395+
assert_eq!(&writer[0..], b"[n{n,n:n}n,nn]");
396+
}
397+
}

0 commit comments

Comments
 (0)