const http = require('http'); const LC = require('../src/client'); describe('λ-calculator', () => { let challenger, port; beforeEach((done) => { challenger = http.createServer(); challenger.listen(0, () => { port = challenger.address().port; done(); }); }); afterEach((done) => { challenger.close(() => done()); }); it('registers to challenger', () => { challenger.on('request', (request, response) => { expect(request.method).toBe('POST'); expect(request.url).toBe('/api/register'); expect(request.headers).toHaveProperty('content-type', 'application/json;charset=utf-8'); let payload = ''; request.on('data', (d) => (payload += d)); request.on('end', () => { expect(payload).toEqual('"John Smith"'); }); response.end('SomeToken'); }); const client = LC.newClient({ playerName: 'John Smith', challengerURL: `http://localhost:${port}`, }); return client.start() .then((token) => expect(token).toBe('SomeToken')); }); it('retrieves next challenge', () => { challenger.on('request', (request, response) => { expect(request.method).toBe('GET'); expect(request.url).toBe('/api/challenge?token=SomeToken'); response.end(JSON.stringify({ expr: 'SomeChallenge' })); }); const client = LC.newClient({ playerName: 'John Smith', challengerURL: `http://localhost:${port}`, }); return client.nextChallenge('SomeToken') .then((challenge) => expect(challenge).toBe('SomeChallenge')); }); it('solves challenges', () => { const parser = { parse: (challenge) => { expect(challenge).toBe('Some challenge'); return 'Parsed expression'; }, }; const interpreter = { evaluate: (parsedExpression) => { expect(parsedExpression).toBe('Parsed expression'); return 'Evaluated expression'; }, }; const printer = { print: (evaluatedExpression) => { expect(evaluatedExpression).toBe('Evaluated expression'); return 'Expression to print'; }, }; const client = LC.newClient({ parser, interpreter, printer }); expect(client.solve('Some challenge')).toBe('Expression to print'); }); });