Skip to main content

coven_database/test_support/
circle_fixture.rs

1use crate::DatabaseTestSql;
2
3impl DatabaseTestSql<'_> {
4    pub(crate) fn install_test_active_circle(
5        &self,
6        label: &str,
7    ) -> (
8        coven_protocol::circle::CircleId,
9        coven_protocol::circle::CircleControlCoord,
10    ) {
11        self.install_test_circle_current_state(label, true)
12    }
13
14    pub(crate) fn install_test_inactive_circle(
15        &self,
16        label: &str,
17    ) -> (
18        coven_protocol::circle::CircleId,
19        coven_protocol::circle::CircleControlCoord,
20    ) {
21        self.install_test_circle_current_state(label, false)
22    }
23
24    /// Plant the founder Circle activation's rows, so a database read derives
25    /// the same current state the protocol fixture already holds.
26    fn install_test_circle_current_state(
27        &self,
28        label: &str,
29        active: bool,
30    ) -> (
31        coven_protocol::circle::CircleId,
32        coven_protocol::circle::CircleControlCoord,
33    ) {
34        use coven_protocol::circle_activation_test_fixtures::test_circle_activation;
35        use coven_protocol::store_commit::ObjectHash;
36
37        let activation = test_circle_activation(label, active);
38        let control_coord = serde_json::to_string(&activation.control.coord)
39            .expect("serialize test Circle control coordinate");
40        self.install_circle_current_state(
41            activation.circle_id,
42            &control_coord,
43            &format!("{label}-device"),
44            ObjectHash::digest(format!("{label} commit").as_bytes()),
45            &activation.control.bytes,
46            active.then_some(activation.owner_pubkey.as_str()),
47            &serde_json::to_vec(&activation.current).expect("serialize test Circle current state"),
48        )
49        .expect("install test Circle state");
50        (activation.circle_id, activation.control.coord)
51    }
52}
53
54impl crate::Database {
55    pub async fn bind_circle_row_blob_for_test(
56        &self,
57        binding: coven_protocol::audience_package::RowBlobLocatorBinding,
58        package: coven_protocol::store_commit::CirclePackageRef,
59        owner: coven_protocol::store_commit::StoreBatchCommitRef,
60    ) {
61        let record = coven_protocol::remote_object::RemoteObjectRecord::activated_blob(
62            binding.blob(),
63            owner,
64        )
65        .expect("construct activated Circle blob")
66        .into_record();
67        let audience = coven_protocol::audience_package::PackageAudience::Circle {
68            circle_id: package.circle_id,
69            control: package.control,
70            key_fingerprint: package.key_fingerprint,
71        };
72        assert_eq!(
73            binding.blob().locator().audience(),
74            audience.remote_audience()
75        );
76        self.test_sql(move |database| {
77            database.install_blob_binding(
78                &record.object_id().to_string(),
79                &serde_json::to_string(&record)?,
80                &binding.blob().locator().locator_hash().to_string(),
81                binding.table(),
82                binding.row_id(),
83                binding.column(),
84                binding.row_stamp(),
85                &serde_json::to_string(&audience)?,
86            )
87        })
88        .await
89        .expect("bind Circle row blob");
90    }
91}