Skip to main content

toasty_driver_integration_suite/tests/
embed_enum_collection.rs

1//! Tests for `Vec<enum>` where the element is a unit (data-less) enum. Such an
2//! enum is a scalar discriminant, so the collection is stored as a document
3//! array and offers the scalar-collection operators (`contains`, `len`, …).
4//! Gated on `document_collections`, like the struct-embed collections in
5//! `type_document`.
6
7use crate::prelude::*;
8
9#[derive(Clone, Copy, Debug, PartialEq, toasty::Embed)]
10enum Color {
11    #[column(variant = 1)]
12    Red,
13    #[column(variant = 2)]
14    Green,
15    #[column(variant = 3)]
16    Blue,
17}
18
19#[derive(Debug, toasty::Model)]
20struct Palette {
21    #[key]
22    #[auto]
23    id: uuid::Uuid,
24    colors: Vec<Color>,
25}
26
27/// A `Vec<unit-enum>` round-trips through INSERT and a fresh fetch: the
28/// discriminants are stored as a document array and reloaded back to variants.
29#[driver_test(requires(document_collections))]
30pub async fn vec_enum_create_get(t: &mut Test) -> Result<(), BoxError> {
31    let mut db = t.setup_db(models!(Palette)).await;
32
33    let colors = [Color::Red, Color::Blue];
34    let palette = toasty::create!(Palette { colors }).exec(&mut db).await?;
35
36    let reloaded = Palette::get_by_id(&mut db, &palette.id).await?;
37    assert_eq!(reloaded.colors, colors);
38
39    Ok(())
40}
41
42/// The scalar-collection operators unlocked by the emitted `Scalar` impl:
43/// `contains(variant)` matches on discriminant membership and `len()` filters
44/// on cardinality.
45#[driver_test(requires(document_collections))]
46pub async fn vec_enum_contains_and_len(t: &mut Test) -> Result<(), BoxError> {
47    let mut db = t.setup_db(models!(Palette)).await;
48
49    toasty::create!(Palette::[
50        { colors: [Color::Red, Color::Green] },
51        { colors: [Color::Blue] },
52        { colors: [Color::Red, Color::Green, Color::Blue] },
53    ])
54    .exec(&mut db)
55    .await?;
56
57    let reds = Palette::filter(Palette::fields().colors().contains(Color::Red))
58        .exec(&mut db)
59        .await?;
60    assert_eq!(reds.len(), 2);
61
62    let singletons = Palette::filter(Palette::fields().colors().len().eq(1))
63        .exec(&mut db)
64        .await?;
65    assert_eq!(singletons.len(), 1);
66
67    let triples = Palette::filter(Palette::fields().colors().len().eq(3))
68        .exec(&mut db)
69        .await?;
70    assert_eq!(triples.len(), 1);
71
72    Ok(())
73}