diff --git a/.pnp.cjs b/.pnp.cjs index eebef6adb76..59039cbeac7 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -3342,6 +3342,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/chai", "npm:4.2.21"], ["@types/chai-spies", "npm:1.0.3"], ["@types/express", "npm:4.17.13"], + ["@types/jest", "npm:27.0.1"], ["@types/luxon", "npm:1.27.1"], ["@types/mocha", "npm:9.0.0"], ["@types/node", "npm:14.17.12"], @@ -3358,10 +3359,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["hardhat-deploy", "virtual:894c7069f8aed076d3839d4f435fd974974296cafbca8e3355fff9d622c82029c9e05eeefeb9e2521cd2b7d885c2414fbaa802b29fb061bade185d5a82c32171#npm:0.8.11"], ["hardhat-docgen", "virtual:894c7069f8aed076d3839d4f435fd974974296cafbca8e3355fff9d622c82029c9e05eeefeb9e2521cd2b7d885c2414fbaa802b29fb061bade185d5a82c32171#npm:1.1.1"], ["hardhat-typechain", "virtual:894c7069f8aed076d3839d4f435fd974974296cafbca8e3355fff9d622c82029c9e05eeefeb9e2521cd2b7d885c2414fbaa802b29fb061bade185d5a82c32171#npm:0.3.5"], + ["jest", "virtual:532fdf4c5364453a90c37bb5287483fa331782ecfc41fc8a238ae4c5b9ecbfa540f6b4c584d3930549b0f5a0f6dd6c0d866dbdf0879570565599d51c3b649109#npm:27.0.6"], ["luxon", "npm:1.28.0"], ["mockdate", "npm:3.0.5"], ["resolve", "patch:resolve@npm%3A1.20.0#~builtin::version=1.20.0&hash=00b1ff"], ["rewire", "npm:5.0.0"], + ["ts-jest", "virtual:894c7069f8aed076d3839d4f435fd974974296cafbca8e3355fff9d622c82029c9e05eeefeb9e2521cd2b7d885c2414fbaa802b29fb061bade185d5a82c32171#npm:27.0.5"], ["tslib", "npm:2.3.1"], ["typechain", "npm:4.0.3"], ["typescript", "patch:typescript@npm%3A4.3.5#~builtin::version=4.3.5&hash=d8b4e7"] @@ -7200,6 +7203,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["chalk", "npm:4.1.2"] ], "linkType": "HARD", + }], + ["npm:27.1.0", { + "packageLocation": "./.yarn/cache/@jest-types-npm-27.1.0-6cd20a4327-11899aba81.zip/node_modules/@jest/types/", + "packageDependencies": [ + ["@jest/types", "npm:27.1.0"], + ["@types/istanbul-lib-coverage", "npm:2.0.3"], + ["@types/istanbul-reports", "npm:3.0.1"], + ["@types/node", "npm:16.7.2"], + ["@types/yargs", "npm:16.0.4"], + ["chalk", "npm:4.1.2"] + ], + "linkType": "HARD", }] ]], ["@jsdevtools/ono", [ @@ -11457,6 +11472,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD", }] ]], + ["bs-logger", [ + ["npm:0.2.6", { + "packageLocation": "./.yarn/cache/bs-logger-npm-0.2.6-7670f88b66-d34bdaf68c.zip/node_modules/bs-logger/", + "packageDependencies": [ + ["bs-logger", "npm:0.2.6"], + ["fast-json-stable-stringify", "npm:2.1.0"] + ], + "linkType": "HARD", + }] + ]], ["bs58", [ ["npm:4.0.1", { "packageLocation": "./.yarn/cache/bs58-npm-4.0.1-8d2a7822b1-b3c5365bb9.zip/node_modules/bs58/", @@ -19131,6 +19156,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["picomatch", "npm:2.3.0"] ], "linkType": "HARD", + }], + ["npm:27.1.0", { + "packageLocation": "./.yarn/cache/jest-util-npm-27.1.0-0391e5fd84-8f42fb7b44.zip/node_modules/jest-util/", + "packageDependencies": [ + ["jest-util", "npm:27.1.0"], + ["@jest/types", "npm:27.1.0"], + ["@types/node", "npm:16.7.2"], + ["chalk", "npm:4.1.2"], + ["graceful-fs", "npm:4.2.8"], + ["is-ci", "npm:3.0.0"], + ["picomatch", "npm:2.3.0"] + ], + "linkType": "HARD", }] ]], ["jest-validate", [ @@ -27108,6 +27146,48 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD", }] ]], + ["ts-jest", [ + ["npm:27.0.5", { + "packageLocation": "./.yarn/cache/ts-jest-npm-27.0.5-9336f30efa-fd53cdb6f9.zip/node_modules/ts-jest/", + "packageDependencies": [ + ["ts-jest", "npm:27.0.5"] + ], + "linkType": "SOFT", + }], + ["virtual:894c7069f8aed076d3839d4f435fd974974296cafbca8e3355fff9d622c82029c9e05eeefeb9e2521cd2b7d885c2414fbaa802b29fb061bade185d5a82c32171#npm:27.0.5", { + "packageLocation": "./.yarn/__virtual__/ts-jest-virtual-b178d641ce/0/cache/ts-jest-npm-27.0.5-9336f30efa-fd53cdb6f9.zip/node_modules/ts-jest/", + "packageDependencies": [ + ["ts-jest", "virtual:894c7069f8aed076d3839d4f435fd974974296cafbca8e3355fff9d622c82029c9e05eeefeb9e2521cd2b7d885c2414fbaa802b29fb061bade185d5a82c32171#npm:27.0.5"], + ["@babel/core", null], + ["@types/babel-jest", null], + ["@types/babel__core", null], + ["@types/jest", "npm:27.0.1"], + ["@types/typescript", null], + ["babel-jest", null], + ["bs-logger", "npm:0.2.6"], + ["fast-json-stable-stringify", "npm:2.1.0"], + ["jest", "virtual:532fdf4c5364453a90c37bb5287483fa331782ecfc41fc8a238ae4c5b9ecbfa540f6b4c584d3930549b0f5a0f6dd6c0d866dbdf0879570565599d51c3b649109#npm:27.0.6"], + ["jest-util", "npm:27.1.0"], + ["json5", "npm:2.2.0"], + ["lodash", "npm:4.17.21"], + ["make-error", "npm:1.3.6"], + ["semver", "npm:7.3.5"], + ["typescript", "patch:typescript@npm%3A4.3.5#~builtin::version=4.3.5&hash=d8b4e7"], + ["yargs-parser", "npm:20.2.9"] + ], + "packagePeers": [ + "@babel/core", + "@types/babel-jest", + "@types/babel__core", + "@types/jest", + "@types/typescript", + "babel-jest", + "jest", + "typescript" + ], + "linkType": "HARD", + }] + ]], ["ts-node", [ ["npm:10.2.1", { "packageLocation": "./.yarn/cache/ts-node-npm-10.2.1-18dc22b42d-f37d2827a5.zip/node_modules/ts-node/", diff --git a/.yarn/cache/@jest-types-npm-27.1.0-6cd20a4327-11899aba81.zip b/.yarn/cache/@jest-types-npm-27.1.0-6cd20a4327-11899aba81.zip new file mode 100644 index 00000000000..1ec3d837c47 Binary files /dev/null and b/.yarn/cache/@jest-types-npm-27.1.0-6cd20a4327-11899aba81.zip differ diff --git a/.yarn/cache/bs-logger-npm-0.2.6-7670f88b66-d34bdaf68c.zip b/.yarn/cache/bs-logger-npm-0.2.6-7670f88b66-d34bdaf68c.zip new file mode 100644 index 00000000000..c741a6bf2ea Binary files /dev/null and b/.yarn/cache/bs-logger-npm-0.2.6-7670f88b66-d34bdaf68c.zip differ diff --git a/.yarn/cache/jest-util-npm-27.1.0-0391e5fd84-8f42fb7b44.zip b/.yarn/cache/jest-util-npm-27.1.0-0391e5fd84-8f42fb7b44.zip new file mode 100644 index 00000000000..33c4becf54b Binary files /dev/null and b/.yarn/cache/jest-util-npm-27.1.0-0391e5fd84-8f42fb7b44.zip differ diff --git a/.yarn/cache/ts-jest-npm-27.0.5-9336f30efa-fd53cdb6f9.zip b/.yarn/cache/ts-jest-npm-27.0.5-9336f30efa-fd53cdb6f9.zip new file mode 100644 index 00000000000..a4e91f06040 Binary files /dev/null and b/.yarn/cache/ts-jest-npm-27.0.5-9336f30efa-fd53cdb6f9.zip differ diff --git a/packages/composites/augur/jest.config.js b/packages/composites/augur/jest.config.js new file mode 100644 index 00000000000..97cb83671ab --- /dev/null +++ b/packages/composites/augur/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +} diff --git a/packages/composites/augur/package.json b/packages/composites/augur/package.json index 6f7007a31ab..255291048b5 100644 --- a/packages/composites/augur/package.json +++ b/packages/composites/augur/package.json @@ -55,6 +55,7 @@ "@types/chai": "^4.2.21", "@types/chai-spies": "^1", "@types/express": "*", + "@types/jest": "^27.0.1", "@types/luxon": "^1.27.1", "@types/mocha": "^9.0.0", "@types/node": "^14.14.35", @@ -70,6 +71,8 @@ "hardhat-deploy": "0.8.11", "hardhat-docgen": "^1.1.0", "hardhat-typechain": "^0.3.5", + "jest": "^27.0.6", + "ts-jest": "^27.0.5", "typechain": "^4.0.3", "typescript": "^4.2.3" } diff --git a/packages/composites/augur/src/dataProviders/sportsdataio.ts b/packages/composites/augur/src/dataProviders/sportsdataio.ts index 00ca1e464e7..7d9a4ab699a 100644 --- a/packages/composites/augur/src/dataProviders/sportsdataio.ts +++ b/packages/composites/augur/src/dataProviders/sportsdataio.ts @@ -33,7 +33,7 @@ interface NFLEvent { OverUnder: number | null } -interface TeamSchedule { +export interface TeamSchedule { Date: string GameID: number AwayTeamName: string @@ -346,7 +346,7 @@ export const createTeam: Execute = async (input, context) => { awayTeamName: event.AwayTeamName, awayTeamId: event.AwayTeamID, startTime, - homeSpread: event.PointSpread || 0, + homeSpread: calcHomeSpread(event), totalScore: event.OverUnder || 0, createSpread: event.PointSpread !== null, createTotalScore: event.OverUnder !== null, @@ -364,6 +364,31 @@ export const createTeam: Execute = async (input, context) => { }) } +export function calcHomeSpread(event: TeamSchedule): number { + const { HomeTeamMoneyLine, AwayTeamMoneyLine, PointSpread } = event + if (HomeTeamMoneyLine === null) return 0 + if (AwayTeamMoneyLine === null) return 0 + if (PointSpread === null) return 0 + + // If one is negative then it's favored. + // If both are negative then the most-negative is favored. + // Ergo, the smallest is favored. + const homeFavored = HomeTeamMoneyLine < AwayTeamMoneyLine + + // Here we canculate home spread specifically, which should be positive is home is favored. + return homeFavored ? ensurePositive(PointSpread) : ensureNegative(PointSpread) +} + +export function ensureNegative(n: number): number { + if (n > 0) n = -n + return n +} + +export function ensurePositive(n: number): number { + if (n < 0) n = -n + return n +} + interface FightSchedule { Active: boolean DateTime: string diff --git a/packages/composites/augur/test/unit/calculations.test.ts b/packages/composites/augur/test/unit/calculations.test.ts new file mode 100644 index 00000000000..c10f85da5a6 --- /dev/null +++ b/packages/composites/augur/test/unit/calculations.test.ts @@ -0,0 +1,67 @@ +import { + calcHomeSpread, + ensureNegative, + ensurePositive, + TeamSchedule, +} from '../../src/dataProviders/sportsdataio' + +describe('calculations', () => { + describe('calcHomeSpread', () => { + enum r { + zero, + positive, + negative, + } + const testcases = [ + // favor the most negative line + { spread: 1.5, home: -1, away: +1, result: 1.5 }, + { spread: 1.5, home: -2, away: -1, result: 1.5 }, + { spread: 1.5, home: +1, away: -1, result: -1.5 }, + { spread: 1.5, home: -1, away: -2, result: -1.5 }, + + // input sign shouldn't matter + { spread: -1.5, home: -1, away: +1, result: 1.5 }, + { spread: -1.5, home: -2, away: -1, result: 1.5 }, + { spread: -1.5, home: +1, away: -1, result: -1.5 }, + { spread: -1.5, home: -1, away: -2, result: -1.5 }, + + // if lines are the same then spread should be zero anyway + { spread: 0, home: -1, away: -1, result: 0 }, + + // if a field is missing then return zero + { spread: null, home: -1, away: -1, result: 0 }, + { spread: 1.5, home: null, away: -1, result: 0 }, + { spread: 1.5, home: -1, away: null, result: 0 }, + ] + + for (const testcase of testcases) { + const { spread, home, away, result } = testcase + it(`calc with lines ${home}:${away} :: ${spread} -> ${result}`, () => { + const event = makeFakeEvent({ + PointSpread: spread, + HomeTeamMoneyLine: home, + AwayTeamMoneyLine: away, + }) + const calc = calcHomeSpread(event) + expect(calc).toEqual(result) + }) + } + }) +}) + +function makeFakeEvent(override: Partial): TeamSchedule { + return { + Date: '', + GameID: 0, + AwayTeamName: '', + AwayTeamID: 0, + HomeTeamName: '', + HomeTeamID: 0, + Status: '', + PointSpread: null, + AwayTeamMoneyLine: null, + HomeTeamMoneyLine: null, + OverUnder: null, + ...override, + } +} diff --git a/yarn.lock b/yarn.lock index a72c27b62e3..c9cc7463d88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1480,6 +1480,7 @@ __metadata: "@types/chai": ^4.2.21 "@types/chai-spies": ^1 "@types/express": "*" + "@types/jest": ^27.0.1 "@types/luxon": ^1.27.1 "@types/mocha": ^9.0.0 "@types/node": ^14.14.35 @@ -1496,10 +1497,12 @@ __metadata: hardhat-deploy: 0.8.11 hardhat-docgen: ^1.1.0 hardhat-typechain: ^0.3.5 + jest: ^27.0.6 luxon: ^1.27.0 mockdate: ^3.0.5 resolve: 1.20.0 rewire: ^5.0.0 + ts-jest: ^27.0.5 tslib: ^2.1.0 typechain: ^4.0.3 typescript: ^4.2.3 @@ -5024,6 +5027,19 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^27.1.0": + version: 27.1.0 + resolution: "@jest/types@npm:27.1.0" + dependencies: + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^16.0.0 + chalk: ^4.0.0 + checksum: 11899aba8103e00332baab35eb7ed435e4e06b270d02ca75fc6ccf08e41f36abae7b25d623377da47596c3e817c102e79e99caf717e6ec8eb78a85fdaa439ee8 + languageName: node + linkType: hard + "@jsdevtools/ono@npm:^7.1.3": version: 7.1.3 resolution: "@jsdevtools/ono@npm:7.1.3" @@ -8480,6 +8496,15 @@ __metadata: languageName: node linkType: hard +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + "bs58@npm:*, bs58@npm:^4.0.0, bs58@npm:^4.0.1": version: 4.0.1 resolution: "bs58@npm:4.0.1" @@ -11974,7 +11999,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb @@ -15127,6 +15152,20 @@ fsevents@~2.1.1: languageName: node linkType: hard +"jest-util@npm:^27.0.0": + version: 27.1.0 + resolution: "jest-util@npm:27.1.0" + dependencies: + "@jest/types": ^27.1.0 + "@types/node": "*" + chalk: ^4.0.0 + graceful-fs: ^4.2.4 + is-ci: ^3.0.0 + picomatch: ^2.2.3 + checksum: 8f42fb7b448749d7f5ebc3580eee0be2ab3f1ac4ab9adb52e737fe9083df3c963b781c819a94cc5ca463e186caa32ebfede1bc43d1fc3cadb5c5f930073ecc80 + languageName: node + linkType: hard + "jest-util@npm:^27.0.6": version: 27.0.6 resolution: "jest-util@npm:27.0.6" @@ -15455,6 +15494,17 @@ fsevents@~2.1.1: languageName: node linkType: hard +"json5@npm:2.x, json5@npm:^2.1.2": + version: 2.2.0 + resolution: "json5@npm:2.2.0" + dependencies: + minimist: ^1.2.5 + bin: + json5: lib/cli.js + checksum: e88fc5274bb58fc99547baa777886b069d2dd96d9cfc4490b305fd16d711dabd5979e35a4f90873cefbeb552e216b041a304fe56702bedba76e19bc7845f208d + languageName: node + linkType: hard + "json5@npm:^0.5.0, json5@npm:^0.5.1": version: 0.5.1 resolution: "json5@npm:0.5.1" @@ -15475,17 +15525,6 @@ fsevents@~2.1.1: languageName: node linkType: hard -"json5@npm:^2.1.2": - version: 2.2.0 - resolution: "json5@npm:2.2.0" - dependencies: - minimist: ^1.2.5 - bin: - json5: lib/cli.js - checksum: e88fc5274bb58fc99547baa777886b069d2dd96d9cfc4490b305fd16d711dabd5979e35a4f90873cefbeb552e216b041a304fe56702bedba76e19bc7845f208d - languageName: node - linkType: hard - "jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" @@ -16458,7 +16497,7 @@ fsevents@~2.1.1: languageName: node linkType: hard -"lodash@npm:*, lodash@npm:^4.17.11, lodash@npm:^4.17.12, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.3, lodash@npm:^4.17.4, lodash@npm:^4.7.0": +"lodash@npm:*, lodash@npm:4.x, lodash@npm:^4.17.11, lodash@npm:^4.17.12, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.3, lodash@npm:^4.17.4, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -16628,7 +16667,7 @@ fsevents@~2.1.1: languageName: node linkType: hard -"make-error@npm:^1.1.1": +"make-error@npm:1.x, make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -20623,7 +20662,7 @@ resolve@1.17.0: languageName: node linkType: hard -"semver@npm:*, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5": +"semver@npm:*, semver@npm:7.x, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5": version: 7.3.5 resolution: "semver@npm:7.3.5" dependencies: @@ -22375,6 +22414,37 @@ resolve@1.17.0: languageName: node linkType: hard +"ts-jest@npm:^27.0.5": + version: 27.0.5 + resolution: "ts-jest@npm:27.0.5" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^27.0.0 + json5: 2.x + lodash: 4.x + make-error: 1.x + semver: 7.x + yargs-parser: 20.x + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@types/jest": ^27.0.0 + babel-jest: ">=27.0.0 <28" + jest: ^27.0.0 + typescript: ">=3.8 <5.0" + peerDependenciesMeta: + "@babel/core": + optional: true + "@types/jest": + optional: true + babel-jest: + optional: true + bin: + ts-jest: cli.js + checksum: fd53cdb6f913cbe802799d2b491f70f33c52c840c4b8483cecf600ff360efbd00c8d7ed9eb0dd677219f330ee38928b7b9890e9853e9f4d3574b9d8e1dcf4a30 + languageName: node + linkType: hard + "ts-node@npm:^10.2.1": version: 10.2.1 resolution: "ts-node@npm:10.2.1" @@ -24241,6 +24311,13 @@ resolve@1.17.0: languageName: node linkType: hard +"yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + languageName: node + linkType: hard + "yargs-parser@npm:^2.4.1": version: 2.4.1 resolution: "yargs-parser@npm:2.4.1" @@ -24251,13 +24328,6 @@ resolve@1.17.0: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 - languageName: node - linkType: hard - "yargs-parser@npm:^7.0.0": version: 7.0.0 resolution: "yargs-parser@npm:7.0.0"