flix_db/entity/
mod.rs

1//! Entity structs for interacting with the database
2
3pub mod content;
4pub mod info;
5#[cfg(feature = "tmdb")]
6pub mod tmdb;
7pub mod watched;
8
9#[cfg(test)]
10mod tests {
11	use flix_model::numbers::{EpisodeNumber, SeasonNumber};
12	#[cfg(feature = "tmdb")]
13	use flix_tmdb::model::id::TmdbRepr as TmdbReprId;
14
15	use sea_orm::ActiveValue::Set;
16	use sea_orm::DatabaseConnection;
17	use sea_orm::DbErr;
18	use sea_orm::entity::prelude::*;
19	use sea_orm::sqlx::error::ErrorKind;
20	use seamantic::model::id::SeaOrmRepr as SeaOrmReprId;
21
22	use crate::entity;
23	use crate::entity::content::test::{
24		make_content_collection, make_content_episode, make_content_library, make_content_movie,
25		make_content_season, make_content_show,
26	};
27	#[cfg(feature = "tmdb")]
28	use crate::entity::tmdb::test::{
29		make_tmdb_collection, make_tmdb_episode, make_tmdb_movie, make_tmdb_season, make_tmdb_show,
30	};
31	use crate::entity::watched::test::{make_watched_episode, make_watched_movie};
32	use crate::tests::new_initialized_memory_db;
33
34	#[derive(Debug)]
35	pub enum ErrorKindError {
36		NotRuntimeError,
37		NotSqlxError,
38		NotDatabaseError,
39	}
40
41	pub fn get_error_kind(error: DbErr) -> Result<ErrorKind, ErrorKindError> {
42		let runtime_err = match error {
43			DbErr::Conn(runtime_err) => runtime_err,
44			DbErr::Exec(runtime_err) => runtime_err,
45			DbErr::Query(runtime_err) => runtime_err,
46			_ => return Err(ErrorKindError::NotRuntimeError),
47		};
48
49		let sqlx_err = match runtime_err {
50			sea_orm::RuntimeErr::SqlxError(sqlx_err) => sqlx_err,
51			_ => return Err(ErrorKindError::NotSqlxError),
52		};
53
54		let database_err = match sqlx_err.as_ref() {
55			sea_orm::SqlxError::Database(database_err) => database_err,
56			_ => return Err(ErrorKindError::NotDatabaseError),
57		};
58
59		Ok(database_err.kind())
60	}
61
62	/// Helper macro for writing tests for `ActiveModel` structs where
63	/// toggling [sea_orm::ActiveValue] is needed
64	macro_rules! notsettable {
65		($field:ident, $value:expr $(, $($skip:ident),+)?) => {
66			if notsettable!(@skip, $field $(, $($skip),+)?) {
67				NotSet
68			} else {
69				Set($value)
70			}
71		};
72		(@skip, $field:ident $(, $skip:ident),*) => {
73			false $(|| stringify!($field) == stringify!($skip))*
74		};
75	}
76	pub(super) use notsettable;
77
78	/// Helper macro for writing tests for `ActiveModel` structs where
79	/// toggling [sea_orm::ActiveValue] is needed
80	macro_rules! noneable {
81			($field:ident, $value:expr $(, $($skip:ident),+)?) => {
82				if noneable!(@skip, $field $(, $($skip),+)?) {
83					None
84				} else {
85					Some($value)
86				}
87			};
88			(@skip, $field:ident $(, $skip:ident),*) => {
89				false $(|| stringify!($field) == stringify!($skip))*
90			};
91		}
92	pub(super) use noneable;
93
94	struct FlixId {
95		collection: SeaOrmReprId,
96		movie: SeaOrmReprId,
97		show: SeaOrmReprId,
98		season: u32,
99		episode: u32,
100	}
101
102	#[cfg(feature = "tmdb")]
103	struct TmdbId {
104		collection: TmdbReprId,
105		movie: TmdbReprId,
106		show: TmdbReprId,
107		season: u32,
108		episode: u32,
109	}
110
111	struct ContentId {
112		library: SeaOrmReprId,
113	}
114
115	struct WatchId {
116		user: SeaOrmReprId,
117	}
118
119	struct DbId {
120		flix: FlixId,
121		#[cfg(feature = "tmdb")]
122		tmdb: TmdbId,
123		content: ContentId,
124		watch: WatchId,
125	}
126
127	impl Default for DbId {
128		fn default() -> Self {
129			Self {
130				flix: FlixId {
131					collection: 1,
132					movie: 2,
133					show: 3,
134					season: 4,
135					episode: 5,
136				},
137				#[cfg(feature = "tmdb")]
138				tmdb: TmdbId {
139					collection: 6,
140					movie: 7,
141					show: 8,
142					season: 9,
143					episode: 10,
144				},
145				content: ContentId { library: 11 },
146				watch: WatchId { user: 12 },
147			}
148		}
149	}
150
151	async fn initialize_deletion_test_database(id: &DbId) -> DatabaseConnection {
152		let db = new_initialized_memory_db().await;
153
154		// Populate the database
155		make_content_library!(&db, id.content.library);
156		make_content_collection!(&db, id.content.library, id.flix.collection, None);
157		make_content_movie!(
158			&db,
159			id.content.library,
160			id.flix.movie,
161			Some(id.flix.collection)
162		);
163		make_content_show!(
164			&db,
165			id.content.library,
166			id.flix.show,
167			Some(id.flix.collection)
168		);
169		make_content_season!(&db, id.content.library, id.flix.show, id.flix.season);
170		make_content_episode!(
171			&db,
172			id.content.library,
173			id.flix.show,
174			id.flix.season,
175			id.flix.episode
176		);
177
178		#[cfg(feature = "tmdb")]
179		make_tmdb_collection!(&db, id.tmdb.collection, id.flix.collection);
180		#[cfg(feature = "tmdb")]
181		make_tmdb_movie!(&db, id.tmdb.movie, id.flix.movie);
182		#[cfg(feature = "tmdb")]
183		make_tmdb_show!(&db, id.tmdb.show, id.flix.show);
184		#[cfg(feature = "tmdb")]
185		make_tmdb_season!(
186			&db,
187			id.tmdb.show,
188			id.tmdb.season,
189			id.flix.show,
190			id.flix.season
191		);
192		#[cfg(feature = "tmdb")]
193		make_tmdb_episode!(
194			&db,
195			id.tmdb.show,
196			id.tmdb.season,
197			id.tmdb.episode,
198			id.flix.show,
199			id.flix.season,
200			id.flix.episode
201		);
202
203		make_watched_movie!(&db, id.flix.movie, id.watch.user);
204		make_watched_episode!(
205			&db,
206			id.flix.show,
207			id.flix.season,
208			id.flix.episode,
209			id.watch.user
210		);
211
212		// Check that everything has one entry
213		assert_eq!(
214			Ok(1),
215			entity::info::collections::Entity::find().count(&db).await
216		);
217		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
218		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
219		assert_eq!(
220			Ok(1),
221			entity::info::seasons::Entity::find().count(&db).await
222		);
223		assert_eq!(
224			Ok(1),
225			entity::info::episodes::Entity::find().count(&db).await
226		);
227
228		#[cfg(feature = "tmdb")]
229		assert_eq!(
230			Ok(1),
231			entity::tmdb::collections::Entity::find().count(&db).await
232		);
233		#[cfg(feature = "tmdb")]
234		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
235		#[cfg(feature = "tmdb")]
236		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
237		#[cfg(feature = "tmdb")]
238		assert_eq!(
239			Ok(1),
240			entity::tmdb::seasons::Entity::find().count(&db).await
241		);
242		#[cfg(feature = "tmdb")]
243		assert_eq!(
244			Ok(1),
245			entity::tmdb::episodes::Entity::find().count(&db).await
246		);
247
248		assert_eq!(
249			Ok(1),
250			entity::content::libraries::Entity::find().count(&db).await
251		);
252		assert_eq!(
253			Ok(1),
254			entity::content::collections::Entity::find()
255				.count(&db)
256				.await
257		);
258		assert_eq!(
259			Ok(1),
260			entity::content::movies::Entity::find().count(&db).await
261		);
262		assert_eq!(
263			Ok(1),
264			entity::content::shows::Entity::find().count(&db).await
265		);
266		assert_eq!(
267			Ok(1),
268			entity::content::seasons::Entity::find().count(&db).await
269		);
270		assert_eq!(
271			Ok(1),
272			entity::content::episodes::Entity::find().count(&db).await
273		);
274
275		assert_eq!(
276			Ok(1),
277			entity::watched::movies::Entity::find().count(&db).await
278		);
279		assert_eq!(
280			Ok(1),
281			entity::watched::episodes::Entity::find().count(&db).await
282		);
283
284		db
285	}
286
287	#[tokio::test]
288	async fn test_delete_info_collection() {
289		let id = DbId::default();
290		let db = initialize_deletion_test_database(&id).await;
291
292		entity::info::collections::Entity::delete_by_id(seamantic::model::id::Id::from_raw(
293			id.flix.collection,
294		))
295		.exec(&db)
296		.await
297		.expect("Entity::delete_by_id");
298
299		assert_eq!(
300			Ok(0),
301			entity::info::collections::Entity::find().count(&db).await
302		);
303		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
304		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
305		assert_eq!(
306			Ok(1),
307			entity::info::seasons::Entity::find().count(&db).await
308		);
309		assert_eq!(
310			Ok(1),
311			entity::info::episodes::Entity::find().count(&db).await
312		);
313
314		#[cfg(feature = "tmdb")]
315		assert_eq!(
316			Ok(0),
317			entity::tmdb::collections::Entity::find().count(&db).await
318		);
319		#[cfg(feature = "tmdb")]
320		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
321		#[cfg(feature = "tmdb")]
322		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
323		#[cfg(feature = "tmdb")]
324		assert_eq!(
325			Ok(1),
326			entity::tmdb::seasons::Entity::find().count(&db).await
327		);
328		#[cfg(feature = "tmdb")]
329		assert_eq!(
330			Ok(1),
331			entity::tmdb::episodes::Entity::find().count(&db).await
332		);
333
334		assert_eq!(
335			Ok(1),
336			entity::content::libraries::Entity::find().count(&db).await
337		);
338		assert_eq!(
339			Ok(0),
340			entity::content::collections::Entity::find()
341				.count(&db)
342				.await
343		);
344		assert_eq!(
345			Ok(0),
346			entity::content::movies::Entity::find().count(&db).await
347		);
348		assert_eq!(
349			Ok(0),
350			entity::content::shows::Entity::find().count(&db).await
351		);
352		assert_eq!(
353			Ok(0),
354			entity::content::seasons::Entity::find().count(&db).await
355		);
356		assert_eq!(
357			Ok(0),
358			entity::content::episodes::Entity::find().count(&db).await
359		);
360
361		assert_eq!(
362			Ok(1),
363			entity::watched::movies::Entity::find().count(&db).await
364		);
365		assert_eq!(
366			Ok(1),
367			entity::watched::episodes::Entity::find().count(&db).await
368		);
369	}
370
371	#[tokio::test]
372	async fn test_delete_info_movie() {
373		let id = DbId::default();
374		let db = initialize_deletion_test_database(&id).await;
375
376		entity::info::movies::Entity::delete_by_id(seamantic::model::id::Id::from_raw(
377			id.flix.movie,
378		))
379		.exec(&db)
380		.await
381		.expect("Entity::delete_by_id");
382
383		assert_eq!(
384			Ok(1),
385			entity::info::collections::Entity::find().count(&db).await
386		);
387		assert_eq!(Ok(0), entity::info::movies::Entity::find().count(&db).await);
388		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
389		assert_eq!(
390			Ok(1),
391			entity::info::seasons::Entity::find().count(&db).await
392		);
393		assert_eq!(
394			Ok(1),
395			entity::info::episodes::Entity::find().count(&db).await
396		);
397
398		#[cfg(feature = "tmdb")]
399		assert_eq!(
400			Ok(1),
401			entity::tmdb::collections::Entity::find().count(&db).await
402		);
403		#[cfg(feature = "tmdb")]
404		assert_eq!(Ok(0), entity::tmdb::movies::Entity::find().count(&db).await);
405		#[cfg(feature = "tmdb")]
406		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
407		#[cfg(feature = "tmdb")]
408		assert_eq!(
409			Ok(1),
410			entity::tmdb::seasons::Entity::find().count(&db).await
411		);
412		#[cfg(feature = "tmdb")]
413		assert_eq!(
414			Ok(1),
415			entity::tmdb::episodes::Entity::find().count(&db).await
416		);
417
418		assert_eq!(
419			Ok(1),
420			entity::content::libraries::Entity::find().count(&db).await
421		);
422		assert_eq!(
423			Ok(1),
424			entity::content::collections::Entity::find()
425				.count(&db)
426				.await
427		);
428		assert_eq!(
429			Ok(0),
430			entity::content::movies::Entity::find().count(&db).await
431		);
432		assert_eq!(
433			Ok(1),
434			entity::content::shows::Entity::find().count(&db).await
435		);
436		assert_eq!(
437			Ok(1),
438			entity::content::seasons::Entity::find().count(&db).await
439		);
440		assert_eq!(
441			Ok(1),
442			entity::content::episodes::Entity::find().count(&db).await
443		);
444
445		assert_eq!(
446			Ok(0),
447			entity::watched::movies::Entity::find().count(&db).await
448		);
449		assert_eq!(
450			Ok(1),
451			entity::watched::episodes::Entity::find().count(&db).await
452		);
453	}
454
455	#[tokio::test]
456	async fn test_delete_info_show() {
457		let id = DbId::default();
458		let db = initialize_deletion_test_database(&id).await;
459
460		entity::info::shows::Entity::delete_by_id(seamantic::model::id::Id::from_raw(id.flix.show))
461			.exec(&db)
462			.await
463			.expect("Entity::delete_by_id");
464
465		assert_eq!(
466			Ok(1),
467			entity::info::collections::Entity::find().count(&db).await
468		);
469		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
470		assert_eq!(Ok(0), entity::info::shows::Entity::find().count(&db).await);
471		assert_eq!(
472			Ok(0),
473			entity::info::seasons::Entity::find().count(&db).await
474		);
475		assert_eq!(
476			Ok(0),
477			entity::info::episodes::Entity::find().count(&db).await
478		);
479
480		#[cfg(feature = "tmdb")]
481		assert_eq!(
482			Ok(1),
483			entity::tmdb::collections::Entity::find().count(&db).await
484		);
485		#[cfg(feature = "tmdb")]
486		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
487		#[cfg(feature = "tmdb")]
488		assert_eq!(Ok(0), entity::tmdb::shows::Entity::find().count(&db).await);
489		#[cfg(feature = "tmdb")]
490		assert_eq!(
491			Ok(0),
492			entity::tmdb::seasons::Entity::find().count(&db).await
493		);
494		#[cfg(feature = "tmdb")]
495		assert_eq!(
496			Ok(0),
497			entity::tmdb::episodes::Entity::find().count(&db).await
498		);
499
500		assert_eq!(
501			Ok(1),
502			entity::content::libraries::Entity::find().count(&db).await
503		);
504		assert_eq!(
505			Ok(1),
506			entity::content::collections::Entity::find()
507				.count(&db)
508				.await
509		);
510		assert_eq!(
511			Ok(1),
512			entity::content::movies::Entity::find().count(&db).await
513		);
514		assert_eq!(
515			Ok(0),
516			entity::content::shows::Entity::find().count(&db).await
517		);
518		assert_eq!(
519			Ok(0),
520			entity::content::seasons::Entity::find().count(&db).await
521		);
522		assert_eq!(
523			Ok(0),
524			entity::content::episodes::Entity::find().count(&db).await
525		);
526
527		assert_eq!(
528			Ok(1),
529			entity::watched::movies::Entity::find().count(&db).await
530		);
531		assert_eq!(
532			Ok(0),
533			entity::watched::episodes::Entity::find().count(&db).await
534		);
535	}
536
537	#[tokio::test]
538	async fn test_delete_info_season() {
539		let id = DbId::default();
540		let db = initialize_deletion_test_database(&id).await;
541
542		entity::info::seasons::Entity::delete_by_id((
543			seamantic::model::id::Id::from_raw(id.flix.show),
544			SeasonNumber::new(id.flix.season),
545		))
546		.exec(&db)
547		.await
548		.expect("Entity::delete_by_id");
549
550		assert_eq!(
551			Ok(1),
552			entity::info::collections::Entity::find().count(&db).await
553		);
554		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
555		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
556		assert_eq!(
557			Ok(0),
558			entity::info::seasons::Entity::find().count(&db).await
559		);
560		assert_eq!(
561			Ok(0),
562			entity::info::episodes::Entity::find().count(&db).await
563		);
564
565		#[cfg(feature = "tmdb")]
566		assert_eq!(
567			Ok(1),
568			entity::tmdb::collections::Entity::find().count(&db).await
569		);
570		#[cfg(feature = "tmdb")]
571		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
572		#[cfg(feature = "tmdb")]
573		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
574		#[cfg(feature = "tmdb")]
575		assert_eq!(
576			Ok(0),
577			entity::tmdb::seasons::Entity::find().count(&db).await
578		);
579		#[cfg(feature = "tmdb")]
580		assert_eq!(
581			Ok(0),
582			entity::tmdb::episodes::Entity::find().count(&db).await
583		);
584
585		assert_eq!(
586			Ok(1),
587			entity::content::libraries::Entity::find().count(&db).await
588		);
589		assert_eq!(
590			Ok(1),
591			entity::content::collections::Entity::find()
592				.count(&db)
593				.await
594		);
595		assert_eq!(
596			Ok(1),
597			entity::content::movies::Entity::find().count(&db).await
598		);
599		assert_eq!(
600			Ok(1),
601			entity::content::shows::Entity::find().count(&db).await
602		);
603		assert_eq!(
604			Ok(0),
605			entity::content::seasons::Entity::find().count(&db).await
606		);
607		assert_eq!(
608			Ok(0),
609			entity::content::episodes::Entity::find().count(&db).await
610		);
611
612		assert_eq!(
613			Ok(1),
614			entity::watched::movies::Entity::find().count(&db).await
615		);
616		assert_eq!(
617			Ok(0),
618			entity::watched::episodes::Entity::find().count(&db).await
619		);
620	}
621
622	#[tokio::test]
623	async fn test_delete_info_episodes() {
624		let id = DbId::default();
625		let db = initialize_deletion_test_database(&id).await;
626
627		entity::info::episodes::Entity::delete_by_id((
628			seamantic::model::id::Id::from_raw(id.flix.show),
629			SeasonNumber::new(id.flix.season),
630			EpisodeNumber::new(id.flix.episode),
631		))
632		.exec(&db)
633		.await
634		.expect("Entity::delete_by_id");
635
636		assert_eq!(
637			Ok(1),
638			entity::info::collections::Entity::find().count(&db).await
639		);
640		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
641		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
642		assert_eq!(
643			Ok(1),
644			entity::info::seasons::Entity::find().count(&db).await
645		);
646		assert_eq!(
647			Ok(0),
648			entity::info::episodes::Entity::find().count(&db).await
649		);
650
651		#[cfg(feature = "tmdb")]
652		assert_eq!(
653			Ok(1),
654			entity::tmdb::collections::Entity::find().count(&db).await
655		);
656		#[cfg(feature = "tmdb")]
657		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
658		#[cfg(feature = "tmdb")]
659		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
660		#[cfg(feature = "tmdb")]
661		assert_eq!(
662			Ok(1),
663			entity::tmdb::seasons::Entity::find().count(&db).await
664		);
665		#[cfg(feature = "tmdb")]
666		assert_eq!(
667			Ok(0),
668			entity::tmdb::episodes::Entity::find().count(&db).await
669		);
670
671		assert_eq!(
672			Ok(1),
673			entity::content::libraries::Entity::find().count(&db).await
674		);
675		assert_eq!(
676			Ok(1),
677			entity::content::collections::Entity::find()
678				.count(&db)
679				.await
680		);
681		assert_eq!(
682			Ok(1),
683			entity::content::movies::Entity::find().count(&db).await
684		);
685		assert_eq!(
686			Ok(1),
687			entity::content::shows::Entity::find().count(&db).await
688		);
689		assert_eq!(
690			Ok(1),
691			entity::content::seasons::Entity::find().count(&db).await
692		);
693		assert_eq!(
694			Ok(0),
695			entity::content::episodes::Entity::find().count(&db).await
696		);
697
698		assert_eq!(
699			Ok(1),
700			entity::watched::movies::Entity::find().count(&db).await
701		);
702		assert_eq!(
703			Ok(0),
704			entity::watched::episodes::Entity::find().count(&db).await
705		);
706	}
707
708	#[cfg(feature = "tmdb")]
709	#[tokio::test]
710	async fn test_delete_tmdb_collection() {
711		let id = DbId::default();
712		let db = initialize_deletion_test_database(&id).await;
713
714		entity::tmdb::collections::Entity::delete_by_id(flix_tmdb::model::id::Id::from_raw(
715			id.tmdb.collection,
716		))
717		.exec(&db)
718		.await
719		.expect("Entity::delete_by_id");
720
721		assert_eq!(
722			Ok(1),
723			entity::info::collections::Entity::find().count(&db).await
724		);
725		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
726		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
727		assert_eq!(
728			Ok(1),
729			entity::info::seasons::Entity::find().count(&db).await
730		);
731		assert_eq!(
732			Ok(1),
733			entity::info::episodes::Entity::find().count(&db).await
734		);
735
736		#[cfg(feature = "tmdb")]
737		assert_eq!(
738			Ok(0),
739			entity::tmdb::collections::Entity::find().count(&db).await
740		);
741		#[cfg(feature = "tmdb")]
742		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
743		#[cfg(feature = "tmdb")]
744		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
745		#[cfg(feature = "tmdb")]
746		assert_eq!(
747			Ok(1),
748			entity::tmdb::seasons::Entity::find().count(&db).await
749		);
750		#[cfg(feature = "tmdb")]
751		assert_eq!(
752			Ok(1),
753			entity::tmdb::episodes::Entity::find().count(&db).await
754		);
755
756		assert_eq!(
757			Ok(1),
758			entity::content::libraries::Entity::find().count(&db).await
759		);
760		assert_eq!(
761			Ok(1),
762			entity::content::collections::Entity::find()
763				.count(&db)
764				.await
765		);
766		assert_eq!(
767			Ok(1),
768			entity::content::movies::Entity::find().count(&db).await
769		);
770		assert_eq!(
771			Ok(1),
772			entity::content::shows::Entity::find().count(&db).await
773		);
774		assert_eq!(
775			Ok(1),
776			entity::content::seasons::Entity::find().count(&db).await
777		);
778		assert_eq!(
779			Ok(1),
780			entity::content::episodes::Entity::find().count(&db).await
781		);
782
783		assert_eq!(
784			Ok(1),
785			entity::watched::movies::Entity::find().count(&db).await
786		);
787		assert_eq!(
788			Ok(1),
789			entity::watched::episodes::Entity::find().count(&db).await
790		);
791	}
792
793	#[cfg(feature = "tmdb")]
794	#[tokio::test]
795	async fn test_delete_tmdb_movie() {
796		let id = DbId::default();
797		let db = initialize_deletion_test_database(&id).await;
798
799		entity::tmdb::movies::Entity::delete_by_id(flix_tmdb::model::id::Id::from_raw(
800			id.tmdb.movie,
801		))
802		.exec(&db)
803		.await
804		.expect("Entity::delete_by_id");
805
806		assert_eq!(
807			Ok(1),
808			entity::info::collections::Entity::find().count(&db).await
809		);
810		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
811		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
812		assert_eq!(
813			Ok(1),
814			entity::info::seasons::Entity::find().count(&db).await
815		);
816		assert_eq!(
817			Ok(1),
818			entity::info::episodes::Entity::find().count(&db).await
819		);
820
821		#[cfg(feature = "tmdb")]
822		assert_eq!(
823			Ok(1),
824			entity::tmdb::collections::Entity::find().count(&db).await
825		);
826		#[cfg(feature = "tmdb")]
827		assert_eq!(Ok(0), entity::tmdb::movies::Entity::find().count(&db).await);
828		#[cfg(feature = "tmdb")]
829		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
830		#[cfg(feature = "tmdb")]
831		assert_eq!(
832			Ok(1),
833			entity::tmdb::seasons::Entity::find().count(&db).await
834		);
835		#[cfg(feature = "tmdb")]
836		assert_eq!(
837			Ok(1),
838			entity::tmdb::episodes::Entity::find().count(&db).await
839		);
840
841		assert_eq!(
842			Ok(1),
843			entity::content::libraries::Entity::find().count(&db).await
844		);
845		assert_eq!(
846			Ok(1),
847			entity::content::collections::Entity::find()
848				.count(&db)
849				.await
850		);
851		assert_eq!(
852			Ok(1),
853			entity::content::movies::Entity::find().count(&db).await
854		);
855		assert_eq!(
856			Ok(1),
857			entity::content::shows::Entity::find().count(&db).await
858		);
859		assert_eq!(
860			Ok(1),
861			entity::content::seasons::Entity::find().count(&db).await
862		);
863		assert_eq!(
864			Ok(1),
865			entity::content::episodes::Entity::find().count(&db).await
866		);
867
868		assert_eq!(
869			Ok(1),
870			entity::watched::movies::Entity::find().count(&db).await
871		);
872		assert_eq!(
873			Ok(1),
874			entity::watched::episodes::Entity::find().count(&db).await
875		);
876	}
877
878	#[cfg(feature = "tmdb")]
879	#[tokio::test]
880	async fn test_delete_tmdb_show() {
881		let id = DbId::default();
882		let db = initialize_deletion_test_database(&id).await;
883
884		entity::tmdb::shows::Entity::delete_by_id(flix_tmdb::model::id::Id::from_raw(id.tmdb.show))
885			.exec(&db)
886			.await
887			.expect("Entity::delete_by_id");
888
889		assert_eq!(
890			Ok(1),
891			entity::info::collections::Entity::find().count(&db).await
892		);
893		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
894		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
895		assert_eq!(
896			Ok(1),
897			entity::info::seasons::Entity::find().count(&db).await
898		);
899		assert_eq!(
900			Ok(1),
901			entity::info::episodes::Entity::find().count(&db).await
902		);
903
904		#[cfg(feature = "tmdb")]
905		assert_eq!(
906			Ok(1),
907			entity::tmdb::collections::Entity::find().count(&db).await
908		);
909		#[cfg(feature = "tmdb")]
910		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
911		#[cfg(feature = "tmdb")]
912		assert_eq!(Ok(0), entity::tmdb::shows::Entity::find().count(&db).await);
913		#[cfg(feature = "tmdb")]
914		assert_eq!(
915			Ok(0),
916			entity::tmdb::seasons::Entity::find().count(&db).await
917		);
918		#[cfg(feature = "tmdb")]
919		assert_eq!(
920			Ok(0),
921			entity::tmdb::episodes::Entity::find().count(&db).await
922		);
923
924		assert_eq!(
925			Ok(1),
926			entity::content::libraries::Entity::find().count(&db).await
927		);
928		assert_eq!(
929			Ok(1),
930			entity::content::collections::Entity::find()
931				.count(&db)
932				.await
933		);
934		assert_eq!(
935			Ok(1),
936			entity::content::movies::Entity::find().count(&db).await
937		);
938		assert_eq!(
939			Ok(1),
940			entity::content::shows::Entity::find().count(&db).await
941		);
942		assert_eq!(
943			Ok(1),
944			entity::content::seasons::Entity::find().count(&db).await
945		);
946		assert_eq!(
947			Ok(1),
948			entity::content::episodes::Entity::find().count(&db).await
949		);
950
951		assert_eq!(
952			Ok(1),
953			entity::watched::movies::Entity::find().count(&db).await
954		);
955		assert_eq!(
956			Ok(1),
957			entity::watched::episodes::Entity::find().count(&db).await
958		);
959	}
960
961	#[cfg(feature = "tmdb")]
962	#[tokio::test]
963	async fn test_delete_tmdb_season() {
964		let id = DbId::default();
965		let db = initialize_deletion_test_database(&id).await;
966
967		entity::tmdb::seasons::Entity::delete_by_id((
968			flix_tmdb::model::id::Id::from_raw(id.tmdb.show),
969			SeasonNumber::new(id.tmdb.season),
970		))
971		.exec(&db)
972		.await
973		.expect("Entity::delete_by_id");
974
975		assert_eq!(
976			Ok(1),
977			entity::info::collections::Entity::find().count(&db).await
978		);
979		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
980		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
981		assert_eq!(
982			Ok(1),
983			entity::info::seasons::Entity::find().count(&db).await
984		);
985		assert_eq!(
986			Ok(1),
987			entity::info::episodes::Entity::find().count(&db).await
988		);
989
990		#[cfg(feature = "tmdb")]
991		assert_eq!(
992			Ok(1),
993			entity::tmdb::collections::Entity::find().count(&db).await
994		);
995		#[cfg(feature = "tmdb")]
996		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
997		#[cfg(feature = "tmdb")]
998		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
999		#[cfg(feature = "tmdb")]
1000		assert_eq!(
1001			Ok(0),
1002			entity::tmdb::seasons::Entity::find().count(&db).await
1003		);
1004		#[cfg(feature = "tmdb")]
1005		assert_eq!(
1006			Ok(0),
1007			entity::tmdb::episodes::Entity::find().count(&db).await
1008		);
1009
1010		assert_eq!(
1011			Ok(1),
1012			entity::content::libraries::Entity::find().count(&db).await
1013		);
1014		assert_eq!(
1015			Ok(1),
1016			entity::content::collections::Entity::find()
1017				.count(&db)
1018				.await
1019		);
1020		assert_eq!(
1021			Ok(1),
1022			entity::content::movies::Entity::find().count(&db).await
1023		);
1024		assert_eq!(
1025			Ok(1),
1026			entity::content::shows::Entity::find().count(&db).await
1027		);
1028		assert_eq!(
1029			Ok(1),
1030			entity::content::seasons::Entity::find().count(&db).await
1031		);
1032		assert_eq!(
1033			Ok(1),
1034			entity::content::episodes::Entity::find().count(&db).await
1035		);
1036
1037		assert_eq!(
1038			Ok(1),
1039			entity::watched::movies::Entity::find().count(&db).await
1040		);
1041		assert_eq!(
1042			Ok(1),
1043			entity::watched::episodes::Entity::find().count(&db).await
1044		);
1045	}
1046
1047	#[cfg(feature = "tmdb")]
1048	#[tokio::test]
1049	async fn test_delete_tmdb_episode() {
1050		let id = DbId::default();
1051		let db = initialize_deletion_test_database(&id).await;
1052
1053		entity::tmdb::episodes::Entity::delete_by_id((
1054			flix_tmdb::model::id::Id::from_raw(id.tmdb.show),
1055			SeasonNumber::new(id.tmdb.season),
1056			EpisodeNumber::new(id.tmdb.episode),
1057		))
1058		.exec(&db)
1059		.await
1060		.expect("Entity::delete_by_id");
1061
1062		assert_eq!(
1063			Ok(1),
1064			entity::info::collections::Entity::find().count(&db).await
1065		);
1066		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1067		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1068		assert_eq!(
1069			Ok(1),
1070			entity::info::seasons::Entity::find().count(&db).await
1071		);
1072		assert_eq!(
1073			Ok(1),
1074			entity::info::episodes::Entity::find().count(&db).await
1075		);
1076
1077		#[cfg(feature = "tmdb")]
1078		assert_eq!(
1079			Ok(1),
1080			entity::tmdb::collections::Entity::find().count(&db).await
1081		);
1082		#[cfg(feature = "tmdb")]
1083		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1084		#[cfg(feature = "tmdb")]
1085		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1086		#[cfg(feature = "tmdb")]
1087		assert_eq!(
1088			Ok(1),
1089			entity::tmdb::seasons::Entity::find().count(&db).await
1090		);
1091		#[cfg(feature = "tmdb")]
1092		assert_eq!(
1093			Ok(0),
1094			entity::tmdb::episodes::Entity::find().count(&db).await
1095		);
1096
1097		assert_eq!(
1098			Ok(1),
1099			entity::content::libraries::Entity::find().count(&db).await
1100		);
1101		assert_eq!(
1102			Ok(1),
1103			entity::content::collections::Entity::find()
1104				.count(&db)
1105				.await
1106		);
1107		assert_eq!(
1108			Ok(1),
1109			entity::content::movies::Entity::find().count(&db).await
1110		);
1111		assert_eq!(
1112			Ok(1),
1113			entity::content::shows::Entity::find().count(&db).await
1114		);
1115		assert_eq!(
1116			Ok(1),
1117			entity::content::seasons::Entity::find().count(&db).await
1118		);
1119		assert_eq!(
1120			Ok(1),
1121			entity::content::episodes::Entity::find().count(&db).await
1122		);
1123
1124		assert_eq!(
1125			Ok(1),
1126			entity::watched::movies::Entity::find().count(&db).await
1127		);
1128		assert_eq!(
1129			Ok(1),
1130			entity::watched::episodes::Entity::find().count(&db).await
1131		);
1132	}
1133
1134	#[tokio::test]
1135	async fn test_delete_content_library() {
1136		let id = DbId::default();
1137		let db = initialize_deletion_test_database(&id).await;
1138
1139		entity::content::libraries::Entity::delete_by_id(seamantic::model::id::Id::from_raw(
1140			id.content.library,
1141		))
1142		.exec(&db)
1143		.await
1144		.expect("Entity::delete_by_id");
1145
1146		assert_eq!(
1147			Ok(1),
1148			entity::info::collections::Entity::find().count(&db).await
1149		);
1150		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1151		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1152		assert_eq!(
1153			Ok(1),
1154			entity::info::seasons::Entity::find().count(&db).await
1155		);
1156		assert_eq!(
1157			Ok(1),
1158			entity::info::episodes::Entity::find().count(&db).await
1159		);
1160
1161		#[cfg(feature = "tmdb")]
1162		assert_eq!(
1163			Ok(1),
1164			entity::tmdb::collections::Entity::find().count(&db).await
1165		);
1166		#[cfg(feature = "tmdb")]
1167		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1168		#[cfg(feature = "tmdb")]
1169		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1170		#[cfg(feature = "tmdb")]
1171		assert_eq!(
1172			Ok(1),
1173			entity::tmdb::seasons::Entity::find().count(&db).await
1174		);
1175		#[cfg(feature = "tmdb")]
1176		assert_eq!(
1177			Ok(1),
1178			entity::tmdb::episodes::Entity::find().count(&db).await
1179		);
1180
1181		assert_eq!(
1182			Ok(0),
1183			entity::content::libraries::Entity::find().count(&db).await
1184		);
1185		assert_eq!(
1186			Ok(0),
1187			entity::content::collections::Entity::find()
1188				.count(&db)
1189				.await
1190		);
1191		assert_eq!(
1192			Ok(0),
1193			entity::content::movies::Entity::find().count(&db).await
1194		);
1195		assert_eq!(
1196			Ok(0),
1197			entity::content::shows::Entity::find().count(&db).await
1198		);
1199		assert_eq!(
1200			Ok(0),
1201			entity::content::seasons::Entity::find().count(&db).await
1202		);
1203		assert_eq!(
1204			Ok(0),
1205			entity::content::episodes::Entity::find().count(&db).await
1206		);
1207
1208		assert_eq!(
1209			Ok(1),
1210			entity::watched::movies::Entity::find().count(&db).await
1211		);
1212		assert_eq!(
1213			Ok(1),
1214			entity::watched::episodes::Entity::find().count(&db).await
1215		);
1216	}
1217
1218	#[tokio::test]
1219	async fn test_delete_content_collection() {
1220		let id = DbId::default();
1221		let db = initialize_deletion_test_database(&id).await;
1222
1223		entity::content::collections::Entity::delete_by_id(seamantic::model::id::Id::from_raw(
1224			id.flix.collection,
1225		))
1226		.exec(&db)
1227		.await
1228		.expect("Entity::delete_by_id");
1229
1230		assert_eq!(
1231			Ok(1),
1232			entity::info::collections::Entity::find().count(&db).await
1233		);
1234		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1235		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1236		assert_eq!(
1237			Ok(1),
1238			entity::info::seasons::Entity::find().count(&db).await
1239		);
1240		assert_eq!(
1241			Ok(1),
1242			entity::info::episodes::Entity::find().count(&db).await
1243		);
1244
1245		#[cfg(feature = "tmdb")]
1246		assert_eq!(
1247			Ok(1),
1248			entity::tmdb::collections::Entity::find().count(&db).await
1249		);
1250		#[cfg(feature = "tmdb")]
1251		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1252		#[cfg(feature = "tmdb")]
1253		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1254		#[cfg(feature = "tmdb")]
1255		assert_eq!(
1256			Ok(1),
1257			entity::tmdb::seasons::Entity::find().count(&db).await
1258		);
1259		#[cfg(feature = "tmdb")]
1260		assert_eq!(
1261			Ok(1),
1262			entity::tmdb::episodes::Entity::find().count(&db).await
1263		);
1264
1265		assert_eq!(
1266			Ok(1),
1267			entity::content::libraries::Entity::find().count(&db).await
1268		);
1269		assert_eq!(
1270			Ok(0),
1271			entity::content::collections::Entity::find()
1272				.count(&db)
1273				.await
1274		);
1275		assert_eq!(
1276			Ok(0),
1277			entity::content::movies::Entity::find().count(&db).await
1278		);
1279		assert_eq!(
1280			Ok(0),
1281			entity::content::shows::Entity::find().count(&db).await
1282		);
1283		assert_eq!(
1284			Ok(0),
1285			entity::content::seasons::Entity::find().count(&db).await
1286		);
1287		assert_eq!(
1288			Ok(0),
1289			entity::content::episodes::Entity::find().count(&db).await
1290		);
1291
1292		assert_eq!(
1293			Ok(1),
1294			entity::watched::movies::Entity::find().count(&db).await
1295		);
1296		assert_eq!(
1297			Ok(1),
1298			entity::watched::episodes::Entity::find().count(&db).await
1299		);
1300	}
1301
1302	#[tokio::test]
1303	async fn test_delete_content_movie() {
1304		let id = DbId::default();
1305		let db = initialize_deletion_test_database(&id).await;
1306
1307		entity::content::movies::Entity::delete_by_id(seamantic::model::id::Id::from_raw(
1308			id.flix.movie,
1309		))
1310		.exec(&db)
1311		.await
1312		.expect("Entity::delete_by_id");
1313
1314		assert_eq!(
1315			Ok(1),
1316			entity::info::collections::Entity::find().count(&db).await
1317		);
1318		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1319		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1320		assert_eq!(
1321			Ok(1),
1322			entity::info::seasons::Entity::find().count(&db).await
1323		);
1324		assert_eq!(
1325			Ok(1),
1326			entity::info::episodes::Entity::find().count(&db).await
1327		);
1328
1329		#[cfg(feature = "tmdb")]
1330		assert_eq!(
1331			Ok(1),
1332			entity::tmdb::collections::Entity::find().count(&db).await
1333		);
1334		#[cfg(feature = "tmdb")]
1335		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1336		#[cfg(feature = "tmdb")]
1337		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1338		#[cfg(feature = "tmdb")]
1339		assert_eq!(
1340			Ok(1),
1341			entity::tmdb::seasons::Entity::find().count(&db).await
1342		);
1343		#[cfg(feature = "tmdb")]
1344		assert_eq!(
1345			Ok(1),
1346			entity::tmdb::episodes::Entity::find().count(&db).await
1347		);
1348
1349		assert_eq!(
1350			Ok(1),
1351			entity::content::libraries::Entity::find().count(&db).await
1352		);
1353		assert_eq!(
1354			Ok(1),
1355			entity::content::collections::Entity::find()
1356				.count(&db)
1357				.await
1358		);
1359		assert_eq!(
1360			Ok(0),
1361			entity::content::movies::Entity::find().count(&db).await
1362		);
1363		assert_eq!(
1364			Ok(1),
1365			entity::content::shows::Entity::find().count(&db).await
1366		);
1367		assert_eq!(
1368			Ok(1),
1369			entity::content::seasons::Entity::find().count(&db).await
1370		);
1371		assert_eq!(
1372			Ok(1),
1373			entity::content::episodes::Entity::find().count(&db).await
1374		);
1375
1376		assert_eq!(
1377			Ok(1),
1378			entity::watched::movies::Entity::find().count(&db).await
1379		);
1380		assert_eq!(
1381			Ok(1),
1382			entity::watched::episodes::Entity::find().count(&db).await
1383		);
1384	}
1385
1386	#[tokio::test]
1387	async fn test_delete_content_show() {
1388		let id = DbId::default();
1389		let db = initialize_deletion_test_database(&id).await;
1390
1391		entity::content::shows::Entity::delete_by_id(seamantic::model::id::Id::from_raw(
1392			id.flix.show,
1393		))
1394		.exec(&db)
1395		.await
1396		.expect("Entity::delete_by_id");
1397
1398		assert_eq!(
1399			Ok(1),
1400			entity::info::collections::Entity::find().count(&db).await
1401		);
1402		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1403		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1404		assert_eq!(
1405			Ok(1),
1406			entity::info::seasons::Entity::find().count(&db).await
1407		);
1408		assert_eq!(
1409			Ok(1),
1410			entity::info::episodes::Entity::find().count(&db).await
1411		);
1412
1413		#[cfg(feature = "tmdb")]
1414		assert_eq!(
1415			Ok(1),
1416			entity::tmdb::collections::Entity::find().count(&db).await
1417		);
1418		#[cfg(feature = "tmdb")]
1419		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1420		#[cfg(feature = "tmdb")]
1421		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1422		#[cfg(feature = "tmdb")]
1423		assert_eq!(
1424			Ok(1),
1425			entity::tmdb::seasons::Entity::find().count(&db).await
1426		);
1427		#[cfg(feature = "tmdb")]
1428		assert_eq!(
1429			Ok(1),
1430			entity::tmdb::episodes::Entity::find().count(&db).await
1431		);
1432
1433		assert_eq!(
1434			Ok(1),
1435			entity::content::libraries::Entity::find().count(&db).await
1436		);
1437		assert_eq!(
1438			Ok(1),
1439			entity::content::collections::Entity::find()
1440				.count(&db)
1441				.await
1442		);
1443		assert_eq!(
1444			Ok(1),
1445			entity::content::movies::Entity::find().count(&db).await
1446		);
1447		assert_eq!(
1448			Ok(0),
1449			entity::content::shows::Entity::find().count(&db).await
1450		);
1451		assert_eq!(
1452			Ok(0),
1453			entity::content::seasons::Entity::find().count(&db).await
1454		);
1455		assert_eq!(
1456			Ok(0),
1457			entity::content::episodes::Entity::find().count(&db).await
1458		);
1459
1460		assert_eq!(
1461			Ok(1),
1462			entity::watched::movies::Entity::find().count(&db).await
1463		);
1464		assert_eq!(
1465			Ok(1),
1466			entity::watched::episodes::Entity::find().count(&db).await
1467		);
1468	}
1469
1470	#[tokio::test]
1471	async fn test_delete_content_season() {
1472		let id = DbId::default();
1473		let db = initialize_deletion_test_database(&id).await;
1474
1475		entity::content::seasons::Entity::delete_by_id((
1476			seamantic::model::id::Id::from_raw(id.flix.show),
1477			SeasonNumber::new(id.flix.season),
1478		))
1479		.exec(&db)
1480		.await
1481		.expect("Entity::delete_by_id");
1482
1483		assert_eq!(
1484			Ok(1),
1485			entity::info::collections::Entity::find().count(&db).await
1486		);
1487		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1488		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1489		assert_eq!(
1490			Ok(1),
1491			entity::info::seasons::Entity::find().count(&db).await
1492		);
1493		assert_eq!(
1494			Ok(1),
1495			entity::info::episodes::Entity::find().count(&db).await
1496		);
1497
1498		#[cfg(feature = "tmdb")]
1499		assert_eq!(
1500			Ok(1),
1501			entity::tmdb::collections::Entity::find().count(&db).await
1502		);
1503		#[cfg(feature = "tmdb")]
1504		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1505		#[cfg(feature = "tmdb")]
1506		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1507		#[cfg(feature = "tmdb")]
1508		assert_eq!(
1509			Ok(1),
1510			entity::tmdb::seasons::Entity::find().count(&db).await
1511		);
1512		#[cfg(feature = "tmdb")]
1513		assert_eq!(
1514			Ok(1),
1515			entity::tmdb::episodes::Entity::find().count(&db).await
1516		);
1517
1518		assert_eq!(
1519			Ok(1),
1520			entity::content::libraries::Entity::find().count(&db).await
1521		);
1522		assert_eq!(
1523			Ok(1),
1524			entity::content::collections::Entity::find()
1525				.count(&db)
1526				.await
1527		);
1528		assert_eq!(
1529			Ok(1),
1530			entity::content::movies::Entity::find().count(&db).await
1531		);
1532		assert_eq!(
1533			Ok(1),
1534			entity::content::shows::Entity::find().count(&db).await
1535		);
1536		assert_eq!(
1537			Ok(0),
1538			entity::content::seasons::Entity::find().count(&db).await
1539		);
1540		assert_eq!(
1541			Ok(0),
1542			entity::content::episodes::Entity::find().count(&db).await
1543		);
1544
1545		assert_eq!(
1546			Ok(1),
1547			entity::watched::movies::Entity::find().count(&db).await
1548		);
1549		assert_eq!(
1550			Ok(1),
1551			entity::watched::episodes::Entity::find().count(&db).await
1552		);
1553	}
1554
1555	#[tokio::test]
1556	async fn test_delete_content_episode() {
1557		let id = DbId::default();
1558		let db = initialize_deletion_test_database(&id).await;
1559
1560		entity::content::episodes::Entity::delete_by_id((
1561			seamantic::model::id::Id::from_raw(id.flix.show),
1562			SeasonNumber::new(id.flix.season),
1563			EpisodeNumber::new(id.flix.episode),
1564		))
1565		.exec(&db)
1566		.await
1567		.expect("Entity::delete_by_id");
1568
1569		assert_eq!(
1570			Ok(1),
1571			entity::info::collections::Entity::find().count(&db).await
1572		);
1573		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1574		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1575		assert_eq!(
1576			Ok(1),
1577			entity::info::seasons::Entity::find().count(&db).await
1578		);
1579		assert_eq!(
1580			Ok(1),
1581			entity::info::episodes::Entity::find().count(&db).await
1582		);
1583
1584		#[cfg(feature = "tmdb")]
1585		assert_eq!(
1586			Ok(1),
1587			entity::tmdb::collections::Entity::find().count(&db).await
1588		);
1589		#[cfg(feature = "tmdb")]
1590		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1591		#[cfg(feature = "tmdb")]
1592		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1593		#[cfg(feature = "tmdb")]
1594		assert_eq!(
1595			Ok(1),
1596			entity::tmdb::seasons::Entity::find().count(&db).await
1597		);
1598		#[cfg(feature = "tmdb")]
1599		assert_eq!(
1600			Ok(1),
1601			entity::tmdb::episodes::Entity::find().count(&db).await
1602		);
1603
1604		assert_eq!(
1605			Ok(1),
1606			entity::content::libraries::Entity::find().count(&db).await
1607		);
1608		assert_eq!(
1609			Ok(1),
1610			entity::content::collections::Entity::find()
1611				.count(&db)
1612				.await
1613		);
1614		assert_eq!(
1615			Ok(1),
1616			entity::content::movies::Entity::find().count(&db).await
1617		);
1618		assert_eq!(
1619			Ok(1),
1620			entity::content::shows::Entity::find().count(&db).await
1621		);
1622		assert_eq!(
1623			Ok(1),
1624			entity::content::seasons::Entity::find().count(&db).await
1625		);
1626		assert_eq!(
1627			Ok(0),
1628			entity::content::episodes::Entity::find().count(&db).await
1629		);
1630
1631		assert_eq!(
1632			Ok(1),
1633			entity::watched::movies::Entity::find().count(&db).await
1634		);
1635		assert_eq!(
1636			Ok(1),
1637			entity::watched::episodes::Entity::find().count(&db).await
1638		);
1639	}
1640
1641	#[tokio::test]
1642	async fn test_delete_watched_movie() {
1643		let id = DbId::default();
1644		let db = initialize_deletion_test_database(&id).await;
1645
1646		entity::watched::movies::Entity::delete_by_id((
1647			seamantic::model::id::Id::from_raw(id.flix.movie),
1648			id.watch.user,
1649		))
1650		.exec(&db)
1651		.await
1652		.expect("Entity::delete_by_id");
1653
1654		assert_eq!(
1655			Ok(1),
1656			entity::info::collections::Entity::find().count(&db).await
1657		);
1658		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1659		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1660		assert_eq!(
1661			Ok(1),
1662			entity::info::seasons::Entity::find().count(&db).await
1663		);
1664		assert_eq!(
1665			Ok(1),
1666			entity::info::episodes::Entity::find().count(&db).await
1667		);
1668
1669		#[cfg(feature = "tmdb")]
1670		assert_eq!(
1671			Ok(1),
1672			entity::tmdb::collections::Entity::find().count(&db).await
1673		);
1674		#[cfg(feature = "tmdb")]
1675		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1676		#[cfg(feature = "tmdb")]
1677		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1678		#[cfg(feature = "tmdb")]
1679		assert_eq!(
1680			Ok(1),
1681			entity::tmdb::seasons::Entity::find().count(&db).await
1682		);
1683		#[cfg(feature = "tmdb")]
1684		assert_eq!(
1685			Ok(1),
1686			entity::tmdb::episodes::Entity::find().count(&db).await
1687		);
1688
1689		assert_eq!(
1690			Ok(1),
1691			entity::content::libraries::Entity::find().count(&db).await
1692		);
1693		assert_eq!(
1694			Ok(1),
1695			entity::content::collections::Entity::find()
1696				.count(&db)
1697				.await
1698		);
1699		assert_eq!(
1700			Ok(1),
1701			entity::content::movies::Entity::find().count(&db).await
1702		);
1703		assert_eq!(
1704			Ok(1),
1705			entity::content::shows::Entity::find().count(&db).await
1706		);
1707		assert_eq!(
1708			Ok(1),
1709			entity::content::seasons::Entity::find().count(&db).await
1710		);
1711		assert_eq!(
1712			Ok(1),
1713			entity::content::episodes::Entity::find().count(&db).await
1714		);
1715
1716		assert_eq!(
1717			Ok(0),
1718			entity::watched::movies::Entity::find().count(&db).await
1719		);
1720		assert_eq!(
1721			Ok(1),
1722			entity::watched::episodes::Entity::find().count(&db).await
1723		);
1724	}
1725
1726	#[tokio::test]
1727	async fn test_delete_watched_episode() {
1728		let id = DbId::default();
1729		let db = initialize_deletion_test_database(&id).await;
1730
1731		entity::watched::episodes::Entity::delete_by_id((
1732			seamantic::model::id::Id::from_raw(id.flix.show),
1733			SeasonNumber::new(id.flix.season),
1734			EpisodeNumber::new(id.flix.episode),
1735			id.watch.user,
1736		))
1737		.exec(&db)
1738		.await
1739		.expect("Entity::delete_by_id");
1740
1741		assert_eq!(
1742			Ok(1),
1743			entity::info::collections::Entity::find().count(&db).await
1744		);
1745		assert_eq!(Ok(1), entity::info::movies::Entity::find().count(&db).await);
1746		assert_eq!(Ok(1), entity::info::shows::Entity::find().count(&db).await);
1747		assert_eq!(
1748			Ok(1),
1749			entity::info::seasons::Entity::find().count(&db).await
1750		);
1751		assert_eq!(
1752			Ok(1),
1753			entity::info::episodes::Entity::find().count(&db).await
1754		);
1755
1756		#[cfg(feature = "tmdb")]
1757		assert_eq!(
1758			Ok(1),
1759			entity::tmdb::collections::Entity::find().count(&db).await
1760		);
1761		#[cfg(feature = "tmdb")]
1762		assert_eq!(Ok(1), entity::tmdb::movies::Entity::find().count(&db).await);
1763		#[cfg(feature = "tmdb")]
1764		assert_eq!(Ok(1), entity::tmdb::shows::Entity::find().count(&db).await);
1765		#[cfg(feature = "tmdb")]
1766		assert_eq!(
1767			Ok(1),
1768			entity::tmdb::seasons::Entity::find().count(&db).await
1769		);
1770		#[cfg(feature = "tmdb")]
1771		assert_eq!(
1772			Ok(1),
1773			entity::tmdb::episodes::Entity::find().count(&db).await
1774		);
1775
1776		assert_eq!(
1777			Ok(1),
1778			entity::content::libraries::Entity::find().count(&db).await
1779		);
1780		assert_eq!(
1781			Ok(1),
1782			entity::content::collections::Entity::find()
1783				.count(&db)
1784				.await
1785		);
1786		assert_eq!(
1787			Ok(1),
1788			entity::content::movies::Entity::find().count(&db).await
1789		);
1790		assert_eq!(
1791			Ok(1),
1792			entity::content::shows::Entity::find().count(&db).await
1793		);
1794		assert_eq!(
1795			Ok(1),
1796			entity::content::seasons::Entity::find().count(&db).await
1797		);
1798		assert_eq!(
1799			Ok(1),
1800			entity::content::episodes::Entity::find().count(&db).await
1801		);
1802
1803		assert_eq!(
1804			Ok(1),
1805			entity::watched::movies::Entity::find().count(&db).await
1806		);
1807		assert_eq!(
1808			Ok(0),
1809			entity::watched::episodes::Entity::find().count(&db).await
1810		);
1811	}
1812}