Skip to main content

toasty_driver_integration_suite/tests/
relation_belongs_to_embed_key.rs

1use crate::prelude::*;
2
3/// Regression test for tokio-rs/toasty#897: a `BelongsTo` whose foreign key
4/// references a primary key that is an `Embed` newtype caused the derive macro
5/// to emit code that called `Field::key_constraint` with a `{Embed}Fields`
6/// wrapper instead of the underlying `Path`, leading to a compile error.
7#[driver_test(requires(sql))]
8pub async fn belongs_to_with_embed_pk(t: &mut Test) -> Result<()> {
9    #[derive(Clone, Debug, PartialEq, Eq, toasty::Embed)]
10    pub struct MeetingId(String);
11
12    #[derive(Clone, Debug, PartialEq, Eq, toasty::Embed)]
13    pub struct AgendaItemId(String);
14
15    #[derive(Debug, toasty::Model)]
16    pub struct Meeting {
17        #[key]
18        pub id: MeetingId,
19
20        #[has_many]
21        pub agenda_items: toasty::Deferred<Vec<AgendaItem>>,
22    }
23
24    #[derive(Debug, toasty::Model)]
25    pub struct AgendaItem {
26        #[key]
27        pub id: AgendaItemId,
28
29        #[index]
30        pub meeting_id: MeetingId,
31
32        #[belongs_to(key = meeting_id, references = id)]
33        pub meeting: toasty::Deferred<Meeting>,
34    }
35
36    let mut db = t.setup_db(models!(Meeting, AgendaItem)).await;
37
38    let meeting = toasty::create!(Meeting {
39        id: MeetingId("m1".into()),
40    })
41    .exec(&mut db)
42    .await?;
43
44    let item = toasty::create!(AgendaItem {
45        id: AgendaItemId("a1".into()),
46        meeting: &meeting,
47    })
48    .exec(&mut db)
49    .await?;
50
51    assert_eq!(item.meeting_id.0, "m1");
52
53    // The accessor whose codegen used to fail to compile.
54    let loaded = item.meeting().exec(&mut db).await?;
55    assert_eq!(loaded.id.0, "m1");
56
57    Ok(())
58}