Skip to content

Commit

Permalink
fix: set proper settings with given args and json file
Browse files Browse the repository at this point in the history
resolves #18
  • Loading branch information
Tarnadas committed Feb 4, 2019
1 parent 044ecef commit 2d59056
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 4 deletions.
89 changes: 89 additions & 0 deletions src/Arguments.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import * as fs from 'fs'
import * as path from 'path'

import { Arguments } from './Arguments'

describe('Arguments', () => {
let args: Arguments

beforeEach(() => {
process.argv = process.argv.slice(0, 2)
})

it('should be created', () => {
args = new Arguments()

expect(args).toBeDefined()
})

it('should match snapshot', () => {
args = new Arguments()

expect(args.settings).toMatchSnapshot()
})

describe('with command line options', () => {
it('should set number', () => {
process.argv = process.argv.concat('--port', '1337')

args = new Arguments()

expect(args.settings.port).toEqual(1337)
})

it('should set string', () => {
process.argv = process.argv.concat('--name', 'server')

args = new Arguments()

expect(args.settings.name).toEqual('server')
})

it('should set boolean', () => {
process.argv = process.argv.concat('--disableGamemodeVote')

args = new Arguments()

expect(args.settings.enableGamemodeVote).toBe(false)
})
})

describe('with JSON options', () => {
beforeEach(() => {
jest.mock('fs')
})

it('should set number', () => {
const mockSettings = JSON.stringify({
port: 1337
})
jest.spyOn(fs, 'readFileSync').mockImplementationOnce(() => mockSettings)

args = new Arguments()

expect(args.settings.port).toEqual(1337)
})

it('should set string', () => {
const mockSettings = JSON.stringify({
name: 'server'
})
jest.spyOn(fs, 'readFileSync').mockImplementationOnce(() => mockSettings)

args = new Arguments()

expect(args.settings.name).toEqual('server')
})

it('should set boolean', () => {
const mockSettings = JSON.stringify({
enableGamemodeVote: false
})
jest.spyOn(fs, 'readFileSync').mockImplementationOnce(() => mockSettings)

args = new Arguments()

expect(args.settings.enableGamemodeVote).toBe(false)
})
})
})
16 changes: 12 additions & 4 deletions src/Arguments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,33 @@ export class Arguments {
})
this.parser.addArgument([ '--gamemode', '-g' ])
this.parser.addArgument([ '--disableGamemodeVote', '-G' ], {
action: 'storeFalse'
action: 'storeConst',
constant: false,
dest: 'enableGamemodeVote'
})
this.parser.addArgument([ '--passwordRequired', '-pr' ], {
action: 'storeTrue'
action: 'storeConst',
constant: true
})
this.parser.addArgument([ '--password', '-p' ])
this.parser.addArgument([ '--name', '-n' ])
this.parser.addArgument([ '--domain', '-D' ])
this.parser.addArgument([ '--description', '-d' ])
this.parser.addArgument([ '--enableWebHook', '-w' ], {
action: 'storeTrue'
action: 'storeConst',
constant: true
})
this.parser.addArgument([ '--apiKey', '-k' ])
const parsed = this.parser.parseArgs() as Settings

this.settings = {} as any
Object.entries(DEFAULT_SETTINGS).forEach(([ key, defaultValue ]: [ string, any ]) => {
// @ts-ignore
this.settings[key] = parsed[key] || (settings ? settings[key] : null) || defaultValue
this.settings[key] = parsed[key]
// @ts-ignore
if (this.settings[key] == null) this.settings[key] = (settings ? settings[key] : null)
// @ts-ignore
if (this.settings[key] == null) this.settings[key] = defaultValue
})
}
}
18 changes: 18 additions & 0 deletions src/__snapshots__/Arguments.spec.ts.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Arguments should match snapshot 1`] = `
Object {
"apiKey": "",
"description": "The **best** Net64+ server ever
:unicorn_face:",
"domain": "",
"enableGamemodeVote": true,
"enableWebHook": false,
"gamemode": 1,
"name": "A Net64+ Server",
"password": "",
"passwordRequired": false,
"port": 3678,
}
`;

0 comments on commit 2d59056

Please sign in to comment.