diff options
44 files changed, 777 insertions, 1616 deletions
@@ -109,15 +109,6 @@ dependencies = [ ] [[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -336,28 +327,6 @@ dependencies = [ ] [[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] name = "async-task" version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -375,21 +344,6 @@ dependencies = [ ] [[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atomic" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" -dependencies = [ - "bytemuck", -] - -[[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -417,12 +371,6 @@ dependencies = [ ] [[package]] -name = "binascii" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" - -[[package]] name = "bit-set" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -700,17 +648,6 @@ dependencies = [ ] [[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] name = "core-foundation" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -993,39 +930,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" [[package]] -name = "devise" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d90b0c4c777a2cad215e3c7be59ac7c15adf45cf76317009b7d096d46f651d" -dependencies = [ - "devise_codegen", - "devise_core", -] - -[[package]] -name = "devise_codegen" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b28680d8be17a570a2334922518be6adc3f58ecc880cbb404eaeb8624fd867" -dependencies = [ - "devise_core", - "quote", -] - -[[package]] -name = "devise_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" -dependencies = [ - "bitflags 2.9.1", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.104", -] - -[[package]] name = "diesel" version = "2.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1033,7 +937,6 @@ checksum = "229850a212cd9b84d4f0290ad9d294afc0ae70fccaa8949dbe8b43ffafa1e20c" dependencies = [ "diesel_derives", "libsqlite3-sys", - "r2d2", "time", ] @@ -1193,15 +1096,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] name = "endi" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1312,20 +1206,6 @@ dependencies = [ ] [[package]] -name = "figment" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" -dependencies = [ - "atomic 0.6.1", - "pear", - "serde", - "toml 0.8.23", - "uncased", - "version_check", -] - -[[package]] name = "flate2" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1504,19 +1384,6 @@ dependencies = [ ] [[package]] -name = "generator" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "windows 0.48.0", -] - -[[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1583,12 +1450,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" [[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] name = "glow" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1638,7 +1499,7 @@ dependencies = [ "presser", "thiserror", "winapi", - "windows 0.52.0", + "windows", ] [[package]] @@ -1672,25 +1533,6 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] name = "half" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1765,75 +1607,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] name = "iana-time-zone" version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2049,16 +1822,9 @@ checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown 0.15.4", - "serde", ] [[package]] -name = "inlinable_string" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" - -[[package]] name = "instant" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2068,28 +1834,6 @@ dependencies = [ ] [[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "libc", -] - -[[package]] -name = "is-terminal" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.59.0", -] - -[[package]] name = "itertools" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2174,12 +1918,6 @@ dependencies = [ ] [[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] name = "libc" version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2268,21 +2006,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] -name = "loom" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] - -[[package]] name = "lru" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2298,15 +2021,6 @@ dependencies = [ ] [[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] name = "memchr" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2352,7 +2066,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bda1634d70d5bd53553cf15dca9842a396e8c799982a3ad22998dc44d961f24" dependencies = [ "serde", - "toml 0.9.2", + "toml", ] [[package]] @@ -2367,12 +2081,6 @@ dependencies = [ ] [[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2383,36 +2091,6 @@ dependencies = [ ] [[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "multer" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 1.3.1", - "httparse", - "memchr", - "mime", - "spin", - "tokio", - "tokio-util", - "version_check", -] - -[[package]] name = "naga" version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2485,16 +2163,6 @@ dependencies = [ ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2808,12 +2476,6 @@ dependencies = [ ] [[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] name = "owned_ttf_parser" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2907,29 +2569,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] -name = "pear" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" -dependencies = [ - "inlinable_string", - "pear_codegen", - "yansi", -] - -[[package]] -name = "pear_codegen" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.104", -] - -[[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3093,19 +2732,6 @@ dependencies = [ ] [[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", - "version_check", - "yansi", -] - -[[package]] name = "profiling" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3136,17 +2762,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "r2d2" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" -dependencies = [ - "log", - "parking_lot 0.12.4", - "scheduled-thread-pool", -] - -[[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3263,183 +2878,12 @@ dependencies = [ ] [[package]] -name = "ref-cast" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] name = "renderdoc-sys" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] -name = "rocket" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a516907296a31df7dc04310e7043b61d71954d703b603cc6867a026d7e72d73f" -dependencies = [ - "async-stream", - "async-trait", - "atomic 0.5.3", - "binascii", - "bytes", - "either", - "figment", - "futures", - "indexmap", - "log", - "memchr", - "multer", - "num_cpus", - "parking_lot 0.12.4", - "pin-project-lite", - "rand", - "ref-cast", - "rocket_codegen", - "rocket_http", - "serde", - "serde_json", - "state", - "tempfile", - "time", - "tokio", - "tokio-stream", - "tokio-util", - "ubyte", - "version_check", - "yansi", -] - -[[package]] -name = "rocket_codegen" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" -dependencies = [ - "devise", - "glob", - "indexmap", - "proc-macro2", - "quote", - "rocket_http", - "syn 2.0.104", - "unicode-xid", - "version_check", -] - -[[package]] -name = "rocket_http" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e274915a20ee3065f611c044bd63c40757396b6dbc057d6046aec27f14f882b9" -dependencies = [ - "cookie", - "either", - "futures", - "http 0.2.12", - "hyper", - "indexmap", - "log", - "memchr", - "pear", - "percent-encoding", - "pin-project-lite", - "ref-cast", - "serde", - "smallvec", - "stable-pattern", - "state", - "time", - "tokio", - "uncased", -] - -[[package]] -name = "rocket_sync_db_pools" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f32721ed79509adac4328e97f817a8f55a47c4b64799f6fd6cc3adb6e42ff" -dependencies = [ - "diesel", - "r2d2", - "rocket", - "rocket_sync_db_pools_codegen", - "serde", - "tokio", - "version_check", -] - -[[package]] -name = "rocket_sync_db_pools_codegen" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc890925dc79370c28eb15c9957677093fdb7e8c44966d189f38cedb995ee68" -dependencies = [ - "devise", - "quote", -] - -[[package]] name = "roxmltree" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3523,12 +2967,6 @@ dependencies = [ ] [[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3538,39 +2976,16 @@ dependencies = [ ] [[package]] -name = "scheduled-thread-pool" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" -dependencies = [ - "parking_lot 0.12.4", -] - -[[package]] -name = "schist_backend" -version = "0.1.0" -dependencies = [ - "cfg-if", - "chrono", - "diesel", - "diesel_migrations", - "libsqlite3-sys", - "rocket", - "rocket_sync_db_pools", - "schist_models", - "schist_queries", - "schist_schema", -] - -[[package]] name = "schist_desktop_gui" version = "0.1.0" dependencies = [ "anyhow", + "diesel", "iced", "itertools", "schist_fakes", "schist_models", + "schist_queries", ] [[package]] @@ -3674,18 +3089,6 @@ dependencies = [ ] [[package]] -name = "serde_json" -version = "1.0.141" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] name = "serde_repr" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3698,15 +3101,6 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" @@ -3726,15 +3120,6 @@ dependencies = [ ] [[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3838,26 +3223,6 @@ dependencies = [ ] [[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] name = "softbuffer" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3890,12 +3255,6 @@ dependencies = [ ] [[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3905,24 +3264,6 @@ dependencies = [ ] [[package]] -name = "stable-pattern" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" -dependencies = [ - "memchr", -] - -[[package]] -name = "state" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" -dependencies = [ - "loom", -] - -[[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4031,15 +3372,6 @@ dependencies = [ ] [[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] name = "time" version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4125,72 +3457,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] -name = "tokio" -version = "1.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" -dependencies = [ - "backtrace", - "bytes", - "io-uring", - "libc", - "mio", - "pin-project-lite", - "signal-hook-registry", - "slab", - "socket2 0.6.0", - "tokio-macros", - "windows-sys 0.59.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit", -] - -[[package]] name = "toml" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4198,7 +3464,7 @@ checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" dependencies = [ "indexmap", "serde", - "serde_spanned 1.0.0", + "serde_spanned", "toml_datetime 0.7.0", "toml_parser", "toml_writer", @@ -4210,9 +3476,6 @@ name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] [[package]] name = "toml_datetime" @@ -4230,10 +3493,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", - "serde", - "serde_spanned 0.6.9", "toml_datetime 0.6.11", - "toml_write", "winnow", ] @@ -4247,24 +3507,12 @@ dependencies = [ ] [[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] name = "toml_writer" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" [[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] name = "tracing" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4293,45 +3541,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", ] [[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] name = "ttf-parser" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4356,15 +3568,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] -name = "ubyte" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" -dependencies = [ - "serde", -] - -[[package]] name = "uds_windows" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4376,16 +3579,6 @@ dependencies = [ ] [[package]] -name = "uncased" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" -dependencies = [ - "serde", - "version_check", -] - -[[package]] name = "unicode-bidi" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4446,12 +3639,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4474,15 +3661,6 @@ dependencies = [ ] [[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4872,15 +4050,6 @@ dependencies = [ [[package]] name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" @@ -5389,15 +4558,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" -dependencies = [ - "is-terminal", -] - -[[package]] name = "yazi" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/schist_core/schist_fakes/src/bucket_transfer.rs b/schist_core/schist_fakes/src/bucket_transfer.rs new file mode 100644 index 0000000..9bc1f80 --- /dev/null +++ b/schist_core/schist_fakes/src/bucket_transfer.rs @@ -0,0 +1,16 @@ +use schist_models::bucket_transfer::{BucketTransfer, BucketTransferBuilder}; + +pub fn make_fake_bucket_transfer(id: i32) -> BucketTransfer { + make_fake_bucket_transfer_builder(id).build().unwrap() +} + +pub fn make_fake_bucket_transfer_builder(id: i32) -> BucketTransferBuilder { + let mut builder = BucketTransferBuilder::default(); + builder + .id(id) + .description(String::from("Fake bucket transfer")) + .quantity(0) + .from_bucket_id(0) + .to_bucket_id(1); + builder +} diff --git a/schist_core/schist_fakes/src/budget_drip.rs b/schist_core/schist_fakes/src/budget_drip.rs index f653565..498dd76 100644 --- a/schist_core/schist_fakes/src/budget_drip.rs +++ b/schist_core/schist_fakes/src/budget_drip.rs @@ -9,7 +9,7 @@ pub fn make_fake_budget_drip_builder(id: i32) -> BudgetDripBuilder { let mut builder = BudgetDripBuilder::default(); builder .id(id) - .category_id(0) + .bucket_id(0) .date(DateUtc::now()) .quantity(0); builder diff --git a/schist_core/schist_fakes/src/category_transfer.rs b/schist_core/schist_fakes/src/category_transfer.rs deleted file mode 100644 index a16d238..0000000 --- a/schist_core/schist_fakes/src/category_transfer.rs +++ /dev/null @@ -1,16 +0,0 @@ -use schist_models::bucket_transfer::{BucketTransfer, BucketTransferBuilder}; - -pub fn make_fake_category_transfer(id: i32) -> BucketTransfer { - make_fake_category_transfer_builder(id).build().unwrap() -} - -pub fn make_fake_category_transfer_builder(id: i32) -> BucketTransferBuilder { - let mut builder = BucketTransferBuilder::default(); - builder - .id(id) - .description(String::from("Fake category transfer")) - .quantity(0) - .from_category_id(0) - .to_category_id(1); - builder -} diff --git a/schist_core/schist_fakes/src/lib.rs b/schist_core/schist_fakes/src/lib.rs index 4a22169..ba88fb5 100644 --- a/schist_core/schist_fakes/src/lib.rs +++ b/schist_core/schist_fakes/src/lib.rs @@ -2,6 +2,6 @@ pub mod account; pub mod account_transfer; pub mod bucket; pub mod budget_drip; -pub mod category_transfer; +pub mod bucket_transfer; pub mod transaction; pub mod transaction_categorisation; diff --git a/schist_core/schist_fakes/src/transaction.rs b/schist_core/schist_fakes/src/transaction.rs index 30d1788..cee7e00 100644 --- a/schist_core/schist_fakes/src/transaction.rs +++ b/schist_core/schist_fakes/src/transaction.rs @@ -9,7 +9,7 @@ pub fn make_fake_transaction_builder(id: i32) -> TransactionBuilder { let mut builder = TransactionBuilder::default(); builder .id(id) - .description(String::from("Fake category transfer")) + .description(String::from("Fake bucket transfer")) .payee(String::from("Fake payee")) .quantity(0) .date(DateUtc::now()) diff --git a/schist_core/schist_fakes/src/transaction_categorisation.rs b/schist_core/schist_fakes/src/transaction_categorisation.rs index ce9460c..11b50c2 100644 --- a/schist_core/schist_fakes/src/transaction_categorisation.rs +++ b/schist_core/schist_fakes/src/transaction_categorisation.rs @@ -8,9 +8,9 @@ pub fn make_fake_transaction_categorisation_builder(id: i32) -> TransactionCate let mut builder = TransactionCategorisationBuilder::default(); builder .id(id) - .description(String::from("Fake category transfer")) + .description(String::from("Fake bucket transfer")) .quantity(0) .transaction_id(0) - .category_id(0); + .bucket_id(0); builder } diff --git a/schist_core/schist_models/src/bucket.rs b/schist_core/schist_models/src/bucket.rs index f162405..1ee6a13 100644 --- a/schist_core/schist_models/src/bucket.rs +++ b/schist_core/schist_models/src/bucket.rs @@ -16,7 +16,7 @@ use crate::{budget_period_unit::BudgetPeriodUnit, date_utc::DateUtc}; Deserialize, Insertable, )] -#[diesel(table_name = crate::schema::categories)] +#[diesel(table_name = crate::schema::buckets)] pub struct Bucket { pub id: i32, pub name: String, diff --git a/schist_core/schist_models/src/bucket_transfer.rs b/schist_core/schist_models/src/bucket_transfer.rs index 5d2e268..bdf95d9 100644 --- a/schist_core/schist_models/src/bucket_transfer.rs +++ b/schist_core/schist_models/src/bucket_transfer.rs @@ -2,11 +2,11 @@ use derive_builder::Builder; use diesel::prelude::*; #[derive(Builder, Queryable, Identifiable, Selectable, Debug, PartialEq, Insertable)] -#[diesel(table_name = crate::schema::category_transfers)] +#[diesel(table_name = crate::schema::bucket_transfers)] pub struct BucketTransfer { pub id: i32, pub description: String, pub quantity: i32, - pub from_category_id: i32, - pub to_category_id: i32, + pub from_bucket_id: i32, + pub to_bucket_id: i32, } diff --git a/schist_core/schist_models/src/budget_drip.rs b/schist_core/schist_models/src/budget_drip.rs index 2cc2c63..419c8f9 100644 --- a/schist_core/schist_models/src/budget_drip.rs +++ b/schist_core/schist_models/src/budget_drip.rs @@ -8,7 +8,7 @@ use crate::date_utc::DateUtc; #[diesel(table_name = crate::schema::budget_drips)] pub struct BudgetDrip { pub id: i32, - pub category_id: i32, + pub bucket_id: i32, pub date: DateUtc, pub quantity: i32, } diff --git a/schist_core/schist_models/src/schema.rs b/schist_core/schist_models/src/schema.rs index 40af56f..1c9fc62 100644 --- a/schist_core/schist_models/src/schema.rs +++ b/schist_core/schist_models/src/schema.rs @@ -23,14 +23,14 @@ diesel::table! { diesel::table! { budget_drips (id) { id -> Integer, - category_id -> Integer, + bucket_id -> Integer, date -> Text, quantity -> Integer, } } diesel::table! { - categories (id) { + buckets (id) { id -> Integer, name -> Text, balance -> Integer, @@ -43,12 +43,12 @@ diesel::table! { } diesel::table! { - category_transfers (id) { + bucket_transfers (id) { id -> Integer, description -> Text, quantity -> Integer, - from_category_id -> Integer, - to_category_id -> Integer, + from_bucket_id -> Integer, + to_bucket_id -> Integer, } } @@ -58,7 +58,7 @@ diesel::table! { description -> Text, quantity -> Integer, transaction_id -> Integer, - category_id -> Integer, + bucket_id -> Integer, } } @@ -73,8 +73,8 @@ diesel::table! { } } -diesel::joinable!(budget_drips -> categories (category_id)); -diesel::joinable!(transaction_categorisations -> categories (category_id)); +diesel::joinable!(budget_drips -> buckets (bucket_id)); +diesel::joinable!(transaction_categorisations -> buckets (bucket_id)); diesel::joinable!(transaction_categorisations -> transactions (transaction_id)); diesel::joinable!(transactions -> accounts (account_id)); @@ -82,8 +82,8 @@ diesel::allow_tables_to_appear_in_same_query!( account_transfers, accounts, budget_drips, - categories, - category_transfers, + buckets, + bucket_transfers, transaction_categorisations, transactions, ); diff --git a/schist_core/schist_models/src/transaction_categorisation.rs b/schist_core/schist_models/src/transaction_categorisation.rs index c6ac6ea..36752ee 100644 --- a/schist_core/schist_models/src/transaction_categorisation.rs +++ b/schist_core/schist_models/src/transaction_categorisation.rs @@ -8,5 +8,5 @@ pub struct TransactionCategorisation { pub description: String, pub quantity: i32, pub transaction_id: i32, - pub category_id: i32, + pub bucket_id: i32, } diff --git a/schist_core/schist_queries/src/bucket_transfers.rs b/schist_core/schist_queries/src/bucket_transfers.rs new file mode 100644 index 0000000..2145944 --- /dev/null +++ b/schist_core/schist_queries/src/bucket_transfers.rs @@ -0,0 +1,74 @@ +use anyhow::{Context, Result}; +use diesel::{dsl::sum, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; +use schist_schema::schema::bucket_transfers::{ + self as bucket_transfers_schema, + dsl::bucket_transfers as bucket_transfers_table, +}; +use schist_models::bucket_transfer::BucketTransfer; + +pub fn delete_all_bucket_transfers(connection: &mut SqliteConnection) -> Result<usize> { + let num_rows_deleted = diesel::delete(bucket_transfers_table) + .execute(connection) + .with_context(|| "failed to delete all bucket transfers")?; + Ok(num_rows_deleted) +} + +pub fn get_all_bucket_transfers(connection: &mut SqliteConnection) -> Result<Vec<BucketTransfer>> { + let all_bucket_transfers = bucket_transfers_table + .select(BucketTransfer::as_select()) + .load(connection) + .with_context(|| "failed to get all bucket transfers")?; + Ok(all_bucket_transfers) +} + +pub fn insert_bucket_transfers( + bucket_transfers: &[BucketTransfer], + connection: &mut SqliteConnection, +) -> Result<usize> { + let num_rows_inserted = diesel::insert_into(bucket_transfers_table) + .values(bucket_transfers) + .execute(connection) + .with_context(|| insert_err_msg(&bucket_transfers))?; + Ok(num_rows_inserted) +} + +fn insert_err_msg(bucket_transfers: &[BucketTransfer]) -> String { + format!( + "failed to insert bucket transfers: [{}]", + bucket_transfers + .iter() + .map(|ct| ct.id.to_string()) + .collect::<Vec<String>>() + .join(", ") + ) +} + +pub fn sum_bucket_transfer_quantity_per_from_bucket_id( + connection: &mut SqliteConnection, +) -> Result<Vec<(i32, i64)>> { + let sum = bucket_transfers_table + .group_by(bucket_transfers_schema::from_bucket_id) + .select(( + bucket_transfers_schema::from_bucket_id, + sum(bucket_transfers_schema::quantity), + )) + .load::<(i32, Option<i64>)>(connection) + .map(|result| result.iter().map(|sum| (sum.0, sum.1.unwrap_or(0))).collect()) + .with_context(|| "failed to sum bucket transfer quantity per from bucket ID")?; + Ok(sum) +} + +pub fn sum_bucket_transfer_quantity_per_to_bucket_id( + connection: &mut SqliteConnection, +) -> Result<Vec<(i32, i64)>> { + let sum = bucket_transfers_table + .group_by(bucket_transfers_schema::to_bucket_id) + .select(( + bucket_transfers_schema::to_bucket_id, + sum(bucket_transfers_schema::quantity), + )) + .load::<(i32, Option<i64>)>(connection) + .map(|vec| vec.iter().map(|(id, sum)| (*id, sum.unwrap_or(0))).collect()) + .with_context(|| "failed to sum bucket transfer quantity per to bucket ID")?; + Ok(sum) +} diff --git a/schist_core/schist_queries/src/buckets.rs b/schist_core/schist_queries/src/buckets.rs new file mode 100644 index 0000000..c7cf213 --- /dev/null +++ b/schist_core/schist_queries/src/buckets.rs @@ -0,0 +1,49 @@ +use anyhow::{Context, Result}; +use diesel::{QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; +use schist_models::bucket::Bucket; +use schist_schema::schema::buckets::{self as buckets_schema, dsl::buckets as buckets_table}; + +pub fn delete_all_buckets(connection: &mut SqliteConnection) -> Result<usize> { + let num_rows_deleted = diesel::delete(buckets_table) + .execute(connection) + .with_context(|| "failed to delete all buckets")?; + Ok(num_rows_deleted) +} + +pub fn get_all_buckets(connection: &mut SqliteConnection) -> Result<Vec<Bucket>> { + let all_buckets = buckets_table + .select(Bucket::as_select()) + .load(connection) + .with_context(|| "failed to get all buckets")?; + Ok(all_buckets) +} + +pub fn get_all_bucket_ids(connection: &mut SqliteConnection) -> Result<Vec<i32>> { + let all_bucket_ids = buckets_table + .select(buckets_schema::id) + .load(connection) + .with_context(|| "failed to get all bucket IDs")?; + Ok(all_bucket_ids) +} + +pub fn insert_buckets( + buckets: &[Bucket], + connection: &mut SqliteConnection, +) -> Result<usize> { + let num_buckets_inserted = diesel::insert_into(buckets_table) + .values(buckets) + .execute(connection) + .with_context(|| insert_err_msg(buckets))?; + Ok(num_buckets_inserted) +} + +fn insert_err_msg(buckets: &[Bucket]) -> String { + format!( + "failed to insert buckets: [{}]", + buckets + .iter() + .map(|c| format!("\"{}\": \"{}\"", c.id, c.name)) + .collect::<Vec<String>>() + .join(", ") + ) +} diff --git a/schist_core/schist_queries/src/categories.rs b/schist_core/schist_queries/src/categories.rs deleted file mode 100644 index f4a9747..0000000 --- a/schist_core/schist_queries/src/categories.rs +++ /dev/null @@ -1,49 +0,0 @@ -use anyhow::{Context, Result}; -use diesel::{QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; -use schist_models::category::Category; -use schist_schema::schema::categories::{self as categories_schema, dsl::categories as categories_table}; - -pub fn delete_all_categories(connection: &mut SqliteConnection) -> Result<usize> { - let num_rows_deleted = diesel::delete(categories_table) - .execute(connection) - .with_context(|| "failed to delete all categories")?; - Ok(num_rows_deleted) -} - -pub fn get_all_categories(connection: &mut SqliteConnection) -> Result<Vec<Category>> { - let all_categories = categories_table - .select(Category::as_select()) - .load(connection) - .with_context(|| "failed to get all categories")?; - Ok(all_categories) -} - -pub fn get_all_category_ids(connection: &mut SqliteConnection) -> Result<Vec<i32>> { - let all_category_ids = categories_table - .select(categories_schema::id) - .load(connection) - .with_context(|| "failed to get all category IDs")?; - Ok(all_category_ids) -} - -pub fn insert_categories( - categories: &[Category], - connection: &mut SqliteConnection, -) -> Result<usize> { - let num_categories_inserted = diesel::insert_into(categories_table) - .values(categories) - .execute(connection) - .with_context(|| insert_err_msg(categories))?; - Ok(num_categories_inserted) -} - -fn insert_err_msg(categories: &[Category]) -> String { - format!( - "failed to insert categories: [{}]", - categories - .iter() - .map(|c| format!("\"{}\": \"{}\"", c.id, c.name)) - .collect::<Vec<String>>() - .join(", ") - ) -} diff --git a/schist_core/schist_queries/src/category_transfers.rs b/schist_core/schist_queries/src/category_transfers.rs deleted file mode 100644 index 33a53ea..0000000 --- a/schist_core/schist_queries/src/category_transfers.rs +++ /dev/null @@ -1,74 +0,0 @@ -use anyhow::{Context, Result}; -use diesel::{dsl::sum, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; -use schist_schema::schema::category_transfers::{ - self as category_transfers_schema, - dsl::category_transfers as category_transfers_table, -}; -use schist_models::category_transfer::CategoryTransfer; - -pub fn delete_all_category_transfers(connection: &mut SqliteConnection) -> Result<usize> { - let num_rows_deleted = diesel::delete(category_transfers_table) - .execute(connection) - .with_context(|| "failed to delete all category transfers")?; - Ok(num_rows_deleted) -} - -pub fn get_all_category_transfers(connection: &mut SqliteConnection) -> Result<Vec<CategoryTransfer>> { - let all_category_transfers = category_transfers_table - .select(CategoryTransfer::as_select()) - .load(connection) - .with_context(|| "failed to get all category transfers")?; - Ok(all_category_transfers) -} - -pub fn insert_category_transfers( - category_transfers: &[CategoryTransfer], - connection: &mut SqliteConnection, -) -> Result<usize> { - let num_rows_inserted = diesel::insert_into(category_transfers_table) - .values(category_transfers) - .execute(connection) - .with_context(|| insert_err_msg(&category_transfers))?; - Ok(num_rows_inserted) -} - -fn insert_err_msg(category_transfers: &[CategoryTransfer]) -> String { - format!( - "failed to insert category transfers: [{}]", - category_transfers - .iter() - .map(|ct| ct.id.to_string()) - .collect::<Vec<String>>() - .join(", ") - ) -} - -pub fn sum_category_transfer_quantity_per_from_category_id( - connection: &mut SqliteConnection, -) -> Result<Vec<(i32, i64)>> { - let sum = category_transfers_table - .group_by(category_transfers_schema::from_category_id) - .select(( - category_transfers_schema::from_category_id, - sum(category_transfers_schema::quantity), - )) - .load::<(i32, Option<i64>)>(connection) - .map(|result| result.iter().map(|sum| (sum.0, sum.1.unwrap_or(0))).collect()) - .with_context(|| "failed to sum category transfer quantity per from category ID")?; - Ok(sum) -} - -pub fn sum_category_transfer_quantity_per_to_category_id( - connection: &mut SqliteConnection, -) -> Result<Vec<(i32, i64)>> { - let sum = category_transfers_table - .group_by(category_transfers_schema::to_category_id) - .select(( - category_transfers_schema::to_category_id, - sum(category_transfers_schema::quantity), - )) - .load::<(i32, Option<i64>)>(connection) - .map(|vec| vec.iter().map(|(id, sum)| (*id, sum.unwrap_or(0))).collect()) - .with_context(|| "failed to sum category transfer quantity per to category ID")?; - Ok(sum) -} diff --git a/schist_core/schist_queries/src/clear.rs b/schist_core/schist_queries/src/clear.rs index 7cee699..6d2894d 100644 --- a/schist_core/schist_queries/src/clear.rs +++ b/schist_core/schist_queries/src/clear.rs @@ -2,14 +2,14 @@ use anyhow::Result; use diesel::SqliteConnection; use crate::{ - accounts::delete_all_accounts, budget_drips::delete_all_budget_drips, categories::delete_all_categories, category_transfers::delete_all_category_transfers, transaction_categorisations::delete_all_transaction_categorisations, transactions::delete_all_transactions + accounts::delete_all_accounts, budget_drips::delete_all_budget_drips, buckets::delete_all_buckets, bucket_transfers::delete_all_bucket_transfers, transaction_categorisations::delete_all_transaction_categorisations, transactions::delete_all_transactions }; pub fn clear(connection: &mut SqliteConnection) -> Result<()> { delete_all_accounts(connection)?; delete_all_budget_drips(connection)?; - delete_all_categories(connection)?; - delete_all_category_transfers(connection)?; + delete_all_buckets(connection)?; + delete_all_bucket_transfers(connection)?; delete_all_transactions(connection)?; delete_all_transaction_categorisations(connection)?; Ok(()) diff --git a/schist_core/schist_queries/src/lib.rs b/schist_core/schist_queries/src/lib.rs index a1a5c20..e3e5488 100644 --- a/schist_core/schist_queries/src/lib.rs +++ b/schist_core/schist_queries/src/lib.rs @@ -1,8 +1,8 @@ pub mod accounts; pub mod account_transfers; pub mod budget_drips; -pub mod categories; -pub mod category_transfers; +pub mod buckets; +pub mod bucket_transfers; pub mod clear; pub mod transactions; pub mod transaction_categorisations; diff --git a/schist_core/schist_queries/src/transaction_categorisations.rs b/schist_core/schist_queries/src/transaction_categorisations.rs index 320782d..95aaf8d 100644 --- a/schist_core/schist_queries/src/transaction_categorisations.rs +++ b/schist_core/schist_queries/src/transaction_categorisations.rs @@ -43,17 +43,17 @@ fn insert_err_msg(transaction_categorisations: &[TransactionCategorisation]) -> ) } -pub fn sum_transaction_categorisation_quantity_per_category_id( +pub fn sum_transaction_categorisation_quantity_per_bucket_id( connection: &mut SqliteConnection, ) -> Result<Vec<(i32, i64)>> { let sum = transaction_categorisations_table - .group_by(transaction_categorisations_schema::category_id) + .group_by(transaction_categorisations_schema::bucket_id) .select(( - transaction_categorisations_schema::category_id, + transaction_categorisations_schema::bucket_id, sum(transaction_categorisations_schema::quantity), )) .load::<(i32, Option<i64>)>(connection) - .map(|vec| vec.iter().map(|(category_id, sum)| (*category_id, sum.unwrap_or(0))).collect()) - .with_context(|| "failed to sum transaction categorisation quantity per category ID")?; + .map(|vec| vec.iter().map(|(bucket_id, sum)| (*bucket_id, sum.unwrap_or(0))).collect()) + .with_context(|| "failed to sum transaction categorisation quantity per bucket ID")?; Ok(sum) } diff --git a/schist_core/schist_queries/src/transactions.rs b/schist_core/schist_queries/src/transactions.rs index 70b14e7..5941ebc 100644 --- a/schist_core/schist_queries/src/transactions.rs +++ b/schist_core/schist_queries/src/transactions.rs @@ -14,7 +14,7 @@ pub fn get_all_transactions(connection: &mut SqliteConnection) -> Result<Vec<Tra let all_transactions = transactions_table .select(Transaction::as_select()) .load(connection) - .with_context(|| "failed to get all category transfers")?; + .with_context(|| "failed to get all bucket transfers")?; Ok(all_transactions) } diff --git a/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs b/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs new file mode 100644 index 0000000..5194084 --- /dev/null +++ b/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs @@ -0,0 +1,130 @@ +use anyhow::Result; +use schist_models::{bucket::Bucket, budget_drip::BudgetDrip}; + +use super::{calculate_budgets_accrual, find_by_id_or}; + +pub fn calculate_bucket_balance( + bucket: &Bucket, + transaction_sums: &[(i32, i64)], + bucket_transfer_from_sums: &[(i32, i64)], + bucket_transfer_to_sums: &[(i32, i64)], + budget_drips: &[BudgetDrip], +) -> Result<i64> { + let transaction_sum = find_by_id_or(transaction_sums, bucket.id, 0); + let bucket_transfer_from_sum = find_by_id_or(bucket_transfer_from_sums, bucket.id, 0); + let bucket_transfer_to_sum = find_by_id_or(bucket_transfer_to_sums, bucket.id, 0); + let budget_accruals_sum = calculate_budgets_accrual(bucket, budget_drips)?; + + Ok( + transaction_sum + + budget_accruals_sum + + bucket_transfer_to_sum + - bucket_transfer_from_sum + ) +} + +#[cfg(test)] +mod test { + use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket}; + + use super::calculate_bucket_balance; + + #[test] + fn when_no_data_then_returns_zero() { + let bucket = make_fake_bucket(0); + + let result = calculate_bucket_balance(&bucket, &[], &[], &[], &[]); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_data_only_for_another_bucket_then_returns_zero() { + let bucket = make_fake_bucket(0); + let transaction_sums = [(1, 100)]; + let bucket_transfer_from_sums = [(1, 91)]; + let bucket_transfer_to_sums = [(2, 79)]; + let budget_drips = [ + make_fake_budget_drip_builder(0).quantity(100).bucket_id(1).build().unwrap(), + ]; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_transaction_sum_is_zero_then_returns_zero() { + let bucket = make_fake_bucket(0); + let transaction_sums = [(0, 0)]; + let bucket_transfer_from_sums = []; + let bucket_transfer_to_sums = []; + let budget_drips = []; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_bucket_transfers_are_zero_then_returns_zero() { + let bucket = make_fake_bucket(0); + let transaction_sums = []; + let bucket_transfer_from_sums = [(0, 0)]; + let bucket_transfer_to_sums = [(0, 0)]; + let budget_drips = []; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_some_data_then_calculates_as_expected() { + let bucket = make_fake_bucket(0); + let transaction_sums = [(0, 100)]; + let bucket_transfer_from_sums = [(0, 91)]; + let bucket_transfer_to_sums = [(0, 79)]; + let budget_drips = [ + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + ]; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + let expected_result = 100 + (-91) + 79 + 77 * 5; + assert!(result.is_ok()); + assert_eq!(result.unwrap(), expected_result); + } +} diff --git a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs b/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs index ca82953..cbf7180 100644 --- a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs +++ b/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs @@ -1,13 +1,13 @@ use anyhow::Result; use schist_models::{ budget_drip::BudgetDrip, - category::Category, + bucket::Bucket, }; -pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip]) -> Result<i64> { +pub fn calculate_budgets_accrual(bucket: &Bucket, budget_drips: &[BudgetDrip]) -> Result<i64> { Ok(budget_drips .iter() - .filter(|bd| bd.category_id == category.id) + .filter(|bd| bd.bucket_id == bucket.id) .map(|bd| Into::<i64>::into(bd.quantity)) .sum() ) @@ -15,29 +15,29 @@ pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip #[cfg(test)] mod test { - use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category}; + use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket}; use super::calculate_budgets_accrual; #[test] fn when_no_budget_drips_then_return_zero() { - let category = make_fake_category(0); + let bucket = make_fake_bucket(0); let budget_drips = []; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 0_i64); } #[test] - fn when_one_budget_drip_for_another_category_then_return_zero() { - let category = make_fake_category(0); + fn when_one_budget_drip_for_another_bucket_then_return_zero() { + let bucket = make_fake_bucket(0); let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(100).bucket_id(1).build().unwrap(), ]; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 0_i64); @@ -45,12 +45,12 @@ mod test { #[test] fn when_one_budget_drip_then_return_quantity() { - let category = make_fake_category(0); + let bucket = make_fake_bucket(0); let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(100).bucket_id(0).build().unwrap(), ]; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 100); @@ -58,13 +58,13 @@ mod test { #[test] fn when_two_budget_drips_then_return_sum() { - let category = make_fake_category(0); + let bucket = make_fake_bucket(0); let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(1).quantity(120).category_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(100).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(1).quantity(120).bucket_id(0).build().unwrap(), ]; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 220); diff --git a/schist_core/schist_queries/src/utils/calculate_category_balance.rs b/schist_core/schist_queries/src/utils/calculate_category_balance.rs deleted file mode 100644 index 73e80cd..0000000 --- a/schist_core/schist_queries/src/utils/calculate_category_balance.rs +++ /dev/null @@ -1,130 +0,0 @@ -use anyhow::Result; -use schist_models::{budget_drip::BudgetDrip, category::Category}; - -use super::{calculate_budgets_accrual, find_by_id_or}; - -pub fn calculate_category_balance( - category: &Category, - transaction_sums: &[(i32, i64)], - category_transfer_from_sums: &[(i32, i64)], - category_transfer_to_sums: &[(i32, i64)], - budget_drips: &[BudgetDrip], -) -> Result<i64> { - let transaction_sum = find_by_id_or(transaction_sums, category.id, 0); - let category_transfer_from_sum = find_by_id_or(category_transfer_from_sums, category.id, 0); - let category_transfer_to_sum = find_by_id_or(category_transfer_to_sums, category.id, 0); - let budget_accruals_sum = calculate_budgets_accrual(category, budget_drips)?; - - Ok( - transaction_sum - + budget_accruals_sum - + category_transfer_to_sum - - category_transfer_from_sum - ) -} - -#[cfg(test)] -mod test { - use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category}; - - use super::calculate_category_balance; - - #[test] - fn when_no_data_then_returns_zero() { - let category = make_fake_category(0); - - let result = calculate_category_balance(&category, &[], &[], &[], &[]); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_data_only_for_another_category_then_returns_zero() { - let category = make_fake_category(0); - let transaction_sums = [(1, 100)]; - let category_transfer_from_sums = [(1, 91)]; - let category_transfer_to_sums = [(2, 79)]; - let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(), - ]; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_transaction_sum_is_zero_then_returns_zero() { - let category = make_fake_category(0); - let transaction_sums = [(0, 0)]; - let category_transfer_from_sums = []; - let category_transfer_to_sums = []; - let budget_drips = []; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_category_transfers_are_zero_then_returns_zero() { - let category = make_fake_category(0); - let transaction_sums = []; - let category_transfer_from_sums = [(0, 0)]; - let category_transfer_to_sums = [(0, 0)]; - let budget_drips = []; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_some_data_then_calculates_as_expected() { - let category = make_fake_category(0); - let transaction_sums = [(0, 100)]; - let category_transfer_from_sums = [(0, 91)]; - let category_transfer_to_sums = [(0, 79)]; - let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - ]; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - let expected_result = 100 + (-91) + 79 + 77 * 5; - assert!(result.is_ok()); - assert_eq!(result.unwrap(), expected_result); - } -} diff --git a/schist_core/schist_queries/src/utils/mod.rs b/schist_core/schist_queries/src/utils/mod.rs index f2653d8..c006a9b 100644 --- a/schist_core/schist_queries/src/utils/mod.rs +++ b/schist_core/schist_queries/src/utils/mod.rs @@ -1,8 +1,8 @@ mod calculate_budgets_accrual; -mod calculate_category_balance; +mod calculate_bucket_balance; mod find_by_id_or; use calculate_budgets_accrual::calculate_budgets_accrual; -pub use calculate_category_balance::calculate_category_balance; +pub use calculate_bucket_balance::calculate_bucket_balance; pub use find_by_id_or::find_by_id_or; diff --git a/schist_core/schist_queries/tests/budget_drips.rs b/schist_core/schist_queries/tests/budget_drips.rs index ac33885..7c5bd4d 100644 --- a/schist_core/schist_queries/tests/budget_drips.rs +++ b/schist_core/schist_queries/tests/budget_drips.rs @@ -2,29 +2,29 @@ mod common; use common::test_context::TestContext; use diesel::{Connection, SqliteConnection}; -use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category}; -use schist_models::{category::Category, date_utc::DateUtc}; +use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket}; +use schist_models::{bucket::Bucket, date_utc::DateUtc}; use schist_queries as queries; -fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> { - let categories = vec![make_fake_category(0), make_fake_category(1)]; - let _ = queries::categories::insert_categories(&categories, connection); - categories +fn given_buckets(connection: &mut SqliteConnection) -> Vec<Bucket> { + let buckets = vec![make_fake_bucket(0), make_fake_bucket(1)]; + let _ = queries::buckets::insert_buckets(&buckets, connection); + buckets } #[test] fn when_insert_budget_drips_then_returns_num_budget_drips() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let _categories = given_categories(connection); + let _buckets = given_buckets(connection); let budget_drips = [ make_fake_budget_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), make_fake_budget_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), ]; @@ -34,14 +34,14 @@ fn when_insert_budget_drips_then_returns_num_budget_drips() { } #[test] -fn given_budget_drip_when_insert_budget_drip_same_category_and_same_date_then_return_err() { +fn given_budget_drip_when_insert_budget_drip_same_bucket_and_same_date_then_return_err() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let _categories = given_categories(connection); + let _buckets = given_buckets(connection); let budget_drips_1 = [ make_fake_budget_drip_builder(0) - .category_id(0) + .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; @@ -49,7 +49,7 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_same_date_then_re let budget_drips_2 = [ make_fake_budget_drip_builder(1) - .category_id(0) + .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; @@ -59,14 +59,14 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_same_date_then_re } #[test] -fn given_budget_drip_when_insert_budget_drip_different_category_and_same_date_then_return_num_budget_drips_inserted() { +fn given_budget_drip_when_insert_budget_drip_different_bucket_and_same_date_then_return_num_budget_drips_inserted() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let _categories = given_categories(connection); + let _buckets = given_buckets(connection); let budget_drips_1 = [ make_fake_budget_drip_builder(0) - .category_id(0) + .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; @@ -74,7 +74,7 @@ fn given_budget_drip_when_insert_budget_drip_different_category_and_same_date_th let budget_drips_2 = [ make_fake_budget_drip_builder(1) - .category_id(1) + .bucket_id(1) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; @@ -85,14 +85,14 @@ fn given_budget_drip_when_insert_budget_drip_different_category_and_same_date_th } #[test] -fn given_budget_drip_when_insert_budget_drip_same_category_and_different_date_then_return_num_budget_drips_inserted() { +fn given_budget_drip_when_insert_budget_drip_same_bucket_and_different_date_then_return_num_budget_drips_inserted() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let _categories = given_categories(connection); + let _buckets = given_buckets(connection); let budget_drips_1 = [ make_fake_budget_drip_builder(0) - .category_id(0) + .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; @@ -100,7 +100,7 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_different_date_th let budget_drips_2 = [ make_fake_budget_drip_builder(1) - .category_id(0) + .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .build().unwrap() ]; @@ -114,15 +114,15 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_different_date_th fn given_budget_drips_when_get_all_budget_drips_then_return_budget_drips() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let _categories = given_categories(connection); + let _buckets = given_buckets(connection); let budget_drips = [ make_fake_budget_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), make_fake_budget_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), ]; let _ = queries::budget_drips::insert_budget_drips(&budget_drips, connection).unwrap(); @@ -144,15 +144,15 @@ fn given_budget_drips_when_get_all_budget_drips_then_return_budget_drips() { fn given_budget_drips_when_delete_all_budget_drips_then_return_num_of_budget_drips() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let _categories = given_categories(connection); + let _buckets = given_buckets(connection); let budget_drips = [ make_fake_budget_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), make_fake_budget_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), ]; let _ = queries::budget_drips::insert_budget_drips(&budget_drips, connection).unwrap(); @@ -166,15 +166,15 @@ fn given_budget_drips_when_delete_all_budget_drips_then_return_num_of_budget_dri fn given_deleted_budget_drips_when_get_all_budget_drips_then_return_empty() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let _categories = given_categories(connection); + let _buckets = given_buckets(connection); let budget_drips = [ make_fake_budget_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), make_fake_budget_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) - .category_id(0) + .bucket_id(0) .build().unwrap(), ]; let _ = queries::budget_drips::insert_budget_drips(&budget_drips, connection).unwrap(); diff --git a/schist_core/schist_queries/tests/categories.rs b/schist_core/schist_queries/tests/categories.rs index 915e853..5ef6552 100644 --- a/schist_core/schist_queries/tests/categories.rs +++ b/schist_core/schist_queries/tests/categories.rs @@ -2,80 +2,80 @@ mod common; use common::test_context::TestContext; use diesel::{Connection, SqliteConnection}; -use schist_fakes::category::make_fake_category; -use schist_models::category::Category; +use schist_fakes::bucket::make_fake_bucket; +use schist_models::bucket::Bucket; use schist_queries as queries; -fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> { - let categories = vec![make_fake_category(0), make_fake_category(1)]; - let _ = queries::categories::insert_categories(&categories, connection).unwrap(); - categories +fn given_buckets(connection: &mut SqliteConnection) -> Vec<Bucket> { + let buckets = vec![make_fake_bucket(0), make_fake_bucket(1)]; + let _ = queries::buckets::insert_buckets(&buckets, connection).unwrap(); + buckets } #[test] -fn when_insert_categories_then_returns_num_categories() { +fn when_insert_buckets_then_returns_num_buckets() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = [make_fake_category(0), make_fake_category(1)]; + let buckets = [make_fake_bucket(0), make_fake_bucket(1)]; - let num_categories_inserted = queries::categories::insert_categories(&categories, connection).unwrap(); + let num_buckets_inserted = queries::buckets::insert_buckets(&buckets, connection).unwrap(); - assert_eq!(num_categories_inserted, 2); + assert_eq!(num_buckets_inserted, 2); } #[test] -fn given_categories_when_get_all_categories_then_return_categories() { +fn given_buckets_when_get_all_buckets_then_return_buckets() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = given_categories(connection); + let buckets = given_buckets(connection); - let categories_in_db = queries::categories::get_all_categories(connection).unwrap(); + let buckets_in_db = queries::buckets::get_all_buckets(connection).unwrap(); - assert_eq!(categories_in_db.len(), categories.len()); - for category in &categories { - assert!(categories_in_db.iter().any(|category_in_db| category_in_db.eq(&category))); + assert_eq!(buckets_in_db.len(), buckets.len()); + for bucket in &buckets { + assert!(buckets_in_db.iter().any(|bucket_in_db| bucket_in_db.eq(&bucket))); } - for category_in_db in categories_in_db { - assert!(categories.iter().any(|category| category.eq(&category_in_db))); + for bucket_in_db in buckets_in_db { + assert!(buckets.iter().any(|bucket| bucket.eq(&bucket_in_db))); } } #[test] -fn given_categories_when_delete_all_categories_then_return_num_of_categories() { +fn given_buckets_when_delete_all_buckets_then_return_num_of_buckets() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = given_categories(connection); + let buckets = given_buckets(connection); - let num_categories_deleted = queries::categories::delete_all_categories(connection).unwrap(); + let num_buckets_deleted = queries::buckets::delete_all_buckets(connection).unwrap(); - assert_eq!(num_categories_deleted, categories.len()); + assert_eq!(num_buckets_deleted, buckets.len()); } #[test] -fn given_deleted_categories_when_get_all_categories_then_return_empty() { +fn given_deleted_buckets_when_get_all_buckets_then_return_empty() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - given_categories(connection); - let _ = queries::categories::delete_all_categories(connection).unwrap(); + given_buckets(connection); + let _ = queries::buckets::delete_all_buckets(connection).unwrap(); - let categories_returned = queries::categories::get_all_categories(connection).unwrap(); + let buckets_returned = queries::buckets::get_all_buckets(connection).unwrap(); - assert_eq!(categories_returned.len(), 0); + assert_eq!(buckets_returned.len(), 0); } #[test] -fn given_categories_when_get_all_ids_then_return_all_ids() { +fn given_buckets_when_get_all_ids_then_return_all_ids() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = given_categories(connection); + let buckets = given_buckets(connection); - let ids = queries::categories::get_all_category_ids(connection).unwrap(); + let ids = queries::buckets::get_all_bucket_ids(connection).unwrap(); - assert_eq!(categories.len(), ids.len()); - for category in &categories { - assert!(ids.iter().any(|id| category.id == *id)); + assert_eq!(buckets.len(), ids.len()); + for bucket in &buckets { + assert!(ids.iter().any(|id| bucket.id == *id)); } for id in ids { - assert!(categories.iter().any(|category| category.id == id)); + assert!(buckets.iter().any(|bucket| bucket.id == id)); } } diff --git a/schist_core/schist_queries/tests/category_transfers.rs b/schist_core/schist_queries/tests/category_transfers.rs index f37a668..e913dcb 100644 --- a/schist_core/schist_queries/tests/category_transfers.rs +++ b/schist_core/schist_queries/tests/category_transfers.rs @@ -2,125 +2,125 @@ mod common; use common::test_context::TestContext; use diesel::{Connection, SqliteConnection}; -use schist_fakes::{category::make_fake_category, category_transfer::make_fake_category_transfer_builder}; +use schist_fakes::{bucket::make_fake_bucket, bucket_transfer::make_fake_bucket_transfer_builder}; use schist_queries as queries; #[test] -fn when_insert_category_transfers_then_returns_num_category_transfers() { +fn when_insert_bucket_transfers_then_returns_num_bucket_transfers() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = [make_fake_category(0), make_fake_category(1)]; - let category_transfers = [ - make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(), - make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(), + let buckets = [make_fake_bucket(0), make_fake_bucket(1)]; + let bucket_transfers = [ + make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(), + make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(), ]; - let _ = queries::categories::insert_categories(&categories, connection); + let _ = queries::buckets::insert_buckets(&buckets, connection); - let num_category_transfers_inserted = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); + let num_bucket_transfers_inserted = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap(); - assert_eq!(num_category_transfers_inserted, 2); + assert_eq!(num_bucket_transfers_inserted, 2); } #[test] -fn given_category_transfers_when_get_all_category_transfers_then_return_category_transfers() { +fn given_bucket_transfers_when_get_all_bucket_transfers_then_return_bucket_transfers() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = [make_fake_category(0), make_fake_category(1)]; - let category_transfers = [ - make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(), - make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(), + let buckets = [make_fake_bucket(0), make_fake_bucket(1)]; + let bucket_transfers = [ + make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(), + make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(), ]; - let _ = queries::categories::insert_categories(&categories, connection); - let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); + let _ = queries::buckets::insert_buckets(&buckets, connection); + let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap(); - let category_transfers_in_db = queries::category_transfers::get_all_category_transfers(connection).unwrap(); + let bucket_transfers_in_db = queries::bucket_transfers::get_all_bucket_transfers(connection).unwrap(); - assert_eq!(category_transfers_in_db.len(), category_transfers.len()); - for category_transfer in &category_transfers { - assert!(category_transfers_in_db.iter().any(|category_transfer_in_db| category_transfer_in_db.eq(&category_transfer))); + assert_eq!(bucket_transfers_in_db.len(), bucket_transfers.len()); + for bucket_transfer in &bucket_transfers { + assert!(bucket_transfers_in_db.iter().any(|bucket_transfer_in_db| bucket_transfer_in_db.eq(&bucket_transfer))); } - for category_transfer_in_db in category_transfers_in_db { - assert!(category_transfers.iter().any(|category_transfer| category_transfer.eq(&category_transfer_in_db))); + for bucket_transfer_in_db in bucket_transfers_in_db { + assert!(bucket_transfers.iter().any(|bucket_transfer| bucket_transfer.eq(&bucket_transfer_in_db))); } } #[test] -fn given_category_transfers_when_delete_all_category_transfers_then_return_num_of_category_transfers() { +fn given_bucket_transfers_when_delete_all_bucket_transfers_then_return_num_of_bucket_transfers() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = [make_fake_category(0), make_fake_category(1)]; - let category_transfers = [ - make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(), - make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(), + let buckets = [make_fake_bucket(0), make_fake_bucket(1)]; + let bucket_transfers = [ + make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(), + make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(), ]; - let _ = queries::categories::insert_categories(&categories, connection); - let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); + let _ = queries::buckets::insert_buckets(&buckets, connection); + let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap(); - let num_category_transfers_deleted = queries::category_transfers::delete_all_category_transfers(connection).unwrap(); + let num_bucket_transfers_deleted = queries::bucket_transfers::delete_all_bucket_transfers(connection).unwrap(); - assert_eq!(num_category_transfers_deleted, category_transfers.len()); + assert_eq!(num_bucket_transfers_deleted, bucket_transfers.len()); } #[test] -fn given_deleted_category_transfers_when_get_all_category_transfers_then_return_empty() { +fn given_deleted_bucket_transfers_when_get_all_bucket_transfers_then_return_empty() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = [make_fake_category(0), make_fake_category(1)]; - let category_transfers = [ - make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(), - make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(), + let buckets = [make_fake_bucket(0), make_fake_bucket(1)]; + let bucket_transfers = [ + make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(), + make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(), ]; - let _ = queries::categories::insert_categories(&categories, connection); - let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); - let _ = queries::category_transfers::delete_all_category_transfers(connection).unwrap(); + let _ = queries::buckets::insert_buckets(&buckets, connection); + let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap(); + let _ = queries::bucket_transfers::delete_all_bucket_transfers(connection).unwrap(); - let category_transfers_returned = queries::category_transfers::get_all_category_transfers(connection).unwrap(); + let bucket_transfers_returned = queries::bucket_transfers::get_all_bucket_transfers(connection).unwrap(); - assert_eq!(category_transfers_returned.len(), 0); + assert_eq!(bucket_transfers_returned.len(), 0); } #[test] -fn given_category_transfers_when_sum_quantity_per_from_category_id_then_returns_sum_per_from_category_id() { +fn given_bucket_transfers_when_sum_quantity_per_from_bucket_id_then_returns_sum_per_from_bucket_id() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = [make_fake_category(0), make_fake_category(1)]; - let category_transfers = [ - make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).quantity(1).build().unwrap(), - make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).quantity(2).build().unwrap(), - make_fake_category_transfer_builder(2).from_category_id(1).to_category_id(0).quantity(4).build().unwrap(), + let buckets = [make_fake_bucket(0), make_fake_bucket(1)]; + let bucket_transfers = [ + make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).quantity(1).build().unwrap(), + make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).quantity(2).build().unwrap(), + make_fake_bucket_transfer_builder(2).from_bucket_id(1).to_bucket_id(0).quantity(4).build().unwrap(), ]; - let _ = queries::categories::insert_categories(&categories, connection); - let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); + let _ = queries::buckets::insert_buckets(&buckets, connection); + let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap(); - let sums = queries::category_transfers::sum_category_transfer_quantity_per_from_category_id(connection); + let sums = queries::bucket_transfers::sum_bucket_transfer_quantity_per_from_bucket_id(connection); assert!(sums.is_ok()); let mut sums = sums.unwrap(); sums.sort_by_key(|sum| sum.0); - assert_eq!(categories.len(), sums.len()); + assert_eq!(buckets.len(), sums.len()); assert_eq!(3, sums[0].1); assert_eq!(4, sums[1].1); } #[test] -fn given_category_transfers_when_sum_quantity_per_to_category_id_then_returns_sum_per_to_category_id() { +fn given_bucket_transfers_when_sum_quantity_per_to_bucket_id_then_returns_sum_per_to_bucket_id() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); - let categories = [make_fake_category(0), make_fake_category(1)]; - let category_transfers = [ - make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).quantity(1).build().unwrap(), - make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).quantity(2).build().unwrap(), - make_fake_category_transfer_builder(2).from_category_id(1).to_category_id(0).quantity(4).build().unwrap(), + let buckets = [make_fake_bucket(0), make_fake_bucket(1)]; + let bucket_transfers = [ + make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).quantity(1).build().unwrap(), + make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).quantity(2).build().unwrap(), + make_fake_bucket_transfer_builder(2).from_bucket_id(1).to_bucket_id(0).quantity(4).build().unwrap(), ]; - let _ = queries::categories::insert_categories(&categories, connection); - let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); + let _ = queries::buckets::insert_buckets(&buckets, connection); + let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap(); - let sums = queries::category_transfers::sum_category_transfer_quantity_per_to_category_id(connection); + let sums = queries::bucket_transfers::sum_bucket_transfer_quantity_per_to_bucket_id(connection); assert!(sums.is_ok()); let mut sums = sums.unwrap(); sums.sort_by_key(|sum| sum.0); - assert_eq!(categories.len(), sums.len()); + assert_eq!(buckets.len(), sums.len()); assert_eq!(4, sums[0].1); assert_eq!(3, sums[1].1); } diff --git a/schist_core/schist_queries/tests/transaction_categorisations.rs b/schist_core/schist_queries/tests/transaction_categorisations.rs index 13864b4..bb88896 100644 --- a/schist_core/schist_queries/tests/transaction_categorisations.rs +++ b/schist_core/schist_queries/tests/transaction_categorisations.rs @@ -2,8 +2,8 @@ mod common; use common::test_context::TestContext; use diesel::{Connection, SqliteConnection}; -use schist_fakes::{account::make_fake_account, category::make_fake_category, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder}; -use schist_models::{account::Account, category::Category, transaction::Transaction}; +use schist_fakes::{account::make_fake_account, bucket::make_fake_bucket, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder}; +use schist_models::{account::Account, bucket::Bucket, transaction::Transaction}; use schist_queries as queries; fn given_accounts(connection: &mut SqliteConnection) -> Vec<Account> { @@ -12,10 +12,10 @@ fn given_accounts(connection: &mut SqliteConnection) -> Vec<Account> { accounts } -fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> { - let categories = vec![make_fake_category(0), make_fake_category(1)]; - let _ = queries::categories::insert_categories(&categories, connection); - categories +fn given_buckets(connection: &mut SqliteConnection) -> Vec<Bucket> { + let buckets = vec![make_fake_bucket(0), make_fake_bucket(1)]; + let _ = queries::buckets::insert_buckets(&buckets, connection); + buckets } fn given_transactions(connection: &mut SqliteConnection) -> Vec<Transaction> { @@ -32,11 +32,11 @@ fn when_insert_transaction_categorisations_then_returns_num_transaction_categori let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); given_accounts(connection); - given_categories(connection); + given_buckets(connection); given_transactions(connection); let transaction_categorisations = [ - make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(), - make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(), ]; let num_transaction_categorisations_inserted = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection).unwrap(); @@ -49,11 +49,11 @@ fn given_transaction_categorisations_when_get_all_transaction_categorisations_th let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); given_accounts(connection); - given_categories(connection); + given_buckets(connection); given_transactions(connection); let transaction_categorisations = [ - make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(), - make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(), ]; let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection); @@ -73,11 +73,11 @@ fn given_transaction_categorisations_when_delete_all_transaction_categorisations let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); given_accounts(connection); - given_categories(connection); + given_buckets(connection); given_transactions(connection); let transaction_categorisations = [ - make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(), - make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(), ]; let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection); @@ -91,11 +91,11 @@ fn given_deleted_transaction_categorisations_when_get_all_transaction_categorisa let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); given_accounts(connection); - given_categories(connection); + given_buckets(connection); given_transactions(connection); let transaction_categorisations = [ - make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(), - make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(), + make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(), ]; let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection); let _ = queries::transaction_categorisations::delete_all_transaction_categorisations(connection); @@ -106,25 +106,25 @@ fn given_deleted_transaction_categorisations_when_get_all_transaction_categorisa } #[test] -fn given_transaction_categorisations_when_sum_quantity_per_category_id_then_returns_sum_quantity_per_category_id() { +fn given_transaction_categorisations_when_sum_quantity_per_bucket_id_then_returns_sum_quantity_per_bucket_id() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); given_accounts(connection); - let categories = given_categories(connection); + let buckets = given_buckets(connection); given_transactions(connection); let transaction_categorisations = [ - make_fake_transaction_categorisation_builder(0).category_id(0).quantity(1).build().unwrap(), - make_fake_transaction_categorisation_builder(1).category_id(0).quantity(2).build().unwrap(), - make_fake_transaction_categorisation_builder(2).category_id(1).quantity(4).build().unwrap(), + make_fake_transaction_categorisation_builder(0).bucket_id(0).quantity(1).build().unwrap(), + make_fake_transaction_categorisation_builder(1).bucket_id(0).quantity(2).build().unwrap(), + make_fake_transaction_categorisation_builder(2).bucket_id(1).quantity(4).build().unwrap(), ]; let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection); - let sums = queries::transaction_categorisations::sum_transaction_categorisation_quantity_per_category_id(connection); + let sums = queries::transaction_categorisations::sum_transaction_categorisation_quantity_per_bucket_id(connection); assert!(sums.is_ok()); let mut sums = sums.unwrap(); sums.sort_by_key(|sum| sum.0); - assert_eq!(categories.len(), sums.len()); + assert_eq!(buckets.len(), sums.len()); assert_eq!(3, sums[0].1); assert_eq!(4, sums[1].1); } diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs index 370a0e8..a6c850e 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs @@ -1,28 +1,28 @@ use anyhow::Result; use diesel::SqliteConnection; use schist_models::{ - account::Account, account_transfer::AccountTransfer, budget_drip::BudgetDrip, category::Category, category_transfer::CategoryTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation + account::Account, account_transfer::AccountTransfer, budget_drip::BudgetDrip, bucket::Bucket, bucket_transfer::BucketTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation }; pub struct SchistState { pub first_transaction_date: DateUtc, pub accounts: Vec<Account>, pub account_transfers: Vec<AccountTransfer>, - pub categories: Vec<Category>, + pub buckets: Vec<Bucket>, pub budget_drips: Vec<BudgetDrip>, pub transactions: Vec<Transaction>, pub transaction_categorisations: Vec<TransactionCategorisation>, - pub category_transfers: Vec<CategoryTransfer>, + pub bucket_transfers: Vec<BucketTransfer>, } pub fn export_schist_state(schist_state: &SchistState, schist_connection: &mut SqliteConnection) -> Result<()> { schist_queries::clear::clear(schist_connection)?; schist_queries::accounts::insert_accounts(&schist_state.accounts, schist_connection)?; schist_queries::account_transfers::insert_account_transfers(&schist_state.account_transfers, schist_connection)?; - schist_queries::categories::insert_categories(&schist_state.categories, schist_connection)?; + schist_queries::buckets::insert_buckets(&schist_state.buckets, schist_connection)?; schist_queries::budget_drips::insert_budget_drips(&schist_state.budget_drips, schist_connection)?; schist_queries::transactions::insert_transactions(&schist_state.transactions, schist_connection)?; schist_queries::transaction_categorisations::insert_transaction_categorisations(&schist_state.transaction_categorisations, schist_connection)?; - schist_queries::category_transfers::insert_category_transfers(&schist_state.category_transfers, schist_connection)?; + schist_queries::bucket_transfers::insert_bucket_transfers(&schist_state.bucket_transfers, schist_connection)?; Ok(()) } diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs index 1163e56..01289a0 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs @@ -58,7 +58,7 @@ fn map_actualbudget_zero_budget_to_budget_drips( let budget_drips: Vec<BudgetDrip> = days_in_month.iter().map(|&date| BudgetDrip { id: transform_budget_drip_id(&actualbudget_zero_budget, &date), - category_id: transform_id(&actualbudget_zero_budget.category_id), + bucket_id: transform_id(&actualbudget_zero_budget.category_id), date, quantity: if date == first_day_of_month { quantity + remainder_quantity @@ -277,28 +277,28 @@ mod test { let budget_drips_jan_category_0: Vec<&BudgetDrip> = budget_drips .iter() - .filter(|bd| bd.category_id == category_0_id && bd.date.month() == 1) + .filter(|bd| bd.bucket_id == category_0_id && bd.date.month() == 1) .collect(); assert_eq!(31, budget_drips_jan_category_0.len()); assert!(budget_drips_jan_category_0.iter().all(|bd| bd.quantity == 100)); let budget_drips_jan_category_1: Vec<&BudgetDrip> = budget_drips .iter() - .filter(|bd| bd.category_id == category_1_id && bd.date.month() == 1) + .filter(|bd| bd.bucket_id == category_1_id && bd.date.month() == 1) .collect(); assert_eq!(31, budget_drips_jan_category_1.len()); assert!(budget_drips_jan_category_1.iter().all(|bd| bd.quantity == 200)); let budget_drips_feb_category_0: Vec<&BudgetDrip> = budget_drips .iter() - .filter(|bd| bd.category_id == category_0_id && bd.date.month() == 2) + .filter(|bd| bd.bucket_id == category_0_id && bd.date.month() == 2) .collect(); assert_eq!(29, budget_drips_feb_category_0.len()); assert!(budget_drips_feb_category_0.iter().all(|bd| bd.quantity == 110)); let budget_drips_feb_category_1: Vec<&BudgetDrip> = budget_drips .iter() - .filter(|bd| bd.category_id == category_1_id && bd.date.month() == 2) + .filter(|bd| bd.bucket_id == category_1_id && bd.date.month() == 2) .collect(); assert_eq!(29, budget_drips_feb_category_1.len()); assert!(budget_drips_feb_category_1.iter().all(|bd| bd.quantity == 210)); diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs index 17ce194..2a21860 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs @@ -1,6 +1,6 @@ use actualbudget_models::{ActualbudgetCategory, ActualbudgetZeroBudget}; use itertools::Itertools; -use schist_models::{budget_period_unit::BudgetPeriodUnit, category::Category, date_utc::DateUtc}; +use schist_models::{budget_period_unit::BudgetPeriodUnit, bucket::Bucket, date_utc::DateUtc}; use super::transform_id; @@ -8,7 +8,7 @@ pub fn transform_categories( actualbudget_categories: &[ActualbudgetCategory], actualbudget_zero_budgets: &[ActualbudgetZeroBudget], before_first_activity: &DateUtc, -) -> Vec<Category> { +) -> Vec<Bucket> { let last_non_zero_month = actualbudget_zero_budgets .iter() .map(|zb| zb.month.clone()) @@ -28,7 +28,7 @@ pub fn transform_categories( actualbudget_zero_budgets }; - actualbudget_categories.iter().map(|actualbudget_category| Category { + actualbudget_categories.iter().map(|actualbudget_category| Bucket { id: transform_id(&actualbudget_category.id.clone()), name: actualbudget_category.name.clone(), balance: 0, @@ -36,6 +36,7 @@ pub fn transform_categories( budget_period: 1, budget_period_unit: BudgetPeriodUnit::Month, budget_quantity: get_budget_quantity(actualbudget_category, actualbudget_zero_budgets), + group: String::from("un-named group"), }).collect() } @@ -75,20 +76,20 @@ mod test { ]; let before_first_transaction = DateUtc::now(); - let categories = transform_categories( + let buckets = transform_categories( &actualbudget_categories, &actualbudget_zero_budgets, &before_first_transaction, ); - assert_eq!(1, categories.len()); - let category = categories.get(0).unwrap(); - assert_eq!("Food", category.name); - assert_eq!(0, category.balance); - assert_eq!(before_first_transaction, category.balance_date); - assert_eq!(1, category.budget_period); - assert_eq!(BudgetPeriodUnit::Month, category.budget_period_unit); - assert_eq!(100, category.budget_quantity); + assert_eq!(1, buckets.len()); + let bucket = buckets.get(0).unwrap(); + assert_eq!("Food", bucket.name); + assert_eq!(0, bucket.balance); + assert_eq!(before_first_transaction, bucket.balance_date); + assert_eq!(1, bucket.budget_period); + assert_eq!(BudgetPeriodUnit::Month, bucket.budget_period_unit); + assert_eq!(100, bucket.budget_quantity); } #[test] @@ -99,20 +100,20 @@ mod test { let actualbudget_zero_budgets = []; let before_first_transaction = DateUtc::now(); - let categories = transform_categories( + let buckets = transform_categories( &actualbudget_categories, &actualbudget_zero_budgets, &before_first_transaction, ); - assert_eq!(1, categories.len()); - let category = categories.get(0).unwrap(); - assert_eq!("Food", category.name); - assert_eq!(0, category.balance); - assert_eq!(before_first_transaction, category.balance_date); - assert_eq!(1, category.budget_period); - assert_eq!(BudgetPeriodUnit::Month, category.budget_period_unit); - assert_eq!(0, category.budget_quantity); + assert_eq!(1, buckets.len()); + let bucket = buckets.get(0).unwrap(); + assert_eq!("Food", bucket.name); + assert_eq!(0, bucket.balance); + assert_eq!(before_first_transaction, bucket.balance_date); + assert_eq!(1, bucket.budget_period); + assert_eq!(BudgetPeriodUnit::Month, bucket.budget_period_unit); + assert_eq!(0, bucket.budget_quantity); } #[test] @@ -130,20 +131,20 @@ mod test { ]; let before_first_transaction = DateUtc::now(); - let categories = transform_categories( + let buckets = transform_categories( &actualbudget_categories, &actualbudget_zero_budgets, &before_first_transaction, ); - assert_eq!(1, categories.len()); - let category = categories.get(0).unwrap(); - assert_eq!("Food", category.name); - assert_eq!(0, category.balance); - assert_eq!(before_first_transaction, category.balance_date); - assert_eq!(1, category.budget_period); - assert_eq!(BudgetPeriodUnit::Month, category.budget_period_unit); - assert_eq!(300, category.budget_quantity); + assert_eq!(1, buckets.len()); + let bucket = buckets.get(0).unwrap(); + assert_eq!("Food", bucket.name); + assert_eq!(0, bucket.balance); + assert_eq!(before_first_transaction, bucket.balance_date); + assert_eq!(1, bucket.budget_period); + assert_eq!(BudgetPeriodUnit::Month, bucket.budget_period_unit); + assert_eq!(300, bucket.budget_quantity); } #[test] @@ -169,36 +170,36 @@ mod test { ]; let before_first_transaction = DateUtc::now(); - let categories = transform_categories( + let buckets = transform_categories( &actualbudget_categories, &actualbudget_zero_budgets, &before_first_transaction, ); - assert_eq!(3, categories.len()); - - let category_0 = categories.iter().filter(|c| c.id == transform_id("0")).last().unwrap(); - assert_eq!("Food", category_0.name); - assert_eq!(0, category_0.balance); - assert_eq!(before_first_transaction, category_0.balance_date); - assert_eq!(1, category_0.budget_period); - assert_eq!(BudgetPeriodUnit::Month, category_0.budget_period_unit); - assert_eq!(300, category_0.budget_quantity); - - let category_1 = categories.iter().filter(|c| c.id == transform_id("1")).last().unwrap(); - assert_eq!("Clothes", category_1.name); - assert_eq!(0, category_1.balance); - assert_eq!(before_first_transaction, category_1.balance_date); - assert_eq!(1, category_1.budget_period); - assert_eq!(BudgetPeriodUnit::Month, category_1.budget_period_unit); - assert_eq!(310, category_1.budget_quantity); - - let category_2 = categories.iter().filter(|c| c.id == transform_id("2")).last().unwrap(); - assert_eq!("Rent", category_2.name); - assert_eq!(0, category_2.balance); - assert_eq!(before_first_transaction, category_2.balance_date); - assert_eq!(1, category_2.budget_period); - assert_eq!(BudgetPeriodUnit::Month, category_2.budget_period_unit); - assert_eq!(320, category_2.budget_quantity); + assert_eq!(3, buckets.len()); + + let bucket_0 = buckets.iter().filter(|c| c.id == transform_id("0")).last().unwrap(); + assert_eq!("Food", bucket_0.name); + assert_eq!(0, bucket_0.balance); + assert_eq!(before_first_transaction, bucket_0.balance_date); + assert_eq!(1, bucket_0.budget_period); + assert_eq!(BudgetPeriodUnit::Month, bucket_0.budget_period_unit); + assert_eq!(300, bucket_0.budget_quantity); + + let bucket_1 = buckets.iter().filter(|c| c.id == transform_id("1")).last().unwrap(); + assert_eq!("Clothes", bucket_1.name); + assert_eq!(0, bucket_1.balance); + assert_eq!(before_first_transaction, bucket_1.balance_date); + assert_eq!(1, bucket_1.budget_period); + assert_eq!(BudgetPeriodUnit::Month, bucket_1.budget_period_unit); + assert_eq!(310, bucket_1.budget_quantity); + + let bucket_2 = buckets.iter().filter(|c| c.id == transform_id("2")).last().unwrap(); + assert_eq!("Rent", bucket_2.name); + assert_eq!(0, bucket_2.balance); + assert_eq!(before_first_transaction, bucket_2.balance_date); + assert_eq!(1, bucket_2.budget_period); + assert_eq!(BudgetPeriodUnit::Month, bucket_2.budget_period_unit); + assert_eq!(320, bucket_2.budget_quantity); } } diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs index 318e88c..11ed2e3 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs @@ -4,14 +4,14 @@ use actualbudget_models::{ }; use anyhow::{bail, Context, Result}; use itertools::Itertools; -use schist_models::category_transfer::CategoryTransfer; +use schist_models::bucket_transfer::BucketTransfer; use super::{is_category_transfer, transform_id}; pub fn transform_category_transfers( actualbudget_transactions: &[ActualbudgetTransaction], actualbudget_category_transfers_account: &Option<ActualbudgetAccount>, -) -> Result<Vec<CategoryTransfer>> { +) -> Result<Vec<BucketTransfer>> { let actualbudget_category_transfers = actualbudget_transactions .iter() .filter(|transaction| @@ -32,7 +32,7 @@ pub fn transform_category_transfers( .map(|pct| transform_category_transfer(pct, &actualbudget_child_category_transfers)) .filter_ok(Option::is_some) .map_ok(Option::unwrap) - .collect::<Result<Vec<CategoryTransfer>>>() + .collect::<Result<Vec<BucketTransfer>>>() .with_context(|| "failed to transform category transfers")? ) } @@ -40,7 +40,7 @@ pub fn transform_category_transfers( fn transform_category_transfer( actualbudget_parent_category_transfer: &ActualbudgetTransaction, actualbudget_child_category_transfers: &[ActualbudgetTransaction], -) -> Result<Option<CategoryTransfer>> { +) -> Result<Option<BucketTransfer>> { transform_category_transfer_without_context( actualbudget_parent_category_transfer, actualbudget_child_category_transfers, @@ -50,7 +50,7 @@ fn transform_category_transfer( fn transform_category_transfer_without_context( actualbudget_parent_category_transfer: &ActualbudgetTransaction, actualbudget_child_category_transfers: &[ActualbudgetTransaction], -) -> Result<Option<CategoryTransfer>> { +) -> Result<Option<BucketTransfer>> { let actualbudget_child_category_transfers = actualbudget_child_category_transfers .iter() .filter(|t| @@ -100,15 +100,15 @@ fn transform_category_transfer_without_context( bail!("actualbudget category transfer amounts did not sum to zero"); } - Ok(Some(CategoryTransfer { + Ok(Some(BucketTransfer { id: transform_id(&actualbudget_parent_category_transfer.id), description: actualbudget_parent_category_transfer .notes .clone() .unwrap_or_else(String::new), quantity: to_transfer.amount.try_into().unwrap(), - from_category_id, - to_category_id, + from_bucket_id: from_category_id, + to_bucket_id: to_category_id, })) } @@ -116,7 +116,7 @@ fn transform_category_transfer_without_context( mod test { use actualbudget_fakes::{actualbudget_account::make_fake_actualbudget_account, actualbudget_transaction::make_fake_actualbudget_transaction_builder}; use actualbudget_models::{ActualbudgetTransaction, ActualbudgetTransactionBuilder}; - use schist_models::category_transfer::CategoryTransfer; + use schist_models::bucket_transfer::BucketTransfer; use crate::transform_state::transform_id::transform_id; @@ -137,13 +137,13 @@ mod test { ); assert!(result.is_ok()); - let category_transfers = result.unwrap(); - assert_eq!(1, category_transfers.len()); - let category_transfer = category_transfers.get(0).unwrap(); - assert_eq!(100, category_transfer.quantity); - assert_eq!("I was a parent transaction", category_transfer.description); - assert_eq!(transform_id("0"), category_transfer.from_category_id); - assert_eq!(transform_id("1"), category_transfer.to_category_id); + let bucket_transfers = result.unwrap(); + assert_eq!(1, bucket_transfers.len()); + let bucket_transfer = bucket_transfers.get(0).unwrap(); + assert_eq!(100, bucket_transfer.quantity); + assert_eq!("I was a parent transaction", bucket_transfer.description); + assert_eq!(transform_id("0"), bucket_transfer.from_bucket_id); + assert_eq!(transform_id("1"), bucket_transfer.to_bucket_id); } #[test] @@ -166,26 +166,26 @@ mod test { ); assert!(result.is_ok()); - let category_transfers = result.unwrap(); - assert_eq!(2, category_transfers.len()); + let bucket_transfers = result.unwrap(); + assert_eq!(2, bucket_transfers.len()); - let category_transfer_0: Vec<&CategoryTransfer> = category_transfers + let bucket_transfer_0: Vec<&BucketTransfer> = bucket_transfers .iter() .filter(|ct| ct.quantity == 100) .collect(); - assert_eq!(1, category_transfer_0.len()); - let category_transfer_0 = category_transfer_0.get(0).unwrap(); - assert_eq!(transform_id("0"), category_transfer_0.from_category_id); - assert_eq!(transform_id("1"), category_transfer_0.to_category_id); + assert_eq!(1, bucket_transfer_0.len()); + let bucket_transfer_0 = bucket_transfer_0.get(0).unwrap(); + assert_eq!(transform_id("0"), bucket_transfer_0.from_bucket_id); + assert_eq!(transform_id("1"), bucket_transfer_0.to_bucket_id); - let category_transfer_1: Vec<&CategoryTransfer> = category_transfers + let bucket_transfer_1: Vec<&BucketTransfer> = bucket_transfers .iter() .filter(|ct| ct.quantity == 200) .collect(); - assert_eq!(1, category_transfer_1.len()); - let category_transfer_1 = category_transfer_1.get(0).unwrap(); - assert_eq!(transform_id("1"), category_transfer_1.from_category_id); - assert_eq!(transform_id("0"), category_transfer_1.to_category_id); + assert_eq!(1, bucket_transfer_1.len()); + let bucket_transfer_1 = bucket_transfer_1.get(0).unwrap(); + assert_eq!(transform_id("1"), bucket_transfer_1.from_bucket_id); + assert_eq!(transform_id("0"), bucket_transfer_1.to_bucket_id); } #[test] diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs index 7c64e35..575e624 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs @@ -1,5 +1,5 @@ use anyhow::{bail, Context, Result}; -use schist_models::{account::Account, category::Category, category_transfer::CategoryTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation}; +use schist_models::{account::Account, bucket::Bucket, bucket_transfer::BucketTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation}; use crate::{actualbudget_state::ActualbudgetState, schist_state::SchistState}; @@ -24,7 +24,7 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res &first_activity_date, ); let budget_drips = transform_budget_drips(&actualbudget_state.actualbudget_zero_budgets)?; - let categories: Vec<Category> = transform_categories( + let buckets: Vec<Bucket> = transform_categories( &actualbudget_state.actualbudget_categories, &actualbudget_state.actualbudget_zero_budgets, &before_first_activity_date, @@ -35,7 +35,7 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res &actualbudget_state.actualbudget_category_transfers_account, &actualbudget_state.actualbudget_payees, )?; - let category_transfers: Vec<CategoryTransfer> = transform_category_transfers( + let bucket_transfers: Vec<BucketTransfer> = transform_category_transfers( &remaining_transactions, &actualbudget_state.actualbudget_category_transfers_account, )?; @@ -44,11 +44,11 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res first_transaction_date: first_activity_date, accounts, account_transfers, - categories, + buckets, budget_drips, transactions, transaction_categorisations, - category_transfers, + bucket_transfers, }) } diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs index f7fb098..f24e8b6 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs @@ -75,7 +75,7 @@ fn transform_transactions_without_context( description: String::new(), quantity: atomic_actualbudget_transaction.amount.try_into().unwrap(), transaction_id, - category_id: transform_id(&actualbudget_category_id), + bucket_id: transform_id(&actualbudget_category_id), }); } @@ -113,7 +113,7 @@ fn transform_transactions_without_context( description: child_actualbudget_transaction.notes.clone().unwrap_or_else(String::new), quantity: child_actualbudget_transaction.amount.try_into().unwrap(), transaction_id, - category_id: transform_id(&actualbudget_category_id), + bucket_id: transform_id(&actualbudget_category_id), }); } } @@ -191,7 +191,7 @@ mod test { assert_eq!("", transaction_categorisation.description); assert_eq!(100, transaction_categorisation.quantity); assert_eq!(transaction.id, transaction_categorisation.transaction_id); - assert_eq!(transform_id("0"), transaction_categorisation.category_id); + assert_eq!(transform_id("0"), transaction_categorisation.bucket_id); } #[test] @@ -238,7 +238,7 @@ mod test { .last() .unwrap(); assert_eq!(transaction.id, transaction_categorisation_0.transaction_id); - assert_eq!(transform_id("0"), transaction_categorisation_0.category_id); + assert_eq!(transform_id("0"), transaction_categorisation_0.bucket_id); assert_eq!("notes A", transaction_categorisation_0.description); let transaction_categorisation_1 = transaction_categorisations @@ -247,7 +247,7 @@ mod test { .last() .unwrap(); assert_eq!(transaction.id, transaction_categorisation_1.transaction_id); - assert_eq!(transform_id("0"), transaction_categorisation_1.category_id); + assert_eq!(transform_id("0"), transaction_categorisation_1.bucket_id); assert_eq!("notes B", transaction_categorisation_1.description); } } diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_matchers.rs new file mode 100644 index 0000000..76189d3 --- /dev/null +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_matchers.rs @@ -0,0 +1,34 @@ +use schist_models::{budget_period_unit::BudgetPeriodUnit, bucket::Bucket}; + +use super::bucket_names::{BUCKET_NAMES, BUCKET_NAME_BILLS, BUCKET_NAME_BILLS_FLEXIBLE, BUCKET_NAME_FOOD, BUCKET_NAME_GENERAL, BUCKET_NAME_INCOME, BUCKET_NAME_SAVINGS, BUCKET_NAME_STARTING_BALANCES}; + +pub fn get_bucket_matchers( +) -> Vec<Box<dyn Fn(&Bucket) -> bool>> { + BUCKET_NAMES + .iter() + .map(|bucket_name| -> Box<dyn Fn(&Bucket) -> bool> { + Box::new(|c| matches_bucket(c, bucket_name)) + }).collect() +} + +fn matches_bucket(bucket: &Bucket, bucket_name: &str,) -> bool { + bucket.name == bucket_name + && bucket.balance == 0 + && bucket.balance_date < "2024-08-01".parse().unwrap() + && bucket.budget_period == 1 + && bucket.budget_period_unit == BudgetPeriodUnit::Month + && bucket.budget_quantity == get_expected_budget_quantity(bucket_name) +} + +fn get_expected_budget_quantity(bucket_name: &str) -> i32 { + match bucket_name { + BUCKET_NAME_FOOD => 200_00, + BUCKET_NAME_GENERAL => 100_00, + BUCKET_NAME_BILLS => 125_00, + BUCKET_NAME_BILLS_FLEXIBLE => 25_00, + BUCKET_NAME_SAVINGS => 400_00, + BUCKET_NAME_STARTING_BALANCES => 0, + BUCKET_NAME_INCOME => 0, + _ => panic!("unexpected bucket name {}", bucket_name), + } +} diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_names.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_names.rs new file mode 100644 index 0000000..5f232a8 --- /dev/null +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_names.rs @@ -0,0 +1,37 @@ +pub const BUCKET_NAME_FOOD: &str = "Food"; +pub const BUCKET_NAME_GENERAL: &str = "General"; +pub const BUCKET_NAME_BILLS: &str = "Bills"; +pub const BUCKET_NAME_BILLS_FLEXIBLE: &str = "Bills (Flexible)"; +pub const BUCKET_NAME_SAVINGS: &str = "Savings"; +pub const BUCKET_NAME_STARTING_BALANCES: &str = "Starting Balances"; +pub const BUCKET_NAME_INCOME: &str = "Income"; + +pub const BUCKET_NAMES: &[&'static str] = &[ + BUCKET_NAME_FOOD, + BUCKET_NAME_GENERAL, + BUCKET_NAME_BILLS, + BUCKET_NAME_BILLS_FLEXIBLE, + BUCKET_NAME_SAVINGS, + BUCKET_NAME_STARTING_BALANCES, + BUCKET_NAME_INCOME, +]; + +pub struct BucketNamesDict { + pub food: &'static str, + pub general: &'static str, + pub bills: &'static str, + pub bills_flexible: &'static str, + pub savings: &'static str, + pub starting_balances: &'static str, + pub income: &'static str, +} + +pub const BUCKET_NAMES_DICT: BucketNamesDict = BucketNamesDict { + food: BUCKET_NAME_FOOD, + general: BUCKET_NAME_GENERAL, + bills: BUCKET_NAME_BILLS, + bills_flexible: BUCKET_NAME_BILLS_FLEXIBLE, + savings: BUCKET_NAME_SAVINGS, + starting_balances: BUCKET_NAME_STARTING_BALANCES, + income: BUCKET_NAME_INCOME, +}; diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_transfer_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_transfer_matchers.rs new file mode 100644 index 0000000..3b46d76 --- /dev/null +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_transfer_matchers.rs @@ -0,0 +1,38 @@ +use schist_models::{bucket::Bucket, bucket_transfer::BucketTransfer}; + +use super::bucket_names::{BUCKET_NAME_GENERAL, BUCKET_NAME_SAVINGS}; + +pub fn get_bucket_transfer_matchers( +) -> Vec<Box<dyn Fn(&BucketTransfer, &[Bucket]) -> bool>> { + vec![ + Box::new(|ct, c| matches_120_savings_to_general_23_oct_2024(ct, c)), + ] +} + +fn matches_120_savings_to_general_23_oct_2024( + bucket_transfer: &BucketTransfer, + buckets: &[Bucket], +) -> bool { + let savings_bucket = buckets + .iter() + .find(|c| c.name == BUCKET_NAME_SAVINGS) + .expect("failed to find savings bucket"); + + let general_bucket = buckets + .iter() + .find(|c| c.name == BUCKET_NAME_GENERAL) + .expect("failed to find general bucket"); + + match bucket_transfer { + BucketTransfer { + id: _id, + description, + quantity: 120_00, + from_bucket_id, + to_bucket_id, + } => *from_bucket_id == savings_bucket.id + && *to_bucket_id == general_bucket.id + && description.as_str() == "", + _ => false, + } +} diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs index 04be584..97f81a2 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs @@ -1,19 +1,19 @@ use std::sync::LazyLock; -use schist_models::{budget_drip::BudgetDrip, category::Category, date_utc::DateUtc}; +use schist_models::{budget_drip::BudgetDrip, bucket::Bucket, date_utc::DateUtc}; use schist_traits::dateable::Dateable; -use crate::common::category_names::{CATEGORY_NAME_BILLS, CATEGORY_NAME_BILLS_FLEXIBLE, CATEGORY_NAME_FOOD, CATEGORY_NAME_GENERAL, CATEGORY_NAME_SAVINGS}; +use crate::common::bucket_names::{BUCKET_NAME_BILLS, BUCKET_NAME_BILLS_FLEXIBLE, BUCKET_NAME_FOOD, BUCKET_NAME_GENERAL, BUCKET_NAME_SAVINGS}; pub fn get_num_expected_budget_drips() -> usize { let num_expected_dates = DATES.len(); - let num_expected_categories = 5; - num_expected_dates * num_expected_categories + let num_expected_buckets = 5; + num_expected_dates * num_expected_buckets } pub fn assert_budget_drip_matches( budget_drip: &BudgetDrip, - categories: &[Category], + buckets: &[Bucket], ) { assert!( DATES.iter().any(|date| *LazyLock::force(date) == budget_drip.date), @@ -21,55 +21,55 @@ pub fn assert_budget_drip_matches( budget_drip, ); - let category_name = categories + let bucket_name = buckets .iter() - .find(|c| c.id == budget_drip.category_id) + .find(|c| c.id == budget_drip.bucket_id) .map(|c| c.name.clone()) .expect(format!( - "budget drip {:?} had unexpected category ID. categories were: {:?}", + "budget drip {:?} had unexpected bucket ID. buckets were: {:?}", budget_drip, - categories, + buckets, ).as_str()); let expected_quantity = match ( - category_name.as_str(), + bucket_name.as_str(), budget_drip.date.month(), budget_drip.date.day(), ) { - (CATEGORY_NAME_FOOD, 8 | 10, 1) => 6_50, - (CATEGORY_NAME_FOOD, 8 | 10, _) => 6_45, - (CATEGORY_NAME_FOOD, 9 | 11, 1) => 6_86, - (CATEGORY_NAME_FOOD, 9 | 11, _) => 6_66, - (CATEGORY_NAME_FOOD, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), + (BUCKET_NAME_FOOD, 8 | 10, 1) => 6_50, + (BUCKET_NAME_FOOD, 8 | 10, _) => 6_45, + (BUCKET_NAME_FOOD, 9 | 11, 1) => 6_86, + (BUCKET_NAME_FOOD, 9 | 11, _) => 6_66, + (BUCKET_NAME_FOOD, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), - (CATEGORY_NAME_GENERAL, 8 | 10, 1) => 3_40, - (CATEGORY_NAME_GENERAL, 8 | 10, _) => 3_22, - (CATEGORY_NAME_GENERAL, 9 | 11, 1) => 3_43, - (CATEGORY_NAME_GENERAL, 9 | 11, _) => 3_33, - (CATEGORY_NAME_GENERAL, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), + (BUCKET_NAME_GENERAL, 8 | 10, 1) => 3_40, + (BUCKET_NAME_GENERAL, 8 | 10, _) => 3_22, + (BUCKET_NAME_GENERAL, 9 | 11, 1) => 3_43, + (BUCKET_NAME_GENERAL, 9 | 11, _) => 3_33, + (BUCKET_NAME_GENERAL, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), - (CATEGORY_NAME_BILLS, 8 | 10, 1) => 4_10, - (CATEGORY_NAME_BILLS, 8 | 10, _) => 4_03, - (CATEGORY_NAME_BILLS, 9 | 11, 1) => 4_36, - (CATEGORY_NAME_BILLS, 9 | 11, _) => 4_16, - (CATEGORY_NAME_BILLS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), + (BUCKET_NAME_BILLS, 8 | 10, 1) => 4_10, + (BUCKET_NAME_BILLS, 8 | 10, _) => 4_03, + (BUCKET_NAME_BILLS, 9 | 11, 1) => 4_36, + (BUCKET_NAME_BILLS, 9 | 11, _) => 4_16, + (BUCKET_NAME_BILLS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), - (CATEGORY_NAME_BILLS_FLEXIBLE, 8 | 10, 1) => 1_00, - (CATEGORY_NAME_BILLS_FLEXIBLE, 8 | 10, _) => 80, - (CATEGORY_NAME_BILLS_FLEXIBLE, 9 | 11, 1) => 93, - (CATEGORY_NAME_BILLS_FLEXIBLE, 9 | 11, _) => 83, - (CATEGORY_NAME_BILLS_FLEXIBLE, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), + (BUCKET_NAME_BILLS_FLEXIBLE, 8 | 10, 1) => 1_00, + (BUCKET_NAME_BILLS_FLEXIBLE, 8 | 10, _) => 80, + (BUCKET_NAME_BILLS_FLEXIBLE, 9 | 11, 1) => 93, + (BUCKET_NAME_BILLS_FLEXIBLE, 9 | 11, _) => 83, + (BUCKET_NAME_BILLS_FLEXIBLE, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), - (CATEGORY_NAME_SAVINGS, 8 | 10, 1) => 13_00, - (CATEGORY_NAME_SAVINGS, 8 | 10, _) => 12_90, - (CATEGORY_NAME_SAVINGS, 9 | 11, 1) => 13_43, - (CATEGORY_NAME_SAVINGS, 9 | 11, _) => 13_33, - (CATEGORY_NAME_SAVINGS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), + (BUCKET_NAME_SAVINGS, 8 | 10, 1) => 13_00, + (BUCKET_NAME_SAVINGS, 8 | 10, _) => 12_90, + (BUCKET_NAME_SAVINGS, 9 | 11, 1) => 13_43, + (BUCKET_NAME_SAVINGS, 9 | 11, _) => 13_33, + (BUCKET_NAME_SAVINGS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip), (_, _, _) => panic!( - "budget drip {:?} had unexpected category name {}", + "budget drip {:?} had unexpected bucket name {}", budget_drip, - category_name, + bucket_name, ), }; diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_matchers.rs deleted file mode 100644 index 6660add..0000000 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_matchers.rs +++ /dev/null @@ -1,34 +0,0 @@ -use schist_models::{budget_period_unit::BudgetPeriodUnit, category::Category}; - -use super::category_names::{CATEGORY_NAMES, CATEGORY_NAME_BILLS, CATEGORY_NAME_BILLS_FLEXIBLE, CATEGORY_NAME_FOOD, CATEGORY_NAME_GENERAL, CATEGORY_NAME_INCOME, CATEGORY_NAME_SAVINGS, CATEGORY_NAME_STARTING_BALANCES}; - -pub fn get_category_matchers( -) -> Vec<Box<dyn Fn(&Category) -> bool>> { - CATEGORY_NAMES - .iter() - .map(|category_name| -> Box<dyn Fn(&Category) -> bool> { - Box::new(|c| matches_category(c, category_name)) - }).collect() -} - -fn matches_category(category: &Category, category_name: &str,) -> bool { - category.name == category_name - && category.balance == 0 - && category.balance_date < "2024-08-01".parse().unwrap() - && category.budget_period == 1 - && category.budget_period_unit == BudgetPeriodUnit::Month - && category.budget_quantity == get_expected_budget_quantity(category_name) -} - -fn get_expected_budget_quantity(category_name: &str) -> i32 { - match category_name { - CATEGORY_NAME_FOOD => 200_00, - CATEGORY_NAME_GENERAL => 100_00, - CATEGORY_NAME_BILLS => 125_00, - CATEGORY_NAME_BILLS_FLEXIBLE => 25_00, - CATEGORY_NAME_SAVINGS => 400_00, - CATEGORY_NAME_STARTING_BALANCES => 0, - CATEGORY_NAME_INCOME => 0, - _ => panic!("unexpected category name {}", category_name), - } -} diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_names.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_names.rs deleted file mode 100644 index 601f294..0000000 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_names.rs +++ /dev/null @@ -1,37 +0,0 @@ -pub const CATEGORY_NAME_FOOD: &str = "Food"; -pub const CATEGORY_NAME_GENERAL: &str = "General"; -pub const CATEGORY_NAME_BILLS: &str = "Bills"; -pub const CATEGORY_NAME_BILLS_FLEXIBLE: &str = "Bills (Flexible)"; -pub const CATEGORY_NAME_SAVINGS: &str = "Savings"; -pub const CATEGORY_NAME_STARTING_BALANCES: &str = "Starting Balances"; -pub const CATEGORY_NAME_INCOME: &str = "Income"; - -pub const CATEGORY_NAMES: &[&'static str] = &[ - CATEGORY_NAME_FOOD, - CATEGORY_NAME_GENERAL, - CATEGORY_NAME_BILLS, - CATEGORY_NAME_BILLS_FLEXIBLE, - CATEGORY_NAME_SAVINGS, - CATEGORY_NAME_STARTING_BALANCES, - CATEGORY_NAME_INCOME, -]; - -pub struct CategoryNamesDict { - pub food: &'static str, - pub general: &'static str, - pub bills: &'static str, - pub bills_flexible: &'static str, - pub savings: &'static str, - pub starting_balances: &'static str, - pub income: &'static str, -} - -pub const CATEGORY_NAMES_DICT: CategoryNamesDict = CategoryNamesDict { - food: CATEGORY_NAME_FOOD, - general: CATEGORY_NAME_GENERAL, - bills: CATEGORY_NAME_BILLS, - bills_flexible: CATEGORY_NAME_BILLS_FLEXIBLE, - savings: CATEGORY_NAME_SAVINGS, - starting_balances: CATEGORY_NAME_STARTING_BALANCES, - income: CATEGORY_NAME_INCOME, -}; diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs deleted file mode 100644 index 6d11c8a..0000000 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs +++ /dev/null @@ -1,38 +0,0 @@ -use schist_models::{category::Category, category_transfer::CategoryTransfer}; - -use super::category_names::{CATEGORY_NAME_GENERAL, CATEGORY_NAME_SAVINGS}; - -pub fn get_category_transfer_matchers( -) -> Vec<Box<dyn Fn(&CategoryTransfer, &[Category]) -> bool>> { - vec![ - Box::new(|ct, c| matches_120_savings_to_general_23_oct_2024(ct, c)), - ] -} - -fn matches_120_savings_to_general_23_oct_2024( - category_transfer: &CategoryTransfer, - categories: &[Category], -) -> bool { - let savings_category = categories - .iter() - .find(|c| c.name == CATEGORY_NAME_SAVINGS) - .expect("failed to find savings category"); - - let general_category = categories - .iter() - .find(|c| c.name == CATEGORY_NAME_GENERAL) - .expect("failed to find general category"); - - match category_transfer { - CategoryTransfer { - id: _id, - description, - quantity: 120_00, - from_category_id, - to_category_id, - } => *from_category_id == savings_category.id - && *to_category_id == general_category.id - && description.as_str() == "", - _ => false, - } -} diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs index c67f62e..62255b0 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs @@ -2,9 +2,9 @@ mod account_matchers; mod account_names; mod account_transfer_matchers; mod budget_drip_matchers; -mod category_matchers; -mod category_names; -mod category_transfer_matchers; +mod bucket_matchers; +mod bucket_names; +mod bucket_transfer_matchers; mod db_url; mod test_context; mod transaction_matchers; @@ -15,9 +15,9 @@ pub use account_names::ACCOUNT_NAMES_DICT; pub use account_transfer_matchers::get_account_transfer_matchers; pub use budget_drip_matchers::assert_budget_drip_matches; pub use budget_drip_matchers::get_num_expected_budget_drips; -pub use category_names::CATEGORY_NAMES_DICT; -pub use category_matchers::get_category_matchers; -pub use category_transfer_matchers::get_category_transfer_matchers; +pub use bucket_names::BUCKET_NAMES_DICT; +pub use bucket_matchers::get_bucket_matchers; +pub use bucket_transfer_matchers::get_bucket_transfer_matchers; pub use db_url::TEST_IN_DB_URL; pub use db_url::TEST_OUT_DB_URL; pub use test_context::TestContext; diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs index 04ce6a7..8082055 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs @@ -1,9 +1,9 @@ -use schist_models::{account::Account, category::Category, transaction::Transaction, transaction_categorisation::TransactionCategorisation}; +use schist_models::{account::Account, bucket::Bucket, transaction::Transaction, transaction_categorisation::TransactionCategorisation}; -use super::{category_names::{CATEGORY_NAME_FOOD, CATEGORY_NAME_INCOME, CATEGORY_NAME_STARTING_BALANCES}, matches_bank_account_initial_transaction, matches_cash_account_initial_transaction, matches_food_transaction, matches_income_transaction}; +use super::{bucket_names::{BUCKET_NAME_FOOD, BUCKET_NAME_INCOME, BUCKET_NAME_STARTING_BALANCES}, matches_bank_account_initial_transaction, matches_cash_account_initial_transaction, matches_food_transaction, matches_income_transaction}; pub fn get_transaction_categorisation_matchers( -) -> Vec<Box<dyn Fn(&TransactionCategorisation, &[Transaction], &[Category], &[Account]) -> bool>> { +) -> Vec<Box<dyn Fn(&TransactionCategorisation, &[Transaction], &[Bucket], &[Account]) -> bool>> { vec![ Box::new(|tc, t, c, a| matches_bank_account_initial_transaction_categorisation(tc, t, c, a)), Box::new(|tc, t, c, a| matches_cash_account_initial_transaction_categorisation(tc, t, c, a)), @@ -21,7 +21,7 @@ pub fn get_transaction_categorisation_matchers( fn matches_bank_account_initial_transaction_categorisation( transaction_categorisation: &TransactionCategorisation, transactions: &[Transaction], - categories: &[Category], + buckets: &[Bucket], accounts: &[Account], ) -> bool { let bank_account_initial_transaction = transactions @@ -29,10 +29,10 @@ fn matches_bank_account_initial_transaction_categorisation( .find(|t| matches_bank_account_initial_transaction(t, accounts)) .expect("failed to find bank account initial transaction"); - let starting_balance_category = categories + let starting_balance_bucket = buckets .iter() - .find(|c| c.name == CATEGORY_NAME_STARTING_BALANCES) - .expect("failed to find starting balance category"); + .find(|c| c.name == BUCKET_NAME_STARTING_BALANCES) + .expect("failed to find starting balance bucket"); match transaction_categorisation { TransactionCategorisation { @@ -40,10 +40,10 @@ fn matches_bank_account_initial_transaction_categorisation( description, quantity: 1200_00, transaction_id, - category_id, + bucket_id, } => description == "" && *transaction_id == bank_account_initial_transaction.id - && *category_id == starting_balance_category.id, + && *bucket_id == starting_balance_bucket.id, _ => false, } } @@ -51,7 +51,7 @@ fn matches_bank_account_initial_transaction_categorisation( fn matches_cash_account_initial_transaction_categorisation( transaction_categorisation: &TransactionCategorisation, transactions: &[Transaction], - categories: &[Category], + buckets: &[Bucket], accounts: &[Account], ) -> bool { let cash_account_initial_transaction = transactions @@ -59,10 +59,10 @@ fn matches_cash_account_initial_transaction_categorisation( .find(|t| matches_cash_account_initial_transaction(t, accounts)) .expect("failed to find cash account initial transaction"); - let starting_balance_category = categories + let starting_balance_bucket = buckets .iter() - .find(|c| c.name == CATEGORY_NAME_STARTING_BALANCES) - .expect("failed to find starting balance category"); + .find(|c| c.name == BUCKET_NAME_STARTING_BALANCES) + .expect("failed to find starting balance bucket"); match transaction_categorisation { TransactionCategorisation { @@ -70,10 +70,10 @@ fn matches_cash_account_initial_transaction_categorisation( description, quantity: 45_10, transaction_id, - category_id, + bucket_id, } => description == "" && *transaction_id == cash_account_initial_transaction.id - && *category_id == starting_balance_category.id, + && *bucket_id == starting_balance_bucket.id, _ => false, } } @@ -81,7 +81,7 @@ fn matches_cash_account_initial_transaction_categorisation( fn matches_income_transaction_categorisation( transaction_categorisation: &TransactionCategorisation, transactions: &[Transaction], - categories: &[Category], + buckets: &[Bucket], accounts: &[Account], month: &str, ) -> bool { @@ -90,10 +90,10 @@ fn matches_income_transaction_categorisation( .find(|t| matches_income_transaction(t, accounts, month)) .expect(format!("failed to find income transaction for month {}", month).as_str()); - let income_category = categories + let income_bucket = buckets .iter() - .find(|c| c.name == CATEGORY_NAME_INCOME) - .expect("failed to find income category"); + .find(|c| c.name == BUCKET_NAME_INCOME) + .expect("failed to find income bucket"); match transaction_categorisation { TransactionCategorisation { @@ -101,10 +101,10 @@ fn matches_income_transaction_categorisation( description, quantity: 846_46, transaction_id, - category_id, + bucket_id, } => description == "" && *transaction_id == income_transaction.id - && *category_id == income_category.id, + && *bucket_id == income_bucket.id, _ => false, } } @@ -112,7 +112,7 @@ fn matches_income_transaction_categorisation( fn matches_food_transaction_categorisation( transaction_categorisation: &TransactionCategorisation, transactions: &[Transaction], - categories: &[Category], + buckets: &[Bucket], accounts: &[Account], month: &str, ) -> bool { @@ -121,10 +121,10 @@ fn matches_food_transaction_categorisation( .find(|t| matches_food_transaction(t, accounts, month)) .expect(format!("failed to find food transaction for month {}", month).as_str()); - let food_category = categories + let food_bucket = buckets .iter() - .find(|c| c.name == CATEGORY_NAME_FOOD) - .expect("failed to find food category"); + .find(|c| c.name == BUCKET_NAME_FOOD) + .expect("failed to find food bucket"); match transaction_categorisation { TransactionCategorisation { @@ -132,10 +132,10 @@ fn matches_food_transaction_categorisation( description, quantity: -200_00, transaction_id, - category_id, + bucket_id, } => description == "" && *transaction_id == food_transaction.id - && *category_id == food_category.id, + && *bucket_id == food_bucket.id, _ => false, } } diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs index e882dc5..4c13d55 100644 --- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs +++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs @@ -1,9 +1,9 @@ pub mod common; use actualbudget_to_schist_transformer::run::run; -use common::{assert_budget_drip_matches, get_account_matchers, get_account_transfer_matchers, get_category_matchers, get_category_transfer_matchers, get_num_expected_budget_drips, get_transaction_categorisation_matchers, get_transaction_matchers, TestContext, TEST_IN_DB_URL, TEST_OUT_DB_URL}; +use common::{assert_budget_drip_matches, get_account_matchers, get_account_transfer_matchers, get_bucket_matchers, get_bucket_transfer_matchers, get_num_expected_budget_drips, get_transaction_categorisation_matchers, get_transaction_matchers, TestContext, TEST_IN_DB_URL, TEST_OUT_DB_URL}; use diesel::{Connection, SqliteConnection}; -use schist_queries::{account_transfers::get_all_account_transfers, accounts::get_all_accounts, budget_drips::get_all_budget_drips, categories::get_all_categories, category_transfers::get_all_category_transfers, transaction_categorisations::get_all_transaction_categorisations, transactions::get_all_transactions}; +use schist_queries::{account_transfers::get_all_account_transfers, accounts::get_all_accounts, budget_drips::get_all_budget_drips, buckets::get_all_buckets, bucket_transfers::get_all_bucket_transfers, transaction_categorisations::get_all_transaction_categorisations, transactions::get_all_transactions}; #[test] fn given_test_database_when_run_then_exports_expected_schist_state() { @@ -13,8 +13,8 @@ fn given_test_database_when_run_then_exports_expected_schist_state() { let accounts = get_all_accounts(connection).unwrap(); let account_transfers = get_all_account_transfers(connection).unwrap(); let budget_drips = get_all_budget_drips(connection).unwrap(); - let categories = get_all_categories(connection).unwrap(); - let category_transfers = get_all_category_transfers(connection).unwrap(); + let buckets = get_all_buckets(connection).unwrap(); + let bucket_transfers = get_all_bucket_transfers(connection).unwrap(); let transactions = get_all_transactions(connection).unwrap(); let transaction_categorisations = get_all_transaction_categorisations(connection).unwrap(); @@ -40,26 +40,26 @@ fn given_test_database_when_run_then_exports_expected_schist_state() { assert_eq!(get_num_expected_budget_drips(), budget_drips.len()); for budget_drip in budget_drips { - assert_budget_drip_matches(&budget_drip, &categories); + assert_budget_drip_matches(&budget_drip, &buckets); } - let category_matchers = get_category_matchers(); - assert_eq!(category_matchers.len(), categories.len()); - for category in categories.clone() { + let bucket_matchers = get_bucket_matchers(); + assert_eq!(bucket_matchers.len(), buckets.len()); + for bucket in buckets.clone() { assert!( - category_matchers.iter().any(|m| m(&category)), - "no match found for category {:?}", - category, + bucket_matchers.iter().any(|m| m(&bucket)), + "no match found for bucket {:?}", + bucket, ); } - let category_transfer_matchers = get_category_transfer_matchers(); - assert_eq!(category_transfer_matchers.len(), category_transfers.len()); - for category_transfer in category_transfers { + let bucket_transfer_matchers = get_bucket_transfer_matchers(); + assert_eq!(bucket_transfer_matchers.len(), bucket_transfers.len()); + for bucket_transfer in bucket_transfers { assert!( - category_transfer_matchers.iter().any(|m| m(&category_transfer, &categories)), - "no match found for category_transfer {:?}", - category_transfer, + bucket_transfer_matchers.iter().any(|m| m(&bucket_transfer, &buckets)), + "no match found for bucket_transfer {:?}", + bucket_transfer, ); } @@ -80,7 +80,7 @@ fn given_test_database_when_run_then_exports_expected_schist_state() { transaction_categorisation_matchers.iter().any(|m| m( &transaction_categorisation, &transactions, - &categories, + &buckets, &accounts, )), "no match found for transaction_categorisation {:?}", |
