overtime-live-trading-utils 2.1.36 → 2.1.37-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.circleci/config.yml +32 -32
  2. package/.prettierrc +9 -9
  3. package/codecov.yml +20 -20
  4. package/index.ts +26 -26
  5. package/jest.config.ts +16 -16
  6. package/main.js +1 -1
  7. package/package.json +30 -30
  8. package/src/constants/common.ts +8 -7
  9. package/src/constants/errors.ts +7 -6
  10. package/src/constants/sports.ts +78 -78
  11. package/src/enums/sports.ts +109 -109
  12. package/src/tests/mock/MockLeagueMap.ts +200 -170
  13. package/src/tests/mock/MockOpticOddsEvents.ts +662 -662
  14. package/src/tests/mock/MockOpticSoccer.ts +9864 -9378
  15. package/src/tests/mock/MockSoccerRedis.ts +2308 -2308
  16. package/src/tests/unit/bookmakers.test.ts +148 -79
  17. package/src/tests/unit/markets.test.ts +176 -156
  18. package/src/tests/unit/odds.test.ts +103 -92
  19. package/src/tests/unit/resolution.test.ts +1488 -1488
  20. package/src/tests/unit/sports.test.ts +58 -58
  21. package/src/tests/unit/spread.test.ts +144 -131
  22. package/src/tests/utils/helper.ts +10 -0
  23. package/src/types/bookmakers.ts +7 -0
  24. package/src/types/missing-types.d.ts +2 -2
  25. package/src/types/odds.ts +80 -61
  26. package/src/types/resolution.ts +96 -96
  27. package/src/types/sports.ts +22 -19
  28. package/src/utils/bookmakers.ts +315 -159
  29. package/src/utils/constraints.ts +210 -210
  30. package/src/utils/gameMatching.ts +81 -81
  31. package/src/utils/markets.ts +119 -119
  32. package/src/utils/odds.ts +947 -918
  33. package/src/utils/opticOdds.ts +71 -71
  34. package/src/utils/resolution.ts +319 -319
  35. package/src/utils/sportPeriodMapping.ts +36 -36
  36. package/src/utils/sports.ts +51 -51
  37. package/src/utils/spread.ts +97 -97
  38. package/tsconfig.json +16 -16
  39. package/webpack.config.js +24 -24
  40. package/CLAUDE.md +0 -84
  41. package/resolution_live_markets.md +0 -356
@@ -1,79 +1,148 @@
1
- import { DIFF_BETWEEN_BOOKMAKERS_MESSAGE, ZERO_ODDS_MESSAGE } from '../../constants/errors';
2
- import { processMarket } from '../../utils/markets';
3
- import { mapOpticOddsApiFixtureOdds } from '../../utils/opticOdds';
4
- import { LeagueMocks } from '../mock/MockLeagueMap';
5
- import { MockOnlyMoneyline, MockOnlyMoneylineWithDifferentSportsbook } from '../mock/MockOpticSoccer';
6
- import { mockSoccer } from '../mock/MockSoccerRedis';
7
-
8
- describe('Bookmakers', () => {
9
- it('Should return zero odds for moneyline when one of the bookmakers has no odds', () => {
10
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
11
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneyline));
12
- const market = processMarket(
13
- freshMockSoccer,
14
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
15
- ['draftkings', 'bovada'],
16
- [],
17
- true,
18
- undefined,
19
- undefined,
20
- LeagueMocks.leagueInfoEnabledSpeadAndTotals
21
- );
22
-
23
- const hasOdds = market.odds.some(
24
- (odd: any) => odd.american !== 0 || odd.decimal !== 0 || odd.normalizedImplied !== 0
25
- );
26
-
27
- expect(hasOdds).toBe(false);
28
- expect(market).toHaveProperty('errorMessage');
29
- expect(market.errorMessage).toBe(ZERO_ODDS_MESSAGE);
30
- expect(market.childMarkets.length).toBe(0);
31
- });
32
-
33
- it('Should return zero odds for moneyline when there is quote diff between bookmakers', () => {
34
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
35
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneylineWithDifferentSportsbook));
36
- const market = processMarket(
37
- freshMockSoccer,
38
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
39
- ['draftkings', 'bovada'],
40
- [],
41
- true,
42
- undefined,
43
- 5,
44
- LeagueMocks.leagueInfoOnlyParent
45
- );
46
-
47
- const hasOdds = market.odds.some(
48
- (odd: any) => odd.american !== 0 || odd.decimal !== 0 || odd.normalizedImplied !== 0
49
- );
50
-
51
- expect(hasOdds).toBe(false);
52
- expect(market).toHaveProperty('errorMessage');
53
- expect(market.errorMessage).toBe(DIFF_BETWEEN_BOOKMAKERS_MESSAGE);
54
- expect(market.childMarkets.length).toBe(0);
55
- });
56
-
57
- it('Should return zero odds for moneyline as no matching bookmaker was provided', () => {
58
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
59
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneyline));
60
- const market = processMarket(
61
- freshMockSoccer,
62
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
63
- ['bovada', 'draftkings'],
64
- [],
65
- true,
66
- undefined,
67
- undefined,
68
- LeagueMocks.leagueInfoEnabledSpeadAndTotals
69
- );
70
-
71
- const hasOdds = market.odds.some(
72
- (odd: any) => odd.american !== 0 || odd.decimal !== 0 || odd.normalizedImplied !== 0
73
- );
74
-
75
- expect(hasOdds).toBe(false);
76
- expect(market).toHaveProperty('errorMessage');
77
- expect(market.errorMessage).toBe(ZERO_ODDS_MESSAGE); // should be no matching bookmakers mesage
78
- });
79
- });
1
+ import { DIFF_BETWEEN_BOOKMAKERS_MESSAGE, ZERO_ODDS_MESSAGE } from '../../constants/errors';
2
+ import { processMarket } from '../../utils/markets';
3
+ import { mapOpticOddsApiFixtureOdds } from '../../utils/opticOdds';
4
+ import { LeagueMocks } from '../mock/MockLeagueMap';
5
+ import {
6
+ MockOddsChildMarketsDifferentBookmakers,
7
+ MockOddsChildMarketsDifferentBookmakersPercentageDiff,
8
+ MockOnlyMoneyline,
9
+ MockOnlyMoneylineWithDifferentSportsbook,
10
+ } from '../mock/MockOpticSoccer';
11
+ import { mockSoccer } from '../mock/MockSoccerRedis';
12
+ import { getLastPolledMapForBookmakers, MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST } from '../utils/helper';
13
+
14
+ const lastPolledMap = getLastPolledMapForBookmakers();
15
+
16
+ describe('Bookmakers', () => {
17
+ it('Should return zero odds for moneyline when one of the bookmakers has no odds', () => {
18
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
19
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneyline));
20
+ const market = processMarket(
21
+ freshMockSoccer,
22
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
23
+ ['draftkings', 'bovada'],
24
+ [],
25
+ true,
26
+ undefined,
27
+ undefined,
28
+ LeagueMocks.leagueInfoEnabledSpeadAndTotals,
29
+ lastPolledMap,
30
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
31
+ );
32
+
33
+ const hasOdds = market.odds.some(
34
+ (odd: any) => odd.american !== 0 || odd.decimal !== 0 || odd.normalizedImplied !== 0
35
+ );
36
+
37
+ expect(hasOdds).toBe(false);
38
+ expect(market).toHaveProperty('errorMessage');
39
+ expect(market.errorMessage).toBe(ZERO_ODDS_MESSAGE);
40
+ });
41
+
42
+ it('Should return zero odds for moneyline when there is quote diff between bookmakers', () => {
43
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
44
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneylineWithDifferentSportsbook));
45
+ const market = processMarket(
46
+ freshMockSoccer,
47
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
48
+ ['draftkings', 'bovada'],
49
+ [],
50
+ true,
51
+ undefined,
52
+ 5,
53
+ LeagueMocks.leagueInfoOnlyParent,
54
+ lastPolledMap,
55
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
56
+ );
57
+
58
+ const hasOdds = market.odds.some(
59
+ (odd: any) => odd.american !== 0 || odd.decimal !== 0 || odd.normalizedImplied !== 0
60
+ );
61
+
62
+ expect(hasOdds).toBe(false);
63
+ expect(market).toHaveProperty('errorMessage');
64
+ expect(market.errorMessage).toBe(DIFF_BETWEEN_BOOKMAKERS_MESSAGE);
65
+ });
66
+
67
+ it('Should return zero odds for moneyline as no matching bookmaker was provided', () => {
68
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
69
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneyline));
70
+ const market = processMarket(
71
+ freshMockSoccer,
72
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
73
+ ['bovada', 'draftkings'],
74
+ [],
75
+ true,
76
+ undefined,
77
+ undefined,
78
+ LeagueMocks.leagueInfoEnabledSpeadAndTotals,
79
+ lastPolledMap,
80
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
81
+ );
82
+
83
+ const hasOdds = market.odds.some(
84
+ (odd: any) => odd.american !== 0 || odd.decimal !== 0 || odd.normalizedImplied !== 0
85
+ );
86
+
87
+ expect(hasOdds).toBe(false);
88
+ expect(market).toHaveProperty('errorMessage');
89
+ expect(market.errorMessage).toBe(ZERO_ODDS_MESSAGE); // should be no matching bookmakers mesage
90
+ });
91
+
92
+ it('Should return odds that have both bookmakers', () => {
93
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
94
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOddsChildMarketsDifferentBookmakers));
95
+ const market = processMarket(
96
+ freshMockSoccer,
97
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
98
+ ['bovada', 'draftkings'],
99
+ [],
100
+ true,
101
+ undefined,
102
+ undefined,
103
+ LeagueMocks.leagueInfoEnabledSpeadAndTotals,
104
+ lastPolledMap,
105
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
106
+ );
107
+
108
+ expect(market.childMarkets.length).toBe(2);
109
+ });
110
+
111
+ it('Should return all odds from draftkings', () => {
112
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
113
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOddsChildMarketsDifferentBookmakers));
114
+ const market = processMarket(
115
+ freshMockSoccer,
116
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
117
+ ['bovada', 'draftkings'],
118
+ [],
119
+ true,
120
+ undefined,
121
+ undefined,
122
+ LeagueMocks.leaguInfoDifferentPrimaryBookmaker,
123
+ lastPolledMap,
124
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
125
+ );
126
+
127
+ expect(market.childMarkets.length).toBe(3);
128
+ });
129
+
130
+ it('Should cut odds that are different between bookmakers', () => {
131
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
132
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOddsChildMarketsDifferentBookmakersPercentageDiff));
133
+ const market = processMarket(
134
+ freshMockSoccer,
135
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
136
+ ['bovada', 'draftkings'],
137
+ [],
138
+ true,
139
+ undefined,
140
+ undefined,
141
+ LeagueMocks.leagueInfoEnabledSpeadAndTotals,
142
+ lastPolledMap,
143
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
144
+ );
145
+
146
+ expect(market.childMarkets.length).toBe(1);
147
+ });
148
+ });
@@ -1,156 +1,176 @@
1
- import { NO_MARKETS_FOR_LEAGUE_ID } from '../../constants/errors';
2
- import { processMarket } from '../../utils/markets';
3
- import { mapOpticOddsApiFixtureOdds } from '../../utils/opticOdds';
4
- import { LeagueMocks } from '../mock/MockLeagueMap';
5
- import { MockOnlyMoneyline, MockOpticSoccer } from '../mock/MockOpticSoccer';
6
- import { mockSoccer } from '../mock/MockSoccerRedis';
7
-
8
- describe('Markets', () => {
9
- describe('LeagueMap configuration', () => {
10
- it('Should return an empty array for child markets when they are not added to list', () => {
11
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
12
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
13
-
14
- const market = processMarket(
15
- freshMockSoccer,
16
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
17
- ['draftkings'],
18
- [],
19
- true,
20
- undefined,
21
- undefined,
22
- LeagueMocks.leagueInfoOnlyParent
23
- );
24
-
25
- expect(market.childMarkets).toHaveLength(0);
26
- });
27
-
28
- it('Should return an empty array for child markets when they are disabled', () => {
29
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
30
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
31
- const market = processMarket(
32
- freshMockSoccer,
33
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
34
- ['draftkings'],
35
- [],
36
- true,
37
- undefined,
38
- undefined,
39
- LeagueMocks.leagueInfoMockDisabledChilds
40
- );
41
-
42
- expect(market.childMarkets).toHaveLength(0);
43
- });
44
-
45
- it('Should return only spread child markets without total child markets', () => {
46
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
47
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
48
- const market = processMarket(
49
- freshMockSoccer,
50
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
51
- ['draftkings'],
52
- [],
53
- true,
54
- undefined,
55
- undefined,
56
- LeagueMocks.leagueInfoEnabledSpreadDisabledTotals
57
- );
58
-
59
- const containsSpread = market.childMarkets.some((child: any) => child.type === 'spread');
60
- const containsTotal = market.childMarkets.some((child: any) => child.type === 'total');
61
-
62
- expect(containsSpread).toBe(true);
63
- expect(containsTotal).toBe(false);
64
- });
65
-
66
- it('Should return both totals and spread child markets', () => {
67
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
68
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
69
- const market = processMarket(
70
- freshMockSoccer,
71
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
72
- ['draftkings'],
73
- [],
74
- true,
75
- undefined,
76
- undefined,
77
- LeagueMocks.leagueInfoEnabledSpeadAndTotals
78
- );
79
-
80
- const containsSpread = market.childMarkets.some((child: any) => child.type === 'spread');
81
- const containsTotal = market.childMarkets.some((child: any) => child.type === 'total');
82
-
83
- expect(containsSpread).toBe(true);
84
- expect(containsTotal).toBe(true);
85
- });
86
-
87
- it('Should return all child markets', () => {
88
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
89
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
90
- const market = processMarket(
91
- freshMockSoccer,
92
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
93
- ['draftkings'],
94
- [],
95
- true,
96
- undefined,
97
- undefined,
98
- LeagueMocks.leagueInfoEnabledAll
99
- );
100
-
101
- const containsSpread = market.childMarkets.some((child: any) => child.type === 'spread');
102
- const containsTotal = market.childMarkets.some((child: any) => child.type === 'total');
103
- const containsChildMoneyline = market.childMarkets.some(
104
- (child: any) => child.type === 'secondPeriodWinner'
105
- );
106
- const containsChildCorrectScore = market.childMarkets.some((child: any) => child.type === 'correctScore');
107
- const containsChildDoubleChance = market.childMarkets.some((child: any) => child.type === 'doubleChance');
108
- const containsChildGG = market.childMarkets.some((child: any) => child.type === 'bothTeamsToScore');
109
- const containsChildGG1stHalf = market.childMarkets.some(
110
- (child: any) => child.type === 'firstPeriodBothTeamsToScore'
111
- );
112
- const containsChildGG2ndHalf = market.childMarkets.some(
113
- (child: any) => child.type === 'secondPeriodBothTeamsToScore'
114
- );
115
- const containsChildDrawNoBet = market.childMarkets.some((child: any) => child.type === 'drawNoBet');
116
- const containsWillThereBeOvertime = market.childMarkets.some(
117
- (child: any) => child.type === 'willThereBeOvertime'
118
- );
119
-
120
- expect(containsChildGG).toBe(true);
121
- expect(containsChildGG1stHalf).toBe(true);
122
- expect(containsChildGG2ndHalf).toBe(true);
123
- expect(containsSpread).toBe(true);
124
- expect(containsTotal).toBe(true);
125
- expect(containsChildMoneyline).toBe(true);
126
- expect(containsChildCorrectScore).toBe(true);
127
- expect(containsChildDoubleChance).toBe(true);
128
- expect(containsChildGG).toBe(true);
129
- expect(containsChildDrawNoBet).toBe(true);
130
- expect(containsWillThereBeOvertime).toBe(true);
131
- });
132
-
133
- it('Should return warning message that there are is no configuration available in league map csv', () => {
134
- const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
135
- const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneyline));
136
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
137
-
138
- processMarket(
139
- freshMockSoccer,
140
- mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
141
- ['draftkings'],
142
- [],
143
- true,
144
- undefined,
145
- undefined,
146
- LeagueMocks.leagueInfoOnlyParentDiffSportId
147
- );
148
-
149
- expect(warnSpy).toHaveBeenCalled();
150
- expect(warnSpy).toHaveBeenCalledWith(`${NO_MARKETS_FOR_LEAGUE_ID}: ${Number(mockSoccer.leagueId)}`);
151
-
152
- // Restore the original implementation
153
- warnSpy.mockRestore();
154
- });
155
- });
156
- });
1
+ import { NO_MARKETS_FOR_LEAGUE_ID } from '../../constants/errors';
2
+ import { processMarket } from '../../utils/markets';
3
+ import { mapOpticOddsApiFixtureOdds } from '../../utils/opticOdds';
4
+ import { LeagueMocks } from '../mock/MockLeagueMap';
5
+ import { MockOnlyMoneyline, MockOpticSoccer } from '../mock/MockOpticSoccer';
6
+ import { mockSoccer } from '../mock/MockSoccerRedis';
7
+ import { getLastPolledMapForBookmakers, MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST } from '../utils/helper';
8
+
9
+ const lastPolledMap = getLastPolledMapForBookmakers();
10
+
11
+ describe('Markets', () => {
12
+ describe('LeagueMap configuration', () => {
13
+ it('Should return an empty array for child markets when they are not added to list', () => {
14
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
15
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
16
+
17
+ const market = processMarket(
18
+ freshMockSoccer,
19
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
20
+ ['draftkings'],
21
+ [],
22
+ true,
23
+ undefined,
24
+ undefined,
25
+ LeagueMocks.leagueInfoOnlyParent,
26
+ lastPolledMap,
27
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
28
+ );
29
+
30
+ expect(market.childMarkets).toHaveLength(0);
31
+ });
32
+
33
+ it('Should return an empty array for child markets when they are disabled', () => {
34
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
35
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
36
+ const market = processMarket(
37
+ freshMockSoccer,
38
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
39
+ ['draftkings'],
40
+ [],
41
+ true,
42
+ undefined,
43
+ undefined,
44
+ LeagueMocks.leagueInfoMockDisabledChilds,
45
+ lastPolledMap,
46
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
47
+ );
48
+
49
+ expect(market.childMarkets).toHaveLength(0);
50
+ });
51
+
52
+ it('Should return only spread child markets without total child markets', () => {
53
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
54
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
55
+ const market = processMarket(
56
+ freshMockSoccer,
57
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
58
+ ['draftkings'],
59
+ [],
60
+ true,
61
+ undefined,
62
+ undefined,
63
+ LeagueMocks.leagueInfoEnabledSpreadDisabledTotals,
64
+ lastPolledMap,
65
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
66
+ );
67
+
68
+ const containsSpread = market.childMarkets.some((child: any) => child.type === 'spread');
69
+ const containsTotal = market.childMarkets.some((child: any) => child.type === 'total');
70
+
71
+ expect(containsSpread).toBe(true);
72
+ expect(containsTotal).toBe(false);
73
+ });
74
+
75
+ it('Should return both totals and spread child markets', () => {
76
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
77
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
78
+ const market = processMarket(
79
+ freshMockSoccer,
80
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
81
+ ['draftkings'],
82
+ [],
83
+ true,
84
+ undefined,
85
+ undefined,
86
+ LeagueMocks.leagueInfoEnabledSpeadAndTotals,
87
+ lastPolledMap,
88
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
89
+ );
90
+
91
+ const containsSpread = market.childMarkets.some((child: any) => child.type === 'spread');
92
+ const containsTotal = market.childMarkets.some((child: any) => child.type === 'total');
93
+
94
+ expect(containsSpread).toBe(true);
95
+ expect(containsTotal).toBe(true);
96
+ });
97
+
98
+ it('Should return all child markets', () => {
99
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
100
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOpticSoccer));
101
+ const market = processMarket(
102
+ freshMockSoccer,
103
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
104
+ ['draftkings'],
105
+ [],
106
+ true,
107
+ undefined,
108
+ undefined,
109
+ LeagueMocks.leagueInfoEnabledAll,
110
+ lastPolledMap,
111
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
112
+ );
113
+
114
+ const containsSpread = market.childMarkets.some((child: any) => child.type === 'spread');
115
+ const containsTotal = market.childMarkets.some((child: any) => child.type === 'total');
116
+ const containsChildMoneyline = market.childMarkets.some(
117
+ (child: any) => child.type === 'secondPeriodWinner'
118
+ );
119
+ const containsChildCorrectScore = market.childMarkets.some((child: any) => child.type === 'correctScore');
120
+ const containsChildDoubleChance = market.childMarkets.some((child: any) => child.type === 'doubleChance');
121
+ const containsChildGG = market.childMarkets.some((child: any) => child.type === 'bothTeamsToScore');
122
+ const containsChildGG1stHalf = market.childMarkets.some(
123
+ (child: any) => child.type === 'firstPeriodBothTeamsToScore'
124
+ );
125
+ const containsChildGG2ndHalf = market.childMarkets.some(
126
+ (child: any) => child.type === 'secondPeriodBothTeamsToScore'
127
+ );
128
+ const containsChildDrawNoBet = market.childMarkets.some((child: any) => child.type === 'drawNoBet');
129
+ const containsWillThereBeOvertime = market.childMarkets.some(
130
+ (child: any) => child.type === 'willThereBeOvertime'
131
+ );
132
+
133
+ const containsTeamTotalHome = market.childMarkets.some((child: any) => child.type === 'totalHomeTeam');
134
+ const containsTeamTotalAway = market.childMarkets.some((child: any) => child.type === 'totalAwayTeam');
135
+
136
+ expect(containsChildGG).toBe(true);
137
+ expect(containsChildGG1stHalf).toBe(true);
138
+ expect(containsChildGG2ndHalf).toBe(true);
139
+ expect(containsSpread).toBe(true);
140
+ expect(containsTotal).toBe(true);
141
+ expect(containsChildMoneyline).toBe(true);
142
+ expect(containsChildCorrectScore).toBe(true);
143
+ expect(containsChildDoubleChance).toBe(true);
144
+ expect(containsChildGG).toBe(true);
145
+ expect(containsChildDrawNoBet).toBe(true);
146
+ expect(containsWillThereBeOvertime).toBe(true);
147
+ expect(containsTeamTotalHome).toBe(true);
148
+ expect(containsTeamTotalAway).toBe(true);
149
+ });
150
+
151
+ it('Should return warning message that there are is no configuration available in league map csv', () => {
152
+ const freshMockSoccer = JSON.parse(JSON.stringify(mockSoccer));
153
+ const freshMockOpticSoccer = JSON.parse(JSON.stringify(MockOnlyMoneyline));
154
+ const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
155
+
156
+ processMarket(
157
+ freshMockSoccer,
158
+ mapOpticOddsApiFixtureOdds([freshMockOpticSoccer])[0],
159
+ ['draftkings'],
160
+ [],
161
+ true,
162
+ undefined,
163
+ undefined,
164
+ LeagueMocks.leagueInfoOnlyParentDiffSportId,
165
+ lastPolledMap,
166
+ MAX_ALLOWED_PROVIDER_DATA_STALE_DELAY_TEST
167
+ );
168
+
169
+ expect(warnSpy).toHaveBeenCalled();
170
+ expect(warnSpy).toHaveBeenCalledWith(`${NO_MARKETS_FOR_LEAGUE_ID}: ${Number(mockSoccer.leagueId)}`);
171
+
172
+ // Restore the original implementation
173
+ warnSpy.mockRestore();
174
+ });
175
+ });
176
+ });