relay_server/services/buffer/
testutils.rs

1#[cfg(test)]
2pub mod utils {
3    use chrono::{DateTime, Utc};
4    use relay_base_schema::project::ProjectKey;
5    use relay_event_schema::protocol::EventId;
6    use relay_sampling::DynamicSamplingContext;
7    use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions};
8    use sqlx::{Pool, Sqlite};
9    use std::collections::BTreeMap;
10    use tokio::fs::DirBuilder;
11    use uuid::Uuid;
12
13    use crate::Envelope;
14    use crate::envelope::{Item, ItemType};
15    use crate::extractors::RequestMeta;
16
17    /// Sets up a temporary SQLite database for testing purposes.
18    pub async fn setup_db(run_migrations: bool) -> Pool<Sqlite> {
19        let path = std::env::temp_dir().join(Uuid::new_v4().to_string());
20
21        if let Some(parent) = path.parent()
22            && !parent.as_os_str().is_empty()
23            && !parent.exists()
24        {
25            relay_log::debug!("creating directory for spooling file: {}", parent.display());
26            DirBuilder::new()
27                .recursive(true)
28                .create(&parent)
29                .await
30                .unwrap();
31        }
32
33        let options = SqliteConnectOptions::new()
34            .filename(&path)
35            .journal_mode(SqliteJournalMode::Wal)
36            .create_if_missing(true);
37
38        let db = SqlitePoolOptions::new()
39            .connect_with(options)
40            .await
41            .unwrap();
42
43        if run_migrations {
44            sqlx::migrate!("../migrations").run(&db).await.unwrap();
45        }
46
47        db
48    }
49
50    pub fn request_meta() -> RequestMeta {
51        let dsn = "https://a94ae32be2584e0bbd7a4cbb95971fee:@sentry.io/42"
52            .parse()
53            .unwrap();
54
55        RequestMeta::new(dsn)
56    }
57
58    pub fn mock_envelope(received_at: DateTime<Utc>) -> Box<Envelope> {
59        let event_id = EventId::new();
60        let mut envelope = Envelope::from_request(Some(event_id), request_meta());
61
62        let dsc = DynamicSamplingContext {
63            trace_id: "67e5504410b1426f9247bb680e5fe0c8".parse().unwrap(),
64            public_key: ProjectKey::parse("b81ae32be2584e0bbd7a4cbb95971fe1").unwrap(),
65            release: Some("1.1.1".to_owned()),
66            user: Default::default(),
67            replay_id: None,
68            environment: None,
69            transaction: Some("transaction1".into()),
70            sample_rate: None,
71            sampled: Some(true),
72            other: BTreeMap::new(),
73        };
74
75        envelope.set_dsc(dsc);
76        envelope.set_received_at(received_at);
77
78        envelope.add_item(Item::new(ItemType::Transaction));
79
80        envelope
81    }
82
83    #[allow(clippy::vec_box)]
84    pub fn mock_envelopes(count: usize) -> Vec<Box<Envelope>> {
85        let now = Utc::now();
86        (0..count)
87            .map(|i| mock_envelope(now - chrono::Duration::seconds((count - i) as i64)))
88            .collect()
89    }
90}