post-push-party 0.1.7

Push code, earn points, throw a party!
Documentation
use super::{BonusTrack, PushContext, Reward, Tier};

/// base points earned per commit
pub struct CommitValue;

static TIERS: &[Tier] = &[
    Tier {
        cost: 0,
        reward: Reward::FlatPoints(1),
    },
    Tier {
        cost: 25,
        reward: Reward::FlatPoints(2),
    },
    Tier {
        cost: 200,
        reward: Reward::FlatPoints(3),
    },
    Tier {
        cost: 2_000,
        reward: Reward::FlatPoints(4),
    },
    Tier {
        cost: 20_000,
        reward: Reward::FlatPoints(5),
    },
];

impl BonusTrack for CommitValue {
    fn id(&self) -> &'static str {
        "commit_value"
    }

    fn name(&self) -> &'static str {
        "Commit Value"
    }

    fn description(&self) -> &'static str {
        "How many party points you earn per commit."
    }

    fn tiers(&self) -> &'static [Tier] {
        TIERS
    }

    fn applies(&self, _ctx: &PushContext) -> u32 {
        1 // always applies
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::{
        bonus_track::Clock,
        git::Push,
        storage::{DbConnection, PushHistory},
    };

    #[test]
    fn tiers_start_free() {
        let tiers = CommitValue.tiers();
        assert_eq!(tiers[0].cost, 0);
        assert_eq!(tiers[0].reward, Reward::FlatPoints(1));
    }

    #[test]
    fn always_applies() {
        let conn = DbConnection::create_in_memory().unwrap();

        let push = Push::new(vec![]);
        let ctx = PushContext {
            push: &push,
            history: &PushHistory::new(&conn),
            clock: &Clock::default(),
        };
        assert_eq!(CommitValue.applies(&ctx), 1);
    }
}