summaryrefslogtreecommitdiff
path: root/rust/schist_queries/src/utils/calculate_budgets_accrual.rs
blob: ca829537e49ad06769834997ed60d7cb7e104e1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use anyhow::Result;
use schist_models::{
    budget_drip::BudgetDrip,
    category::Category,
};

pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip]) -> Result<i64> {
    Ok(budget_drips
        .iter()
        .filter(|bd| bd.category_id == category.id)
        .map(|bd| Into::<i64>::into(bd.quantity))
        .sum()
    )
}

#[cfg(test)]
mod test {
    use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category};

    use super::calculate_budgets_accrual;

    #[test]
    fn when_no_budget_drips_then_return_zero() {
        let category = make_fake_category(0);
        let budget_drips = [];

        let result = calculate_budgets_accrual(&category, &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);
        let budget_drips = [
            make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(),
        ];

        let result = calculate_budgets_accrual(&category, &budget_drips);

        assert!(result.is_ok());
        assert_eq!(result.unwrap(), 0_i64);
    }

    #[test]
    fn when_one_budget_drip_then_return_quantity() {
        let category = make_fake_category(0);
        let budget_drips = [
            make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(),
        ];

        let result = calculate_budgets_accrual(&category, &budget_drips);

        assert!(result.is_ok());
        assert_eq!(result.unwrap(), 100);
    }

    #[test]
    fn when_two_budget_drips_then_return_sum() {
        let category = make_fake_category(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(),
        ];

        let result = calculate_budgets_accrual(&category, &budget_drips);

        assert!(result.is_ok());
        assert_eq!(result.unwrap(), 220);
    }
}