const test = require('node:test') const assert = require('node:assert/strict') const { createMockContext } = require('../src/context/createMockContext') const registerPlayerPromotionFulfillmentJourneyRoute = require('../src/routes/ewl/bal/playerPromotionFulfillmentJourney') const registerPlayerPromotionFulfillmentJourneyDetailRoute = require('../src/routes/ewl/bal/playerPromotionFulfillmentJourneyDetail') const { buildFulfillmentJourneyResponse } = registerPlayerPromotionFulfillmentJourneyRoute.__internal const { buildFulfillmentJourneyDetailResponse } = registerPlayerPromotionFulfillmentJourneyDetailRoute.__internal function withEnv(overrides, fn) { const previousValues = new Map() for (const [key, value] of Object.entries(overrides)) { previousValues.set(key, process.env[key]) if (value === undefined) { delete process.env[key] } else { process.env[key] = value } } try { return fn() } finally { for (const [key, value] of previousValues.entries()) { if (value === undefined) { delete process.env[key] } else { process.env[key] = value } } } } function createRegisteredPostRoute(registerRoute, context) { const registrations = [] const app = { post(paths, handler) { registrations.push({ paths, handler }) }, } registerRoute({ app, context }) assert.equal(registrations.length, 1) return registrations[0] } function invokeHandler(handler, body) { const response = { statusCode: 0, payload: null, } const res = { status(code) { response.statusCode = code return this }, json(payload) { response.payload = payload return this }, } handler({ body }, res) return response } test('summary 默认返回 accountNum/ruleId,并包含 Bally 风格字段', () => withEnv( { MOCK_REDEEMED_PROMOTION_RECORDING_ENABLED: 'false', }, () => { const context = createMockContext() const response = buildFulfillmentJourneyResponse({ context, requestBody: { data: { accountNum: '80010991', ruleId: 71768024, }, }, }) assert.equal(response.errorCode, '') assert.equal(response.errorMsg, '') assert.equal(response.accountNum, '80010991') assert.equal(response.ruleId, 71768024) assert.ok(Array.isArray(response.eligibleCriteriaList)) assert.ok(Array.isArray(response.journeyList)) assert.ok(response.eligibleCriteriaList.length > 0) assert.ok(response.journeyList.length > 0) assert.deepEqual(Object.keys(response.eligibleCriteriaList[0]).sort(), [ 'attribute', 'operator', 'qualify', 'value', 'valueArray', ]) assert.deepEqual(Object.keys(response.journeyList[0]).sort(), [ 'basePts', 'memberNo', 'periodEndTime', 'periodStartTime', 'progressId', 'ruleId', 'ruleName', ]) }, )) test('summary empty-result 开关打开时返回空数组', () => withEnv( { MOCK_REDEEMED_PROMOTION_RECORDING_ENABLED: 'false', MOCK_PLAYERPROMOTION_FULFILLMENT_JOURNEY_EMPTY_RESULT: 'true', }, () => { const context = createMockContext() const response = buildFulfillmentJourneyResponse({ context, requestBody: { data: { accountNum: '80010991', ruleId: 71768024, }, }, }) assert.deepEqual(response.eligibleCriteriaList, []) assert.deepEqual(response.journeyList, []) }, )) test('detail 业务错误时保留 errorCode/errorMsg/accountNum/ruleId', () => withEnv( { MOCK_REDEEMED_PROMOTION_RECORDING_ENABLED: 'false', MOCK_PLAYERPROMOTION_FULFILLMENT_JOURNEY_DETAIL_ERROR_CODE: 'BIZ_1001', MOCK_PLAYERPROMOTION_FULFILLMENT_JOURNEY_DETAIL_ERROR_MSG: 'rule is not active', }, () => { const context = createMockContext() const response = buildFulfillmentJourneyDetailResponse({ context, requestBody: { data: { accountNum: '80010991', ruleId: 71768024, }, }, }) assert.equal(response.errorCode, 'BIZ_1001') assert.equal(response.errorMsg, 'rule is not active') assert.equal(response.accountNum, '80010991') assert.equal(response.ruleId, 71768024) assert.ok(Array.isArray(response.journeyList)) assert.deepEqual(Object.keys(response.journeyList[0]).sort(), [ 'areaCode', 'ballyTranId', 'basePts', 'casinoCode', 'deptCode', 'earnType', 'gameCode', 'gamingDt', 'locnCode', 'memberNo', 'periodEndTime', 'periodStartTime', 'postDtm', 'progressId', 'ruleId', 'ruleName', ]) }, )) test('summary route 会注册正确路径并返回 200 JSON', () => withEnv( { MOCK_REDEEMED_PROMOTION_RECORDING_ENABLED: 'false', }, () => { const context = createMockContext() const registration = createRegisteredPostRoute( registerPlayerPromotionFulfillmentJourneyRoute, context, ) assert.deepEqual(registration.paths, [ '/ewl/promotion/v1/playerpromotion/fulfillmentJourney', '/ewl/bal/v1/playerpromotion/fulfillmentJourney', ]) const response = invokeHandler(registration.handler, { data: { accountNum: '80010991', ruleId: 71768024, }, }) assert.equal(response.statusCode, 200) assert.equal(response.payload.accountNum, '80010991') assert.equal(response.payload.ruleId, 71768024) }, )) test('detail route 会注册正确路径并返回 200 JSON', () => withEnv( { MOCK_REDEEMED_PROMOTION_RECORDING_ENABLED: 'false', MOCK_PLAYERPROMOTION_FULFILLMENT_JOURNEY_DETAIL_ERROR_CODE: 'BIZ_1001', }, () => { const context = createMockContext() const registration = createRegisteredPostRoute( registerPlayerPromotionFulfillmentJourneyDetailRoute, context, ) assert.deepEqual(registration.paths, [ '/ewl/promotion/v1/playerpromotion/fulfillmentJourneyDetail', '/ewl/bal/v1/playerpromotion/fulfillmentJourneyDetail', ]) const response = invokeHandler(registration.handler, { data: { accountNum: '80010991', ruleId: 71768024, }, }) assert.equal(response.statusCode, 200) assert.equal(response.payload.errorCode, 'BIZ_1001') assert.equal(response.payload.accountNum, '80010991') }, ))