const assert = require('assert') const parser = require('../../lib/ofac/parsing') const fs = require('fs') const path = require('path') const util = require('util') const _ = require('lodash/fp') const randomTmpFileName = () => path.join('/tmp', Math.random().toString()) const writeFile = util.promisify(fs.writeFile) function makeDataFiles (contents) { const fileNames = _.map(randomTmpFileName, Array(contents.length)) const pairs = _.zip(fileNames, contents) return Promise.all(_.map(_.spread(writeFile), pairs)) .then(() => fileNames) } const mapLines = _.flow(_.map, _.join('')) const partIds = new Map([ ['lastName', 1520], ['firstName', 1521], ['middleName', 1522], ['maidenName', 1523], ['patronymic', 91708], ['matronymic', 91709], ['nickname', 1528] ]) const getId = part => partIds.get(part.partName) const makePart = part => '' + '\n\t\t\t\t\t' + `\n\t\t\t\t\t\t` + part.value + '' + '\n\t\t\t\t\t' const makeAlias = alias => '' + '\n\t\t\t' + `\n\t\t\t\t` + _.map(makePart, alias.parts) + '\n\t\t\t\t' + '\n\t\t\t' const makePartGroup = part => '' + '\n\t\t\t\t' + '\n\t\t\t\t\t` + '\n\t\t\t\t' const makePartGroups = alias => mapLines(makePartGroup, alias.parts) const makeBirthDate = birthDate => '' + '\n\t\t' + '\n\t\t\t' + '\n\t\t\t\t' + '\n\t\t\t\t\t' + '\n\t\t\t\t\t\t' + `\n\t\t\t\t\t\t\t${birthDate.start.year}` + `\n\t\t\t\t\t\t\t${birthDate.start.month}` + `\n\t\t\t\t\t\t\t${birthDate.start.day}` + '\n\t\t\t\t\t\t' + '\n\t\t\t\t\t\t' + `\n\t\t\t\t\t\t\t${birthDate.start.year}` + `\n\t\t\t\t\t\t\t${birthDate.start.month}` + `\n\t\t\t\t\t\t\t${birthDate.start.day}` + '\n\t\t\t\t\t\t' + '\n\t\t\t\t\t' + '\n\t\t\t\t\t' + '\n\t\t\t\t\t\t' + `\n\t\t\t\t\t\t\t${birthDate.end.year}` + `\n\t\t\t\t\t\t\t${birthDate.end.month}` + `\n\t\t\t\t\t\t\t${birthDate.end.day}` + '\n\t\t\t\t\t\t' + '\n\t\t\t\t\t\t' + `\n\t\t\t\t\t\t\t${birthDate.end.year}` + `\n\t\t\t\t\t\t\t${birthDate.end.month}` + `\n\t\t\t\t\t\t\t${birthDate.end.day}` + '\n\t\t\t\t\t\t' + '\n\t\t\t\t\t' + '\n\t\t\t\t' + '\n\t\t\t' + '\n\t\t' const makeProfile = profile => { console.log(profile.birthDates) return '' + `\n\t` + '\n\t\t' + mapLines(makeAlias, profile.aliases) + '\n\t\t\t' + mapLines(makePartGroups, profile.aliases) + '\n\t\t\t' + '\n\t\t' + mapLines(makeBirthDate, profile.birthDates) + '\n\t' } const makeXml = profiles => '' + '\n' + mapLines(makeProfile, profiles) + '\n' describe('OFAC', function () { describe('Parsing', function () { // To detect botched downloads it('should fail on malformed XML', function () { const xml = '' return makeDataFiles([xml]).then(parser.parse) .catch(error => { assert.ok(error instanceof Error) return true }) .then(ret => { assert.equal(ret, true) }) }) it('should return the expected structs', function () { const xml = makeXml([{ id: '1', aliases: [{ id: '1', parts: [ {partName: 'firstName', value: 'John'}, {partName: 'lastName', value: 'Doe'}] }], birthDates: [{ start: {year: 1955, month: 10, day: 5}, end: {year: 1955, month: 10, day: 5} }] }]) return makeDataFiles([xml]).then(parser.parse) .then(structs => { const {individuals} = structs assert.ok(Array.isArray(individuals)) assert.equal(individuals.length, 1) const {individualsMap} = structs assert.ok(individualsMap instanceof Map) assert.equal(individualsMap.size, 1) const {aliasToIndividual} = structs assert.ok(aliasToIndividual instanceof Map) assert.equal(aliasToIndividual.size, 1) const {phoneticMap} = structs assert.ok(phoneticMap instanceof Map) assert.equal(phoneticMap.size, 3) const {wordList} = structs assert.ok(Array.isArray(wordList)) assert.equal(wordList.length, 2) }) }) it('should be able to parse multiple sources') it('should remove duplicates from multiple sources') }) })