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::HasMany<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::BelongsTo<Meeting>,
34    }
35
36    let mut db = t
37        .setup_db(models!(Meeting, AgendaItem, MeetingId, AgendaItemId))
38        .await;
39
40    let meeting = toasty::create!(Meeting {
41        id: MeetingId("m1".into()),
42    })
43    .exec(&mut db)
44    .await?;
45
46    let item = toasty::create!(AgendaItem {
47        id: AgendaItemId("a1".into()),
48        meeting: &meeting,
49    })
50    .exec(&mut db)
51    .await?;
52
53    assert_eq!(item.meeting_id.0, "m1");
54
55    // The accessor whose codegen used to fail to compile.
56    let loaded = item.meeting().exec(&mut db).await?;
57    assert_eq!(loaded.id.0, "m1");
58
59    Ok(())
60}