1#[derive(Debug, Clone, PartialEq, Eq)]
16pub struct DataModel {
17 pub name: String,
19 pub iri: String,
21 pub label: Option<String>,
23 pub last_modified: Option<String>,
26 pub is_builtin: bool,
29}
30
31#[derive(Debug, Clone, PartialEq, Eq)]
42pub struct ResourceTypeSummary {
43 pub name: String,
45 pub iri: String,
48 pub label: Option<String>,
50}
51
52#[derive(Debug, Clone, PartialEq, Eq)]
64pub struct ResourceType {
65 pub name: String,
67 pub iri: String,
71 pub label: Option<String>,
74 pub is_builtin: bool,
77 pub count: Option<u64>,
82}
83
84#[derive(Debug, Clone, PartialEq, Eq)]
92pub struct DataModelDetail {
93 pub name: String,
95 pub iri: String,
97 pub label: Option<String>,
99 pub last_modified: Option<String>,
101 pub resource_types: Vec<ResourceTypeSummary>,
103}
104
105#[cfg(test)]
106mod tests {
107 use super::*;
108
109 #[test]
110 fn data_model_full_construction_and_equality() {
111 let dm = DataModel {
112 name: "beol".into(),
113 iri: "http://api.dasch.swiss/ontology/0801/beol/v2".into(),
114 label: Some("The BEOL data-model".into()),
115 last_modified: Some("2024-05-27T13:43:26.233048Z".into()),
116 is_builtin: false,
117 };
118 let cloned = dm.clone();
119 assert_eq!(dm, cloned);
120 assert_eq!(dm.name, "beol");
121 assert_eq!(dm.iri, "http://api.dasch.swiss/ontology/0801/beol/v2");
122 assert_eq!(dm.label.as_deref(), Some("The BEOL data-model"));
123 assert_eq!(
124 dm.last_modified.as_deref(),
125 Some("2024-05-27T13:43:26.233048Z")
126 );
127 assert!(!dm.is_builtin);
128 }
129
130 #[test]
131 fn data_model_all_none_builtin() {
132 let dm = DataModel {
133 name: "knora-api".into(),
134 iri: "http://api.knora.org/ontology/knora-api/v2".into(),
135 label: None,
136 last_modified: None,
137 is_builtin: true,
138 };
139 let cloned = dm.clone();
140 assert_eq!(dm, cloned);
141 assert_eq!(dm.name, "knora-api");
142 assert_eq!(dm.iri, "http://api.knora.org/ontology/knora-api/v2");
143 assert_eq!(dm.label, None);
144 assert_eq!(dm.last_modified, None);
145 assert!(dm.is_builtin);
146 }
147
148 #[test]
149 fn data_model_label_some_last_modified_none() {
150 let dm = DataModel {
151 name: "limc".into(),
152 iri: "http://api.dasch.swiss/ontology/0603/limc/v2".into(),
153 label: Some("LIMC data-model".into()),
154 last_modified: None,
155 is_builtin: false,
156 };
157 let cloned = dm.clone();
158 assert_eq!(dm, cloned);
159 assert_eq!(dm.label.as_deref(), Some("LIMC data-model"));
160 assert_eq!(dm.last_modified, None);
161 assert!(!dm.is_builtin);
162 }
163
164 #[test]
167 fn resource_type_with_label_not_builtin() {
168 let rt = ResourceType {
169 name: "letter".into(),
170 iri: "http://api.dasch.swiss/ontology/0801/beol/v2#letter".into(),
171 label: Some("Letter".into()),
172 is_builtin: false,
173 count: None,
174 };
175 let cloned = rt.clone();
176 assert_eq!(rt, cloned);
177 assert_eq!(rt.name, "letter");
178 assert_eq!(
179 rt.iri,
180 "http://api.dasch.swiss/ontology/0801/beol/v2#letter"
181 );
182 assert_eq!(rt.label.as_deref(), Some("Letter"));
183 assert!(!rt.is_builtin);
184 }
185
186 #[test]
187 fn resource_type_label_none_not_builtin() {
188 let rt = ResourceType {
189 name: "Archive".into(),
190 iri: "http://api.dasch.swiss/ontology/0801/beol/v2#Archive".into(),
191 label: None,
192 is_builtin: false,
193 count: None,
194 };
195 let cloned = rt.clone();
196 assert_eq!(rt, cloned);
197 assert_eq!(rt.name, "Archive");
198 assert_eq!(rt.label, None);
199 assert!(!rt.is_builtin);
200 }
201
202 #[test]
203 fn resource_type_with_label_builtin() {
204 let rt = ResourceType {
205 name: "Region".into(),
206 iri: "http://api.knora.org/ontology/knora-api/v2#Region".into(),
207 label: Some("Region".into()),
208 is_builtin: true,
209 count: None,
210 };
211 let cloned = rt.clone();
212 assert_eq!(rt, cloned);
213 assert_eq!(rt.name, "Region");
214 assert_eq!(rt.iri, "http://api.knora.org/ontology/knora-api/v2#Region");
215 assert_eq!(rt.label.as_deref(), Some("Region"));
216 assert!(rt.is_builtin);
217 }
218
219 #[test]
220 fn resource_type_label_none_builtin() {
221 let rt = ResourceType {
224 name: "LinkObj".into(),
225 iri: "http://api.knora.org/ontology/knora-api/v2#LinkObj".into(),
226 label: None,
227 is_builtin: true,
228 count: None,
229 };
230 let cloned = rt.clone();
231 assert_eq!(rt, cloned);
232 assert_eq!(rt.name, "LinkObj");
233 assert_eq!(rt.label, None);
234 assert!(rt.is_builtin);
235 }
236
237 #[test]
240 fn resource_type_summary_with_label() {
241 let rt = ResourceTypeSummary {
242 name: "letter".into(),
243 iri: "http://api.dasch.swiss/ontology/0801/beol/v2#letter".into(),
244 label: Some("Letter".into()),
245 };
246 let cloned = rt.clone();
247 assert_eq!(rt, cloned);
248 assert_eq!(rt.name, "letter");
249 assert_eq!(
250 rt.iri,
251 "http://api.dasch.swiss/ontology/0801/beol/v2#letter"
252 );
253 assert_eq!(rt.label.as_deref(), Some("Letter"));
254 }
255
256 #[test]
257 fn resource_type_summary_without_label() {
258 let rt = ResourceTypeSummary {
259 name: "Archive".into(),
260 iri: "http://api.dasch.swiss/ontology/0801/beol/v2#Archive".into(),
261 label: None,
262 };
263 let cloned = rt.clone();
264 assert_eq!(rt, cloned);
265 assert_eq!(rt.name, "Archive");
266 assert_eq!(
267 rt.iri,
268 "http://api.dasch.swiss/ontology/0801/beol/v2#Archive"
269 );
270 assert_eq!(rt.label, None);
271 }
272
273 #[test]
276 fn data_model_detail_full_construction_and_equality() {
277 let detail = DataModelDetail {
278 name: "beol".into(),
279 iri: "http://api.dasch.swiss/ontology/0801/beol/v2".into(),
280 label: Some("The BEOL data-model".into()),
281 last_modified: Some("2024-05-27T13:43:26.233048Z".into()),
282 resource_types: vec![
283 ResourceTypeSummary {
284 name: "Archive".into(),
285 iri: "http://api.dasch.swiss/ontology/0801/beol/v2#Archive".into(),
286 label: Some("Archive".into()),
287 },
288 ResourceTypeSummary {
289 name: "letter".into(),
290 iri: "http://api.dasch.swiss/ontology/0801/beol/v2#letter".into(),
291 label: Some("Letter".into()),
292 },
293 ],
294 };
295 let cloned = detail.clone();
296 assert_eq!(detail, cloned);
297 assert_eq!(detail.name, "beol");
298 assert_eq!(detail.iri, "http://api.dasch.swiss/ontology/0801/beol/v2");
299 assert_eq!(detail.label.as_deref(), Some("The BEOL data-model"));
300 assert_eq!(
301 detail.last_modified.as_deref(),
302 Some("2024-05-27T13:43:26.233048Z")
303 );
304 assert_eq!(detail.resource_types.len(), 2);
305 }
306
307 #[test]
308 fn data_model_detail_label_none_last_modified_none() {
309 let detail = DataModelDetail {
310 name: "minimal".into(),
311 iri: "http://api.dasch.swiss/ontology/0000/minimal/v2".into(),
312 label: None,
313 last_modified: None,
314 resource_types: vec![ResourceTypeSummary {
315 name: "Thing".into(),
316 iri: "http://api.dasch.swiss/ontology/0000/minimal/v2#Thing".into(),
317 label: None,
318 }],
319 };
320 let cloned = detail.clone();
321 assert_eq!(detail, cloned);
322 assert_eq!(detail.label, None);
323 assert_eq!(detail.last_modified, None);
324 assert_eq!(detail.resource_types.len(), 1);
325 assert_eq!(detail.resource_types[0].label, None);
326 }
327
328 #[test]
329 fn data_model_detail_empty_resource_types() {
330 let detail = DataModelDetail {
331 name: "empty".into(),
332 iri: "http://api.dasch.swiss/ontology/9999/empty/v2".into(),
333 label: Some("Empty data-model".into()),
334 last_modified: None,
335 resource_types: vec![],
336 };
337 let cloned = detail.clone();
338 assert_eq!(detail, cloned);
339 assert!(detail.resource_types.is_empty());
340 assert_eq!(detail.label.as_deref(), Some("Empty data-model"));
341 assert_eq!(detail.last_modified, None);
342 }
343}