assemblyline_models/datastore/
mod.rs1
2pub mod submission;
3pub mod error;
4pub mod alert;
5pub mod workflow;
6pub mod result;
7pub mod tagging;
8pub mod file;
9pub mod service;
10pub mod service_delta;
11pub mod retrohunt;
12pub mod user;
13pub mod filescore;
14pub mod emptyresult;
15pub mod badlist;
16pub mod heuristic;
17pub mod safelist;
18pub mod apikey;
19
20pub use submission::Submission;
21pub use error::Error;
22pub use alert::Alert;
23pub use workflow::Workflow;
24pub use result::Result;
25pub use tagging::Tagging;
26pub use file::File;
27pub use service::Service;
28pub use service_delta::ServiceDelta;
29pub use retrohunt::{Retrohunt, RetrohuntHit};
30pub use emptyresult::EmptyResult;
31
32
33#[cfg(test)]
77mod python {
78
79 use serde_json::json;
80
81 use super::{RetrohuntHit, File};
82 use crate::datastore::badlist::Badlist;
83 use crate::datastore::safelist::Safelist;
84 use crate::datastore::user::User;
85 use crate::datastore::{Retrohunt, Service, ServiceDelta, Tagging, Workflow};
86 use crate::datastore::{Alert, EmptyResult, Error, Result, Submission, filescore::FileScore, heuristic::Heuristic};
87 use crate::meta::Mappings;
88
89 use crate::meta::build_mapping;
90 use pretty_assertions::assert_eq;
91
92 fn load_mapping(module: &str, name: &str) -> Mappings {
93 let output = std::process::Command::new("python").arg("-c").arg("from assemblyline.datastore.support.build import build_mapping; from assemblyline.odm.models. ".to_owned() + module + " import " + name + "; import json; print(json.dumps(build_mapping(" + name + ".fields().values())))").output().unwrap();
94 let stderr = String::from_utf8(output.stderr).unwrap();
95 let stdout = String::from_utf8(output.stdout).unwrap();
96 if !output.status.success() || !stderr.is_empty() {
97 println!("{stderr}");
98 panic!();
99 }
100
101 let (properties, dynamic_templates): (serde_json::Value, serde_json::Value) = serde_json::from_str(&stdout).unwrap();
102 let py_mapping = json!({
103 "dynamic": true,
104 "properties": properties,
105 "dynamic_templates": dynamic_templates,
106 });
107 serde_json::from_value(py_mapping).unwrap()
108 }
109
110 #[test]
111 fn alert_schema() {
112 let py_mappings = load_mapping("alert", "Alert");
113 let mapping = build_mapping::<Alert>().unwrap();
114 assert_eq!(mapping, py_mappings);
115 }
116
117
118 #[test]
119 fn badlist_schema() {
120 let py_mappings = load_mapping("badlist", "Badlist");
121 let mapping = build_mapping::<Badlist>().unwrap();
123 assert_eq!(mapping, py_mappings);
124 }
125
126 #[test]
127 fn emptyresult_schema() {
128 let py_mappings = load_mapping("emptyresult", "EmptyResult");
129 let mapping = build_mapping::<EmptyResult>().unwrap();
130 assert_eq!(mapping, py_mappings);
131 }
132
133 #[test]
134 fn error_schema() {
135 let py_mappings = load_mapping("error", "Error");
136 let mapping = build_mapping::<Error>().unwrap();
137 assert_eq!(mapping, py_mappings);
138 }
139
140 #[test]
141 fn file_schema() {
142 let py_mappings = load_mapping("file", "File");
143 let mapping = build_mapping::<File>().unwrap();
144 assert_eq!(mapping, py_mappings);
145 }
146
147 #[test]
148 fn filescore_schema() {
149 let py_mappings = load_mapping("filescore", "FileScore");
150 let mapping = build_mapping::<FileScore>().unwrap();
151 assert_eq!(mapping, py_mappings);
152 }
153
154 #[test]
155 fn heuristic_schema() {
156 let py_mappings = load_mapping("heuristic", "Heuristic");
157 let mapping = build_mapping::<Heuristic>().unwrap();
158 assert_eq!(mapping, py_mappings);
159 }
160
161 #[test]
162 fn result_schema() {
163 let py_mappings = load_mapping("result", "Result");
164 let mapping = build_mapping::<Result>().unwrap();
165 assert_eq!(mapping, py_mappings);
166 }
167
168 #[test]
169 fn retrohunt_schema() {
170 let py_mappings = load_mapping("retrohunt", "Retrohunt");
171 let mapping = build_mapping::<Retrohunt>().unwrap();
172 assert_eq!(mapping, py_mappings);
173 }
174
175 #[test]
176 fn retrohunt_hits_schema() {
177 let py_mappings = load_mapping("retrohunt", "RetrohuntHit");
178 let mapping = build_mapping::<RetrohuntHit>().unwrap();
179 assert_eq!(mapping, py_mappings);
180 }
181
182 #[test]
183 fn safelist_schema() {
184 let py_mappings = load_mapping("safelist", "Safelist");
185 let mapping = build_mapping::<Safelist>().unwrap();
186 assert_eq!(mapping, py_mappings);
187 }
188
189 #[test]
190 fn service_delta_schema() {
191 let py_mappings = load_mapping("service_delta", "ServiceDelta");
192 let mapping = build_mapping::<ServiceDelta>().unwrap();
193 assert_eq!(mapping, py_mappings);
194 }
195
196 #[test]
197 fn service_schema() {
198 let py_mappings = load_mapping("service", "Service");
199 let mapping = build_mapping::<Service>().unwrap();
200 assert_eq!(mapping, py_mappings);
201 }
202
203 #[test]
204 fn submission_schema() {
205 let mut py_mappings = load_mapping("submission", "Submission");
206 py_mappings.properties.remove("params.ignore_dynamic_recursion_prevention");
207 let mapping = build_mapping::<Submission>().unwrap();
208 assert_eq!(mapping, py_mappings);
209 }
210
211 #[test]
212 fn tagging_schema() {
213 let py_mappings = load_mapping("tagging", "Tagging");
214 let mapping = build_mapping::<Tagging>().unwrap();
215 assert_eq!(mapping, py_mappings);
216 }
217
218 #[test]
219 fn user_schema() {
220 let py_mappings = load_mapping("user", "User");
221 let mapping = build_mapping::<User>().unwrap();
223 assert_eq!(mapping, py_mappings);
224 }
225
226 #[test]
227 fn workflow_schema() {
228 let py_mappings = load_mapping("workflow", "Workflow");
229 let mapping = build_mapping::<Workflow>().unwrap();
231 assert_eq!(mapping, py_mappings);
232 }
233
234}