| import test from 'node:test'; |
| import assert from 'node:assert/strict'; |
| import { parseBetInput } from '../src/parser.js'; |
|
|
| test('parses labeled multiline input in any order', () => { |
| const parsed = parseBetInput({ |
| stake: '$25', |
| odds: '-110', |
| prop: 'Jayson Tatum over 29.5 points', |
| book: 'FanDuel', |
| sport: 'NBA', |
| }); |
|
|
| assert.equal(parsed.ok, true); |
| assert.equal(parsed.bet.book, 'FanDuel'); |
| assert.equal(parsed.bet.oddsInput, '-110'); |
| assert.equal(parsed.bet.stake, 25); |
| }); |
|
|
| test('parses decimal or american odds from structured fields', () => { |
| const parsed = parseBetInput({ |
| stake: '20', |
| odds: '+135', |
| prop: 'Celtics ML', |
| book: 'DraftKings', |
| sport: 'NBA', |
| }); |
|
|
| assert.equal(parsed.ok, true); |
| assert.equal(parsed.bet.book, 'DraftKings'); |
| assert.equal(parsed.bet.oddsInput, '+135'); |
| assert.equal(parsed.bet.stake, 20); |
| assert.match(parsed.bet.prop, /Celtics ML/i); |
| }); |
|
|
| test('accepts larger decimal odds values', () => { |
| const parsed = parseBetInput({ |
| stake: '10', |
| odds: '11.0', |
| prop: 'JJ WetherGoat 1+ HR', |
| book: 'BetMGM', |
| sport: 'MLB', |
| }); |
|
|
| assert.equal(parsed.ok, true); |
| assert.equal(parsed.bet.oddsInput, '11.0'); |
| assert.equal(parsed.bet.normalizedDecimalOdds, 11); |
| }); |
|
|
| test('accepts large american odds values', () => { |
| const parsed = parseBetInput({ |
| stake: '$2.50', |
| odds: '+119484', |
| prop: '4 leg home run parlay', |
| book: 'FanDuel', |
| sport: 'MLB', |
| }); |
|
|
| assert.equal(parsed.ok, true); |
| assert.equal(parsed.bet.oddsInput, '+119484'); |
| assert.equal(parsed.bet.stake, 2.5); |
| assert.equal(parsed.bet.normalizedDecimalOdds, 1195.84); |
| }); |
|
|
| test('reports missing fields for incomplete input', () => { |
| const parsed = parseBetInput({ |
| stake: '', |
| odds: '', |
| prop: 'Knicks ML', |
| book: 'FanDuel', |
| sport: 'NBA', |
| }); |
|
|
| assert.equal(parsed.ok, false); |
| assert.deepEqual(parsed.missingFields.sort(), ['odds', 'stake']); |
| }); |
|
|