HeliosLauncher/test/mojang/mojangTest.ts
Daniel Scalzi 75a7e0f713
File structure refactor, move old files to old directory.
Removed legacy config path support in ConfigManager.
Moved model files to corresponding subdirectories, rather than being in
an uber model directory.
2020-04-13 22:51:32 -04:00

177 lines
5.2 KiB
TypeScript

import { Mojang } from "../../src/main/mojang/mojang"
import { expect } from 'chai'
import nock from 'nock'
import { URL } from 'url'
import { Session } from "../../src/main/mojang/model/auth/Session"
import { MojangResponseCode } from "../../src/main/mojang/model/internal/Response"
function expectMojangResponse(res: any, responseCode: MojangResponseCode, negate = false) {
expect(res).to.not.be.an('error')
expect(res).to.be.an('object')
expect(res).to.have.property('responseCode')
if(!negate) {
expect(res.responseCode).to.equal(responseCode)
} else {
expect(res.responseCode).to.not.equal(responseCode)
}
}
describe('Mojang Errors', () => {
it('Status (Offline)', async () => {
const defStatusHack = Mojang['statuses']
const url = new URL(Mojang.STATUS_ENDPOINT)
nock(url.origin)
.get(url.pathname)
.reply(500, 'Service temprarily offline.')
const res = await Mojang.status();
expectMojangResponse(res, MojangResponseCode.SUCCESS, true)
expect(res.data).to.be.an('array')
expect(res.data).to.deep.equal(defStatusHack)
}).timeout(2500)
it('Authenticate (Invalid Credentials)', async () => {
nock(Mojang.AUTH_ENDPOINT)
.post('/authenticate')
.reply(403, (uri, requestBody: any): { error: string, errorMessage: string } => {
return {
error: 'ForbiddenOperationException',
errorMessage: 'Invalid credentials. Invalid username or password.'
}
})
const res = await Mojang.authenticate('user', 'pass', 'xxx', true)
expectMojangResponse(res, MojangResponseCode.ERROR_INVALID_CREDENTIALS)
expect(res.data).to.be.a('null')
expect(res.error).to.not.be.a('null')
})
})
describe('Mojang Status', () => {
it('Status (Online)', async () => {
const defStatusHack = Mojang['statuses']
const url = new URL(Mojang.STATUS_ENDPOINT)
nock(url.origin)
.get(url.pathname)
.reply(200, defStatusHack)
const res = await Mojang.status();
expectMojangResponse(res, MojangResponseCode.SUCCESS)
expect(res.data).to.be.an('array')
expect(res.data).to.deep.equal(defStatusHack)
}).timeout(2500)
})
describe('Mojang Auth', () => {
it('Authenticate', async () => {
nock(Mojang.AUTH_ENDPOINT)
.post('/authenticate')
.reply(200, (uri, requestBody: any): Session => {
const mockResponse: Session = {
accessToken: 'abc',
clientToken: requestBody.clientToken,
selectedProfile: {
id: 'def',
name: 'username'
}
}
if(requestBody.requestUser) {
mockResponse.user = {
id: 'def',
properties: []
}
}
return mockResponse
})
const res = await Mojang.authenticate('user', 'pass', 'xxx', true)
expectMojangResponse(res, MojangResponseCode.SUCCESS)
expect(res.data!.clientToken).to.equal('xxx')
expect(res.data).to.have.property('user')
})
it('Validate', async () => {
nock(Mojang.AUTH_ENDPOINT)
.post('/validate')
.times(2)
.reply((uri, requestBody: any) => {
return [
requestBody.accessToken === 'abc' ? 204 : 403
]
})
const res = await Mojang.validate('abc', 'def')
expectMojangResponse(res, MojangResponseCode.SUCCESS)
expect(res.data).to.be.a('boolean')
expect(res.data).to.equal(true)
const res2 = await Mojang.validate('def', 'def')
expectMojangResponse(res2, MojangResponseCode.SUCCESS)
expect(res2.data).to.be.a('boolean')
expect(res2.data).to.equal(false)
})
it('Invalidate', async () => {
nock(Mojang.AUTH_ENDPOINT)
.post('/invalidate')
.reply(204)
const res = await Mojang.invalidate('adc', 'def')
expectMojangResponse(res, MojangResponseCode.SUCCESS)
})
it('Refresh', async () => {
nock(Mojang.AUTH_ENDPOINT)
.post('/refresh')
.reply(200, (uri, requestBody: any): Session => {
const mockResponse: Session = {
accessToken: 'abc',
clientToken: requestBody.clientToken,
selectedProfile: {
id: 'def',
name: 'username'
}
}
if(requestBody.requestUser) {
mockResponse.user = {
id: 'def',
properties: []
}
}
return mockResponse
})
const res = await Mojang.refresh('gfd', 'xxx', true)
expectMojangResponse(res, MojangResponseCode.SUCCESS)
expect(res.data!.clientToken).to.equal('xxx')
expect(res.data).to.have.property('user')
})
})