tests(integration): add tests for push and query
This commit is contained in:
parent
7bf0ab43a2
commit
4d2d493a87
5 changed files with 174 additions and 0 deletions
13
docker-compose.test.yml
Normal file
13
docker-compose.test.yml
Normal file
|
@ -0,0 +1,13 @@
|
|||
version: '3'
|
||||
|
||||
services:
|
||||
sonic:
|
||||
image: valeriansaliou/sonic:v1.3.0
|
||||
ports:
|
||||
- 36999:1491
|
||||
volumes:
|
||||
- sonic_data:/var/lib/sonic/store/
|
||||
- ./sonic.cfg:/etc/sonic.cfg
|
||||
|
||||
volumes:
|
||||
sonic_data:
|
66
sonic.cfg
Normal file
66
sonic.cfg
Normal file
|
@ -0,0 +1,66 @@
|
|||
# Sonic
|
||||
# Fast, lightweight and schema-less search backend
|
||||
# Configuration file
|
||||
# Example: https://github.com/valeriansaliou/sonic/blob/master/config.cfg
|
||||
|
||||
|
||||
[server]
|
||||
|
||||
log_level = "error"
|
||||
|
||||
|
||||
[channel]
|
||||
|
||||
inet = "0.0.0.0:1491"
|
||||
tcp_timeout = 300
|
||||
|
||||
auth_password = "SecretPassword1234"
|
||||
|
||||
[channel.search]
|
||||
|
||||
query_limit_default = 10
|
||||
query_limit_maximum = 100
|
||||
query_alternates_try = 4
|
||||
|
||||
suggest_limit_default = 5
|
||||
suggest_limit_maximum = 20
|
||||
|
||||
|
||||
[store]
|
||||
|
||||
[store.kv]
|
||||
|
||||
path = "/var/lib/sonic/store/kv/"
|
||||
|
||||
retain_word_objects = 1000
|
||||
|
||||
[store.kv.pool]
|
||||
|
||||
inactive_after = 1800
|
||||
|
||||
[store.kv.database]
|
||||
|
||||
flush_after = 900
|
||||
|
||||
compress = true
|
||||
parallelism = 2
|
||||
max_files = 100
|
||||
max_compactions = 1
|
||||
max_flushes = 1
|
||||
write_buffer = 16384
|
||||
write_ahead_log = true
|
||||
|
||||
[store.fst]
|
||||
|
||||
path = "/var/lib/sonic/store/fst/"
|
||||
|
||||
[store.fst.pool]
|
||||
|
||||
inactive_after = 300
|
||||
|
||||
[store.fst.graph]
|
||||
|
||||
consolidate_after = 180
|
||||
|
||||
max_size = 2048
|
||||
max_words = 250000
|
18
tests/common.rs
Normal file
18
tests/common.rs
Normal file
|
@ -0,0 +1,18 @@
|
|||
#![allow(dead_code)]
|
||||
|
||||
pub use sonic_channel::*;
|
||||
|
||||
pub const HOST: &str = "localhost:36999";
|
||||
pub const PASS: &str = "SecretPassword1234";
|
||||
|
||||
pub fn ingest_start() -> IngestChannel {
|
||||
IngestChannel::start(HOST, PASS).expect("The Sonic server must be running")
|
||||
}
|
||||
|
||||
pub fn search_start() -> SearchChannel {
|
||||
SearchChannel::start(HOST, PASS).expect("The Sonic server must be running")
|
||||
}
|
||||
|
||||
pub fn flush_collection(collection: &str) {
|
||||
ingest_start().flushc(collection).unwrap();
|
||||
}
|
17
tests/push_command.rs
Normal file
17
tests/push_command.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
mod common;
|
||||
use common::*;
|
||||
|
||||
const COLLECTION: &str = "Ingest";
|
||||
const BUCKET: &str = "Push";
|
||||
|
||||
#[test]
|
||||
fn should_push_new_object_to_sonic() {
|
||||
let ingest_channel = ingest_start();
|
||||
|
||||
match ingest_channel.push(COLLECTION, BUCKET, "1", "Sweet Teriyaki Beef Skewers") {
|
||||
Ok(res) => assert!(res),
|
||||
Err(_) => unreachable!(),
|
||||
}
|
||||
|
||||
flush_collection(COLLECTION);
|
||||
}
|
60
tests/query_command.rs
Normal file
60
tests/query_command.rs
Normal file
|
@ -0,0 +1,60 @@
|
|||
mod common;
|
||||
use common::*;
|
||||
|
||||
const COLLECTION: &str = "Search";
|
||||
const BUCKET: &str = "Query";
|
||||
|
||||
#[test]
|
||||
fn should_find_object_by_full_text() {
|
||||
let title = "Sweet Teriyaki Beef Skewers";
|
||||
|
||||
let ingest_channel = ingest_start();
|
||||
ingest_channel.push(COLLECTION, BUCKET, "1", title).unwrap();
|
||||
|
||||
let search_channel = search_start();
|
||||
match search_channel.query(COLLECTION, BUCKET, title) {
|
||||
Ok(object_ids) => assert_eq!(object_ids, vec!["1"]),
|
||||
Err(_) => unreachable!(),
|
||||
}
|
||||
|
||||
flush_collection(COLLECTION);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_find_object_by_parts() {
|
||||
let title = "Sweet Teriyaki Beef Skewers";
|
||||
|
||||
let ingest_channel = ingest_start();
|
||||
ingest_channel.push(COLLECTION, BUCKET, "1", title).unwrap();
|
||||
|
||||
let search_channel = search_start();
|
||||
|
||||
for word in title.split_whitespace() {
|
||||
match search_channel.query(COLLECTION, BUCKET, word) {
|
||||
Ok(object_ids) => assert_eq!(object_ids, vec!["1"]),
|
||||
Err(_) => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
flush_collection(COLLECTION);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_find_many_objects() {
|
||||
let ingest_channel = ingest_start();
|
||||
ingest_channel
|
||||
.push(COLLECTION, BUCKET, "1", "Sweet Teriyaki Beef Skewers")
|
||||
.unwrap();
|
||||
ingest_channel
|
||||
.push(COLLECTION, BUCKET, "2", "Slow Cooker Beef Stew I")
|
||||
.unwrap();
|
||||
ingest_channel
|
||||
.push(COLLECTION, BUCKET, "3", "Christmas Prime Rib")
|
||||
.unwrap();
|
||||
|
||||
let search_channel = search_start();
|
||||
match search_channel.query(COLLECTION, BUCKET, "Beef") {
|
||||
Ok(object_ids) => assert_eq!(object_ids, vec!["2", "1"]),
|
||||
Err(_) => unreachable!(),
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue