summaryrefslogtreecommitdiff
path: root/schist_models/tests
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-12-12 08:28:04 +0000
committerJoe Carstairs <me@joeac.net>2024-12-12 08:28:04 +0000
commit54894f9de9bad4fecb2a116d59a03cdd003f84c0 (patch)
tree6ce5517cecf23d4e93d7a381a374e1fa6c810cee /schist_models/tests
parent8a30bcbdf9264d235bf93da3df8e170cfde53d02 (diff)
Moves rust workspace to root
Diffstat (limited to 'schist_models/tests')
-rw-r--r--schist_models/tests/budget_period_unit.rs86
-rw-r--r--schist_models/tests/common/mod.rs1
-rw-r--r--schist_models/tests/common/test_context.rs44
-rw-r--r--schist_models/tests/date_utc.rs61
-rw-r--r--schist_models/tests/datetime_utc.rs62
5 files changed, 254 insertions, 0 deletions
diff --git a/schist_models/tests/budget_period_unit.rs b/schist_models/tests/budget_period_unit.rs
new file mode 100644
index 0000000..6e8928a
--- /dev/null
+++ b/schist_models/tests/budget_period_unit.rs
@@ -0,0 +1,86 @@
+mod common;
+
+use anyhow::Result;
+use common::test_context::TestContext;
+use diesel::{sql_query, Connection, ExpressionMethods, QueryDsl, RunQueryDsl, Selectable, SelectableHelper, SqliteConnection};
+use diesel::prelude::{Insertable, Queryable};
+use schist_models::budget_period_unit::BudgetPeriodUnit;
+
+diesel::table! {
+ budget_period_unit_test (id) {
+ id -> Integer,
+ budget_period_unit -> Text,
+ }
+}
+
+#[derive(Insertable, Queryable, Selectable, Clone)]
+#[diesel(table_name = budget_period_unit_test)]
+pub struct BudgetPeriodUnitTest {
+ pub id: i32,
+ pub budget_period_unit: BudgetPeriodUnit,
+}
+
+fn new_test_context() -> Result<TestContext> {
+ let test_context = TestContext::new();
+ let connection = &mut SqliteConnection::establish(&test_context.db_url)?;
+ let query = "CREATE TABLE budget_period_unit_test(id INTEGER PRIMARY KEY, budget_period_unit TEXT);";
+ sql_query(query).execute(connection)?;
+ Ok(test_context)
+}
+
+fn insert_budget_period_unit(id: i32, budget_period_unit: &BudgetPeriodUnit, connection: &mut SqliteConnection) -> Result<usize> {
+ let model = BudgetPeriodUnitTest {
+ id,
+ budget_period_unit: budget_period_unit.clone(),
+ };
+ let num_rows_inserted = diesel::insert_into(budget_period_unit_test::dsl::budget_period_unit_test)
+ .values(&[model])
+ .execute(connection)?;
+ Ok(num_rows_inserted)
+}
+
+fn get_budget_period_unit(id: i32, connection: &mut SqliteConnection) -> Result<BudgetPeriodUnitTest> {
+ let budget_period_unit: Vec<BudgetPeriodUnitTest> = budget_period_unit_test::dsl::budget_period_unit_test
+ .select(BudgetPeriodUnitTest::as_select())
+ .filter(budget_period_unit_test::id.eq(id))
+ .load(connection)?;
+ Ok(budget_period_unit[0].clone())
+}
+
+#[test]
+fn when_insert_day_and_select_then_returns_day() {
+ let test_context = new_test_context().unwrap();
+ let connection = &mut SqliteConnection::establish(&test_context.db_url).unwrap();
+
+ let budget_period_unit = BudgetPeriodUnit::Day;
+ let num_rows_inserted = insert_budget_period_unit(0, &budget_period_unit, connection);
+
+ assert!(num_rows_inserted.is_ok());
+ let num_rows_inserted = num_rows_inserted.unwrap();
+ assert_eq!(num_rows_inserted, 1);
+
+ let budget_period_unit_returned = get_budget_period_unit(0, connection);
+
+ assert!(budget_period_unit_returned.is_ok());
+ let budget_period_unit_returned = budget_period_unit_returned.unwrap();
+ assert_eq!(BudgetPeriodUnit::Day, budget_period_unit_returned.budget_period_unit);
+}
+
+#[test]
+fn when_insert_month_and_select_then_returns_month() {
+ let test_context = new_test_context().unwrap();
+ let connection = &mut SqliteConnection::establish(&test_context.db_url).unwrap();
+
+ let budget_period_unit = BudgetPeriodUnit::Month;
+ let num_rows_inserted = insert_budget_period_unit(0, &budget_period_unit, connection);
+
+ assert!(num_rows_inserted.is_ok());
+ let num_rows_inserted = num_rows_inserted.unwrap();
+ assert_eq!(num_rows_inserted, 1);
+
+ let budget_period_unit_returned = get_budget_period_unit(0, connection);
+
+ assert!(budget_period_unit_returned.is_ok());
+ let budget_period_unit_returned = budget_period_unit_returned.unwrap();
+ assert_eq!(BudgetPeriodUnit::Month, budget_period_unit_returned.budget_period_unit);
+}
diff --git a/schist_models/tests/common/mod.rs b/schist_models/tests/common/mod.rs
new file mode 100644
index 0000000..5ff67da
--- /dev/null
+++ b/schist_models/tests/common/mod.rs
@@ -0,0 +1 @@
+pub mod test_context;
diff --git a/schist_models/tests/common/test_context.rs b/schist_models/tests/common/test_context.rs
new file mode 100644
index 0000000..fb4112d
--- /dev/null
+++ b/schist_models/tests/common/test_context.rs
@@ -0,0 +1,44 @@
+use std::sync::atomic::{AtomicU64, Ordering};
+
+use diesel::{Connection, SqliteConnection};
+use diesel_migrations::MigrationHarness;
+use schist_queries::clear::clear;
+use schist_models::migrations::MIGRATIONS;
+
+pub struct TestContext {
+ pub db_url: String,
+}
+
+static ID_COUNTER: AtomicU64 = AtomicU64::new(0);
+
+impl TestContext {
+ pub fn new() -> Self {
+ let db_url = Self::next_id() + ".sqlite";
+
+ let connection = &mut SqliteConnection
+ ::establish(&db_url)
+ .expect("failed to connect to database");
+
+ connection
+ .run_pending_migrations(MIGRATIONS)
+ .expect("failed to run migrations");
+
+ clear(connection)
+ .expect("failed to clear database");
+
+ Self {
+ db_url,
+ }
+ }
+
+ fn next_id() -> String {
+ ID_COUNTER.fetch_add(1, Ordering::Relaxed).to_string()
+ }
+}
+
+impl Drop for TestContext {
+ fn drop(&mut self) {
+ std::fs::remove_file(&self.db_url)
+ .expect(format!("failed to delete database {}", self.db_url).as_str());
+ }
+}
diff --git a/schist_models/tests/date_utc.rs b/schist_models/tests/date_utc.rs
new file mode 100644
index 0000000..c5ad82e
--- /dev/null
+++ b/schist_models/tests/date_utc.rs
@@ -0,0 +1,61 @@
+mod common;
+
+use anyhow::Result;
+use common::test_context::TestContext;
+use diesel::{sql_query, Connection, ExpressionMethods, QueryDsl, RunQueryDsl, Selectable, SelectableHelper, SqliteConnection};
+use diesel::prelude::{Insertable, Queryable};
+use schist_models::date_utc::DateUtc;
+use schist_traits::nowlike::Nowlike;
+
+diesel::table! {
+ date_utc_test (id) {
+ id -> Integer,
+ date_utc -> Text,
+ }
+}
+
+#[derive(Insertable, Queryable, Selectable, Clone)]
+#[diesel(table_name = date_utc_test)]
+pub struct DateUtcTest {
+ pub id: i32,
+ pub date_utc: DateUtc,
+}
+
+fn new_test_context() -> Result<TestContext> {
+ let test_context = TestContext::new();
+ let connection = &mut SqliteConnection::establish(&test_context.db_url)?;
+ let query = "CREATE TABLE date_utc_test(id INTEGER PRIMARY KEY, date_utc TEXT);";
+ sql_query(query).execute(connection)?;
+ Ok(test_context)
+}
+
+fn insert_date_utc(id: i32, date_utc: &DateUtc, connection: &mut SqliteConnection) -> Result<usize> {
+ let model = DateUtcTest {
+ id,
+ date_utc: date_utc.clone(),
+ };
+ let num_rows_inserted = diesel::insert_into(date_utc_test::dsl::date_utc_test)
+ .values(&[model])
+ .execute(connection)?;
+ Ok(num_rows_inserted)
+}
+
+fn get_date_utc(id: i32, connection: &mut SqliteConnection) -> Result<DateUtcTest> {
+ let date_utc: Vec<DateUtcTest> = date_utc_test::dsl::date_utc_test
+ .select(DateUtcTest::as_select())
+ .filter(date_utc_test::id.eq(id))
+ .load(connection)?;
+ Ok(date_utc[0].clone())
+}
+
+#[test]
+fn when_insert_date_utc_and_select_then_returns_original_value() -> Result<()> {
+ let date_utc = DateUtc::now();
+ let test_context = new_test_context()?;
+ let connection = &mut SqliteConnection::establish(&test_context.db_url)?;
+ let num_rows_inserted = insert_date_utc(0, &date_utc, connection)?;
+ assert_eq!(num_rows_inserted, 1);
+ let date_utc_returned = get_date_utc(0, connection)?;
+ assert_eq!(date_utc_returned.date_utc, date_utc);
+ Ok(())
+}
diff --git a/schist_models/tests/datetime_utc.rs b/schist_models/tests/datetime_utc.rs
new file mode 100644
index 0000000..27182ff
--- /dev/null
+++ b/schist_models/tests/datetime_utc.rs
@@ -0,0 +1,62 @@
+mod common;
+
+use anyhow::Result;
+use common::test_context::TestContext;
+use diesel::{sql_query, Connection, ExpressionMethods, QueryDsl, RunQueryDsl, Selectable, SelectableHelper, SqliteConnection};
+use diesel::prelude::{Insertable, Queryable};
+use schist_models::datetime_utc::DatetimeUtc;
+use schist_traits::nowlike::Nowlike;
+
+
+diesel::table! {
+ datetime_utc_test (id) {
+ id -> Integer,
+ datetime_utc -> Text,
+ }
+}
+
+#[derive(Insertable, Queryable, Selectable, Clone)]
+#[diesel(table_name = datetime_utc_test)]
+pub struct DatetimeUtcTest {
+ pub id: i32,
+ pub datetime_utc: DatetimeUtc,
+}
+
+fn new_test_context() -> Result<TestContext> {
+ let test_context = TestContext::new();
+ let connection = &mut SqliteConnection::establish(&test_context.db_url)?;
+ let query = "CREATE TABLE datetime_utc_test(id INTEGER PRIMARY KEY, datetime_utc TEXT);";
+ sql_query(query).execute(connection)?;
+ Ok(test_context)
+}
+
+fn insert_datetime_utc(id: i32, datetime_utc: &DatetimeUtc, connection: &mut SqliteConnection) -> Result<usize> {
+ let model = DatetimeUtcTest {
+ id,
+ datetime_utc: datetime_utc.clone(),
+ };
+ let num_rows_inserted = diesel::insert_into(datetime_utc_test::dsl::datetime_utc_test)
+ .values(&[model])
+ .execute(connection)?;
+ Ok(num_rows_inserted)
+}
+
+fn get_datetime_utc(id: i32, connection: &mut SqliteConnection) -> Result<DatetimeUtcTest> {
+ let datetime_utc: Vec<DatetimeUtcTest> = datetime_utc_test::dsl::datetime_utc_test
+ .select(DatetimeUtcTest::as_select())
+ .filter(datetime_utc_test::id.eq(id))
+ .load(connection)?;
+ Ok(datetime_utc[0].clone())
+}
+
+#[test]
+fn when_insert_datetime_utc_and_select_then_returns_original_value() -> Result<()> {
+ let datetime_utc = DatetimeUtc::now();
+ let test_context = new_test_context()?;
+ let connection = &mut SqliteConnection::establish(&test_context.db_url)?;
+ let num_rows_inserted = insert_datetime_utc(0, &datetime_utc, connection)?;
+ assert_eq!(num_rows_inserted, 1);
+ let datetime_utc_returned = get_datetime_utc(0, connection)?;
+ assert_eq!(datetime_utc_returned.datetime_utc, datetime_utc);
+ Ok(())
+}