Subversion Repositories SmartDukaan

Rev

Rev 37180 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
37167 amit 1
package com.spice.profitmandi.service;
2
 
3
import com.spice.profitmandi.dao.enumuration.dtr.AgendaType;
4
import org.junit.Test;
5
 
6
import java.util.HashMap;
7
import java.util.Map;
8
 
9
import static org.junit.Assert.assertEquals;
10
 
11
public class AgendaRuleDecisionTest {
12
 
13
    private static Map<String, Double> params(Object... kv) {
14
        Map<String, Double> m = new HashMap<>();
15
        for (int i = 0; i < kv.length; i += 2) {
16
            m.put((String) kv[i], ((Number) kv[i + 1]).doubleValue());
17
        }
18
        return m;
19
    }
20
 
21
    private static Map<String, Double> salesDefaults() {
22
        return params("flagPct", 40, "clearPct", 75, "baselineDays", 90, "windowDays", 30);
23
    }
24
 
25
    private static AgendaRuleDecider.Inputs baseInputs() {
26
        AgendaRuleDecider.Inputs in = new AgendaRuleDecider.Inputs();
27
        in.fofoId = 1;
28
        in.revival = false;
29
        in.storeActivatedRecently = false;
30
        in.minInvestment = 300000;
31
        in.shortPercentage = 10d;
32
        in.baselineAmt = 300000; // monthlyBaseline = 100000
33
        in.currentAmt = 100000;
34
        in.lastBillDaysAgo = 3;
35
        in.oldestLoanAgeDays = null;
36
        in.pendingLoanAmt = 0;
37
        return in;
38
    }
39
 
40
    private static Map<AgendaType, AgendaRuleDecider.Decision> decide(AgendaRuleDecider.Inputs in) {
41
        return AgendaRuleDecider.decide(in,
42
                params("shortPct", 50), salesDefaults(), params("gapDays", 15), params("loanAgeDays", 20));
43
    }
44
 
45
    @Test
46
    public void salesHysteresisHoldsBetweenBarriers() {
47
        AgendaRuleDecider.Inputs in = baseInputs();
48
        in.currentAmt = 60000; // 60% of baseline: between 40 and 75
49
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(in).get(AgendaType.LOW_SALES).action);
50
    }
51
 
52
    @Test
53
    public void salesFlagsBelow40AndClearsAbove75() {
54
        AgendaRuleDecider.Inputs in = baseInputs();
55
        in.currentAmt = 39999;
56
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_SALES).action);
57
        in.currentAmt = 75001;
58
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.LOW_SALES).action);
59
    }
60
 
61
    @Test
62
    public void salesSkipsOnZeroBaselineAndYoungStores() {
63
        AgendaRuleDecider.Inputs in = baseInputs();
64
        in.baselineAmt = 0;
65
        in.currentAmt = 0;
66
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(in).get(AgendaType.LOW_SALES).action);
67
        AgendaRuleDecider.Inputs young = baseInputs();
68
        young.storeActivatedRecently = true;
69
        young.currentAmt = 0;
70
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(young).get(AgendaType.LOW_SALES).action);
71
    }
72
 
73
    @Test
37181 amit 74
    public void rulesKeepTheirOwnLifecycleUnderRevival() {
75
        // Revival suppression is display-layer only (filterVisibleForVisit) —
76
        // the decider evaluates every rule on data regardless of revival.
37167 amit 77
        AgendaRuleDecider.Inputs in = baseInputs();
78
        in.revival = true;
37181 amit 79
        in.lastBillDaysAgo = 200;
80
        in.shortPercentage = 90d;
81
        in.currentAmt = 0;
82
        in.oldestLoanAgeDays = 45;
37180 amit 83
        in.pendingLoanAmt = 10000;
84
        Map<AgendaType, AgendaRuleDecider.Decision> d = decide(in);
37181 amit 85
        assertEquals(AgendaRuleDecider.Action.OPEN, d.get(AgendaType.LOW_PURCHASE).action);
86
        assertEquals(AgendaRuleDecider.Action.OPEN, d.get(AgendaType.LOW_INVESTMENT).action);
87
        assertEquals(AgendaRuleDecider.Action.OPEN, d.get(AgendaType.LOW_SALES).action);
37180 amit 88
        assertEquals(AgendaRuleDecider.Action.OPEN, d.get(AgendaType.CREDIT_DUES).action);
89
        assertEquals(AgendaRuleDecider.Action.OPEN, d.get(AgendaType.REVIVAL).action);
37167 amit 90
    }
91
 
92
    @Test
93
    public void purchaseFlagsAtGapAndNeverBilled() {
94
        AgendaRuleDecider.Inputs in = baseInputs();
95
        in.lastBillDaysAgo = 15; // exactly gapDays
96
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_PURCHASE).action);
97
        in.lastBillDaysAgo = null; // never billed, non-revival
98
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_PURCHASE).action);
99
        in.lastBillDaysAgo = 14;
100
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.LOW_PURCHASE).action);
101
    }
102
 
103
    @Test
104
    public void creditFlagsAtExactThreshold() {
105
        AgendaRuleDecider.Inputs in = baseInputs();
106
        in.oldestLoanAgeDays = 20;
107
        in.pendingLoanAmt = 50000;
108
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.CREDIT_DUES).action);
109
        in.oldestLoanAgeDays = 19;
110
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.CREDIT_DUES).action);
111
    }
112
 
113
    @Test
114
    public void investmentUsesFiftyTriggerAndSkipsWhenUncomputable() {
115
        AgendaRuleDecider.Inputs in = baseInputs();
116
        in.shortPercentage = 51d;
117
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_INVESTMENT).action);
118
        in.shortPercentage = 50d;
119
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.LOW_INVESTMENT).action);
120
        in.shortPercentage = null;
121
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(in).get(AgendaType.LOW_INVESTMENT).action);
122
    }
123
}