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            if !parent.as_os_str().is_empty() && !parent.exists() {
23                relay_log::debug!("creating directory for spooling file: {}", parent.display());
24                DirBuilder::new()
25                    .recursive(true)
26                    .create(&parent)
27                    .await
28                    .unwrap();
29            }
30        }
31
32        let options = SqliteConnectOptions::new()
33            .filename(&path)
34            .journal_mode(SqliteJournalMode::Wal)
35            .create_if_missing(true);
36
37        let db = SqlitePoolOptions::new()
38            .connect_with(options)
39            .await
40            .unwrap();
41
42        if run_migrations {
43            sqlx::migrate!("../migrations").run(&db).await.unwrap();
44        }
45
46        db
47    }
48
49    pub fn request_meta() -> RequestMeta {
50        let dsn = "https://a94ae32be2584e0bbd7a4cbb95971fee:@sentry.io/42"
51            .parse()
52            .unwrap();
53
54        RequestMeta::new(dsn)
55    }
56
57    pub fn mock_envelope(received_at: DateTime<Utc>) -> Box<Envelope> {
58        let event_id = EventId::new();
59        let mut envelope = Envelope::from_request(Some(event_id), request_meta());
60
61        let dsc = DynamicSamplingContext {
62            trace_id: "67e5504410b1426f9247bb680e5fe0c8".parse().unwrap(),
63            public_key: ProjectKey::parse("b81ae32be2584e0bbd7a4cbb95971fe1").unwrap(),
64            release: Some("1.1.1".to_owned()),
65            user: Default::default(),
66            replay_id: None,
67            environment: None,
68            transaction: Some("transaction1".into()),
69            sample_rate: None,
70            sampled: Some(true),
71            other: BTreeMap::new(),
72        };
73
74        envelope.set_dsc(dsc);
75        envelope.set_received_at(received_at);
76
77        envelope.add_item(Item::new(ItemType::Transaction));
78
79        envelope
80    }
81
82    #[allow(clippy::vec_box)]
83    pub fn mock_envelopes(count: usize) -> Vec<Box<Envelope>> {
84        let now = Utc::now();
85        (0..count)
86            .map(|i| mock_envelope(now - chrono::Duration::seconds((count - i) as i64)))
87            .collect()
88    }
89}