data-cli
Version:
CLI for working with data packages
740 lines (612 loc) • 29.9 kB
JavaScript
// Test the CLI directly
const fs = require('fs')
const path = require('path')
const test = require('ava')
const {spawn} = require('cross-spawn')
const run = require('inquirer-test')
const {ENTER} = require('inquirer-test')
const {version} = require('../package.json')
const runcli = (...args) => {
return new Promise((resolve, reject) => {
const command = path.resolve(__dirname, '../bin/data.js')
args.push('--test')
const data = spawn(command, args)
let stdout = ''
data.stdout.on('data', data => {
stdout += data
})
data.on('error', err => {
reject(err)
})
data.on('close', code => {
resolve({
code,
stdout
})
})
})
}
// ==========
// The basics
test.after.always('cleanup', t => {
let deleteFolderRecursive = (path) => {
if (fs.existsSync(path)) {
fs.readdirSync(path).forEach((file, index) => {
let curPath = path + "/" + file;
if (fs.lstatSync(curPath).isDirectory()) { // recurse
deleteFolderRecursive(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
})
fs.rmdirSync(path);
}
}
deleteFolderRecursive('finance-vix')
deleteFolderRecursive('test/small-dataset-100kb')
deleteFolderRecursive('test/medium-dataset-1mb')
deleteFolderRecursive('test/big-dataset-10mb')
deleteFolderRecursive('test/private-cli-test')
try {
fs.unlinkSync('test/fixtures/test-data/files/geo/datapackage.json')
fs.unlinkSync('sample.csv')
fs.unlinkSync('sample-1-sheet.xls')
fs.unlinkSync('0.csv')
} catch (err) {
console.log('Finished cleanup without deleting some files.')
}
})
test('"data -v --version" prints version', async t => {
let result = await runcli('-v')
t.is(result.code, 0)
let stdout = result.stdout.split('\n')
t.true(stdout.length > 1)
t.true(stdout[0].includes(`${version}`))
result = await runcli('--version')
t.is(result.code, 0)
stdout = result.stdout.split('\n')
t.true(stdout.length > 1)
t.true(stdout[0].includes(`${version}`))
})
test('"data help" prints help message', async t => {
const result = await runcli('help')
t.is(result.code, 0)
const stdout = result.stdout.split('\n')
t.true(stdout.length > 1)
const hasExpectedMsg = stdout.find(item => item.includes('❒ data [options] <command> <args>'))
t.truthy(hasExpectedMsg)
})
// =======================================
// DATA-CLI GET
test('get command with local dataset', async t => {
const identifier = 'test/fixtures/finance-vix'
const result = await runcli('get', identifier)
const stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
const hasSuccessMsg = stdout.find(item => item.includes('Dataset/file is saved in "finance-vix"'))
t.truthy(hasTimeElapsedMsg)
t.truthy(hasSuccessMsg)
})
test('get command with local file', async t => {
const identifier = 'test/fixtures/sample.csv'
const result = await runcli('get', identifier)
const stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
const hasSuccessMsg = stdout.find(item => item.includes('Dataset/file is saved in "sample.csv"'))
t.truthy(hasTimeElapsedMsg)
t.truthy(hasSuccessMsg)
})
// QA tests [Get: r links from DataHub]
test('get command with r links from DataHub', async t => {
const identifier = 'https://datahub.io/test/small-dataset-100kb/r/0.csv'
const result = await runcli('get', identifier)
const stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
const hasSuccessMsg = stdout.find(item => item.includes('Dataset/file is saved in "0.csv"'))
t.truthy(hasTimeElapsedMsg)
t.truthy(hasSuccessMsg)
})
// end of [Get: r links from DataHub]
// QA tests [Get: Small dataset from DataHub]
test('get command with small dataset from DataHub', async t => {
const identifier = 'https://datahub.io/test/small-dataset-100kb/'
const result = await runcli('get', identifier)
const stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
const hasSuccessMsg = stdout.find(item => item.includes('Dataset/file is saved in "test/small-dataset-100kb"'))
t.truthy(hasTimeElapsedMsg)
t.truthy(hasSuccessMsg)
})
// end of [Get: Small dataset from DataHub]
// QA tests [Get: Medium dataset from DataHub]
test('get command with medium dataset from DataHub', async t => {
const identifier = 'https://datahub.io/test/medium-dataset-1mb'
const result = await runcli('get', identifier)
const stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
const hasSuccessMsg = stdout.find(item => item.includes('Dataset/file is saved in "test/medium-dataset-1mb"'))
t.truthy(hasTimeElapsedMsg)
t.truthy(hasSuccessMsg)
})
// end of [Get: Meduim dataset from DataHub]
// QA tests [Get: Big dataset from DataHub]
test('get command with big dataset from DataHub', async t => {
const identifier = 'https://datahub.io/test/big-dataset-10mb'
const result = await runcli('get', identifier)
const stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
const hasSuccessMsg = stdout.find(item => item.includes('Dataset/file is saved in "test/big-dataset-10mb"'))
t.truthy(hasTimeElapsedMsg)
t.truthy(hasSuccessMsg)
})
// end of [Get: Big dataset from DataHub]
// QA tests [Get: get excel file]
test('get command with excel file', async t => {
const identifier = 'https://github.com/frictionlessdata/test-data/blob/master/files/excel/sample-1-sheet.xls'
const result = await runcli('get', identifier)
const stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
const hasSuccessMsg = stdout.find(item => item.includes('Dataset/file is saved in "sample-1-sheet.xls"'))
t.truthy(hasTimeElapsedMsg)
t.truthy(hasSuccessMsg)
})
// end of [Get: get excel file]
// QA tests [Get: get private dataset]
test('get command with private dataset', async t => {
const identifier = 'https://datahub.io/test/private-cli-test'
// Note that token for test user is set in env var. First we pass wrong token
// as an argument and expect 404 or 403:
const token = 'non-owner-token'
let result = await runcli('get', identifier, `--token=${token}`)
let stdout = result.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('> Error! 404: Not Found. Requested URL'))
t.truthy(hasErrorMsg)
// Now use correct token from env var:
result = await runcli('get', identifier)
stdout = result.stdout.split('\n')
const hasTimeElapsedMsg = stdout.find(item => item.includes('Time elapsed:'))
t.truthy(hasTimeElapsedMsg)
t.true(fs.existsSync('test/private-cli-test/datapackage.json'))
})
// end of QA tests [Get: get private dataset]
// =======================================
// CLI commands: validate, cat, info, init
test('Init command in non-interactive mode', async t => {
const result = await runcli('init', 'test/fixtures/test-data/files/geo/')
t.true(result.stdout.includes('This process initializes a new datapackage.json file'))
t.true(result.stdout.includes('Descriptor is saved in'))
})
// QA tests [Info: basic dataset]
test('Info: basic dataset', async t => {
let identifier = 'test/fixtures/test-data/packages/basic-csv'
let result = await runcli('info', identifier)
let stdout = result.stdout.split('\n')
let hasMsg = stdout.find(item => item.includes('# basic-csv'))
t.truthy(hasMsg)
hasMsg = stdout.find(item => item.includes('comma-separated'))
t.truthy(hasMsg)
identifier = 'https://github.com/frictionlessdata/test-data/tree/master/packages/basic-csv'
result = await runcli('info', identifier)
stdout = result.stdout.split('\n')
hasMsg = stdout.find(item => item.includes('# basic-csv'))
t.truthy(hasMsg)
hasMsg = stdout.find(item => item.includes('comma-separated'))
t.truthy(hasMsg)
})
// end of [Info: basic dataset]
// QA tests [Info: dataset with multiple resources]
test('Info: dataset with multiple resources', async t => {
let identifier = 'test/fixtures/test-data/packages/different-separators'
let result = await runcli('info', identifier)
let stdout = result.stdout.split('\n')
let hasCaretsResource = stdout.find(item => item.includes('carets'))
let hasCommaResource = stdout.find(item => item.includes('comma'))
t.truthy(hasCaretsResource)
t.truthy(hasCommaResource)
identifier = 'https://github.com/frictionlessdata/test-data/tree/master/packages/different-separators'
result = await runcli('info', identifier)
stdout = result.stdout.split('\n')
hasCaretsResource = stdout.find(item => item.includes('carets'))
hasCommaResource = stdout.find(item => item.includes('comma'))
t.truthy(hasCaretsResource)
t.truthy(hasCommaResource)
})
// end if [Info: dataset with multiple resources]
// QA tests [Info: basic CSV]
test('Info: basic CSV', async t => {
let identifier = 'test/fixtures/test-data/files/csv/100kb.csv'
let result = await runcli('info', identifier)
let stdout = result.stdout.split('\n')
let hasDialect = stdout.find(item => item.includes('dialect'))
let hasSchema = stdout.find(item => item.includes('schema'))
let hasEncodings = stdout.find(item => item.includes('encoding'))
let hasCreatedDate = stdout.find(item => item.includes('created'))
let hasValueInTheTenthRow = stdout.find(item => item.includes('Sharlene'))
let hasValueInTheEleventhRow = stdout.find(item => item.includes('Misti'))
t.truthy(hasDialect)
t.truthy(hasSchema)
t.truthy(hasEncodings)
t.falsy(hasCreatedDate)
t.truthy(hasValueInTheTenthRow)
t.falsy(hasValueInTheEleventhRow)
})
// end of [Info: basic CSV]
// QA tests [Info: non-tabular file]
test('Info: non-tabular file', async t => {
let identifier = 'test/fixtures/test-data/files/other/sample.pdf'
let result = await runcli('info', identifier)
let stdout = result.stdout.split('\n')
let hasName = stdout.find(item => item.includes('name'))
let hasFormat = stdout.find(item => item.includes('format'))
let hasPath = stdout.find(item => item.includes('path'))
let hasDialect = stdout.find(item => item.includes('dialect'))
t.truthy(hasName)
t.truthy(hasFormat)
t.truthy(hasPath)
t.falsy(hasDialect)
identifier = 'https://github.com/frictionlessdata/test-data/raw/master/files/other/sample.pdf'
result = await runcli('info', identifier)
stdout = result.stdout.split('\n')
hasName = stdout.find(item => item.includes('name'))
hasFormat = stdout.find(item => item.includes('format'))
hasPath = stdout.find(item => item.includes('path'))
hasDialect = stdout.find(item => item.includes('dialect'))
t.truthy(hasName)
t.truthy(hasFormat)
t.truthy(hasPath)
t.falsy(hasDialect)
})
// QA tests [Info: from datahub and github]
test('info command with a dataset from GitHub', async t => {
const identifier = 'https://github.com/datasets/finance-vix'
const result = await runcli('info', identifier)
const stdout = result.stdout.split('\n')
const hasReadme = stdout.find(item => item.includes('CBOE Volatility Index (VIX) time-series dataset including'))
const hasResource = stdout.find(item => item.includes('vix-daily'))
t.truthy(hasReadme)
t.truthy(hasResource)
})
test('info command with a dataset from DataHub', async t => {
const identifier = 'https://datahub.io/core/finance-vix'
const result = await runcli('info', identifier)
const stdout = result.stdout.split('\n')
const hasReadme = stdout.find(item => item.includes('CBOE Volatility Index (VIX) time-series dataset including'))
const hasResource = stdout.find(item => item.includes('vix-daily'))
t.truthy(hasReadme)
t.truthy(hasResource)
})
// end of [Info: from datahub and github]
// QA tests [Proper error messages]
test('info command - no dataset or descriptor at URL', async t => {
const url_ = 'https://datahub.io'
const result = await runcli('info', url_)
const stdout = result.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('Expected URL to a dataset or descriptor.'))
t.truthy(hasErrorMsg)
})
test('get command - no dataset or descriptor at URL', async t => {
const url_ = 'https://datahub.io'
const result = await runcli('get', url_)
const stdout = result.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('Expected URL to a dataset or descriptor.'))
t.truthy(hasErrorMsg)
})
// end of [Proper error messages]
// QA tests [Validate: basic csv resource]
test('validate command - basic dataset', async t => {
const path_ = 'test/fixtures/test-data/packages/basic-csv'
const result = await runcli('validate', path_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
test.serial('validate command - remote basic dataset', async t => {
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/basic-csv'
const result = await runcli('validate', url_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
// end of [Validate: basic csv resource]
// QA tests [Validate: non-tabular resource LOCALLY]
test('validate command - non-tabular resource', async t => {
const path_ = 'test/fixtures/test-data/packages/non-tabular-resource'
const result = await runcli('validate', path_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
test.serial('validate command - remote dataset with non-tabular resource', async t => {
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/non-tabular-resource'
const result = await runcli('validate', url_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
// end of [Validate: non-tabular resource LOCALLY]
// QA tests [Validate: remote resource]
test('validate command - remote resource', async t => {
const path_ = 'test/fixtures/test-data/packages/remote-csv'
const result = await runcli('validate', path_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
test.serial('validate command - remote dataset with remote resource', async t => {
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/remote-csv'
const result = await runcli('validate', url_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
// end of [Validate: remote resource]
// QA tests [Validate: csv with different separators]
test('validate command - csv with different separators', async t => {
const path_ = 'test/fixtures/test-data/packages/different-separators'
const result = await runcli('validate', path_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
test.serial('validate command - remote dataset with csv with different separators', async t => {
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/different-separators'
const result = await runcli('validate', url_)
const stdout = result.stdout.split('\n')
const hasValidMessage = stdout.find(item => item.includes('Your Data Package is valid!'))
t.truthy(hasValidMessage)
})
// end of [Validate: csv with different separators]
// QA tests [Validate: invalid path to resource]
test('validate command - invalid local path', async t => {
const path_ = 'test/fixtures/test-data/packages/invalid-local-path'
const result = await runcli('validate', path_)
const stdout = result.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('> Error! ENOENT: no such file or directory'))
t.truthy(hasErrorMsg)
})
// end of [Validate: invalid path to resource]
// QA tests [Validate: invalid remote path to resource]
test.serial('validate command - invalid remote path for resource', async t => {
const path_ = 'test/fixtures/test-data/packages/invalid-remote-path'
const result = await runcli('validate', path_)
const stdout = result.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('> Error! Request failed with status code 404'))
const hasResourceName = stdout.find(item => item.includes('> Error! Resource: invalid-remote-path'))
const hasResourcePath = stdout.find(item => item.includes('> Error! Path: https://raw.githubusercontent.com/frictionlessdata/there/is/no/such/file.csv'))
t.truthy(hasErrorMsg)
t.truthy(hasResourceName)
t.truthy(hasResourcePath)
})
test.serial('validate command - remote dataset with invalid remote path for resource', async t => {
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/invalid-remote-path'
const result = await runcli('validate', url_)
const stdout = result.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('> Error! Request failed with status code 404'))
const hasResourceName = stdout.find(item => item.includes('> Error! Resource: invalid-remote-path'))
const hasResourcePath = stdout.find(item => item.includes('> Error! Path: https://raw.githubusercontent.com/frictionlessdata/there/is/no/such/file.csv'))
t.truthy(hasErrorMsg)
t.truthy(hasResourceName)
t.truthy(hasResourcePath)
})
// end of [Validate: invalid remote path to resource]
// QA tests [Validate: csv with different field types, formats and constraints]
test.serial('validate command - wrong constraints', async t => {
const path_ = 'test/fixtures/test-data/packages/types-formats-and-constraints/constraints'
let result = await runcli('validate', path_)
let stdout = result.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! There are 7 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/types-formats-and-constraints/constraints'
result = await runcli('validate', url_)
stdout = result.stdout.split('\n')
hasErrorMsg = stdout.find(item => item.includes('> Error! There are 7 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
})
test.serial('validate command - wrong "date" type/format', async t => {
const path_ = 'test/fixtures/test-data/packages/types-formats-and-constraints/date'
let result = await runcli('validate', path_)
let stdout = result.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! There are 2 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/types-formats-and-constraints/date'
result = await runcli('validate', url_)
stdout = result.stdout.split('\n')
hasErrorMsg = stdout.find(item => item.includes('> Error! There are 2 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
})
test.serial('validate command - wrong "datetime" type/format', async t => {
const path_ = 'test/fixtures/test-data/packages/types-formats-and-constraints/datetime'
let result = await runcli('validate', path_)
let stdout = result.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! There are 3 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/types-formats-and-constraints/datetime'
result = await runcli('validate', url_)
stdout = result.stdout.split('\n')
hasErrorMsg = stdout.find(item => item.includes('> Error! There are 3 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
})
test.serial('validate command - wrong "string" type/format', async t => {
const path_ = 'test/fixtures/test-data/packages/types-formats-and-constraints/string'
let result = await runcli('validate', path_)
let stdout = result.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! There are 3 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/types-formats-and-constraints/string'
result = await runcli('validate', url_)
stdout = result.stdout.split('\n')
hasErrorMsg = stdout.find(item => item.includes('> Error! There are 3 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
})
test.serial('validate command - wrong "time" type/format', async t => {
const path_ = 'test/fixtures/test-data/packages/types-formats-and-constraints/time'
let result = await runcli('validate', path_)
let stdout = result.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! There are 3 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/types-formats-and-constraints/time'
result = await runcli('validate', url_)
stdout = result.stdout.split('\n')
hasErrorMsg = stdout.find(item => item.includes('> Error! There are 3 type and format mismatch errors on line 3'))
t.truthy(hasErrorMsg)
})
test.serial('validate command - wrong "year" type/format', async t => {
const path_ = 'test/fixtures/test-data/packages/types-formats-and-constraints/year'
let result = await runcli('validate', path_)
let stdout = result.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! There are 1 type and format mismatch errors on line 2'))
t.truthy(hasErrorMsg)
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/types-formats-and-constraints/year'
result = await runcli('validate', url_)
stdout = result.stdout.split('\n')
hasErrorMsg = stdout.find(item => item.includes('> Error! There are 1 type and format mismatch errors on line 2'))
t.truthy(hasErrorMsg)
})
test.serial('validate command - wrong "yearmonth" type/format', async t => {
const path_ = 'test/fixtures/test-data/packages/types-formats-and-constraints/yearmonth'
let result = await runcli('validate', path_)
let stdout = result.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! There are 1 type and format mismatch errors on line 2'))
t.truthy(hasErrorMsg)
const url_ = 'https://github.com/frictionlessdata/test-data/tree/master/packages/types-formats-and-constraints/yearmonth'
result = await runcli('validate', url_)
stdout = result.stdout.split('\n')
hasErrorMsg = stdout.find(item => item.includes('> Error! There are 1 type and format mismatch errors on line 2'))
t.truthy(hasErrorMsg)
})
// end of [Validate: csv with different field types, formats and constraints]
// QA tests [Cat: basic csv]
test('cat command - basic behaviour', async t => {
const path_ = 'test/fixtures/test-data/files/csv/all-schema-types.csv'
const results = await runcli('cat', path_)
const stdout = results.stdout.split('\n')
const hasMsg = stdout.find(item => item.includes('│ 1.0 │'))
t.truthy(hasMsg)
})
test('cat command - remote csv file', async t => {
const url_ = 'https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/csv/all-schema-types.csv'
const results = await runcli('cat', url_)
const stdout = results.stdout.split('\n')
const hasMsg = stdout.find(item => item.includes('│ 1.0 │'))
t.truthy(hasMsg)
})
test('cat command - remote non tabular file', async t => {
const url_ = 'https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/other/sample.txt'
const results = await runcli('cat', url_)
const stdout = results.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('> Error! We do not have a parser for that format: txt'))
t.truthy(hasErrorMsg)
})
test('cat command - non-existing path', async t => {
const path_ = 'non/existing/path'
const results = await runcli('cat', path_)
const stdout = results.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('> Error! ENOENT: no such file or directory'))
t.truthy(hasErrorMsg)
})
test('cat command - URL that returns 404', async t => {
const url_ = 'https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/other/sampl.csv'
const results = await runcli('cat', url_)
const stdout = results.stdout.split('\n')
let hasErrorMsg = stdout.find(item => item.includes('> Error! Provided URL is invalid'))
t.truthy(hasErrorMsg)
hasErrorMsg = stdout.find(item => item.includes('> Error! 404: Not Found. Requested URL: https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/other/sampl.csv'))
t.truthy(hasErrorMsg)
})
// end of [Cat: basic csv]
// QA tests [Cat: different separators]
test('cat command - files with different separator', async t => {
// Local files:
let path_ = 'test/fixtures/test-data/files/csv/separators/semicolon.csv'
let results = await runcli('cat', path_)
let stdout = results.stdout.split('\n')
let delimiterWasntRecognized = stdout.find(item => item.includes(';'))
t.falsy(delimiterWasntRecognized)
let hasCorrectPrint = stdout.find(item => item.includes('number'))
t.truthy(hasCorrectPrint)
path_ = 'test/fixtures/test-data/files/csv/separators/carets.csv'
results = await runcli('cat', path_)
stdout = results.stdout.split('\n')
delimiterWasntRecognized = stdout.find(item => item.includes('^'))
t.falsy(delimiterWasntRecognized)
hasCorrectPrint = stdout.find(item => item.includes('number'))
t.truthy(hasCorrectPrint)
// Remote files:
let url_ = 'https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/csv/separators/semicolon.csv'
results = await runcli('cat', url_)
stdout = results.stdout.split('\n')
delimiterWasntRecognized = stdout.find(item => item.includes(';'))
t.falsy(delimiterWasntRecognized)
hasCorrectPrint = stdout.find(item => item.includes('number'))
t.truthy(hasCorrectPrint)
url_ = 'https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/csv/separators/carets.csv'
results = await runcli('cat', url_)
stdout = results.stdout.split('\n')
delimiterWasntRecognized = stdout.find(item => item.includes('^'))
t.falsy(delimiterWasntRecognized)
hasCorrectPrint = stdout.find(item => item.includes('number'))
t.truthy(hasCorrectPrint)
})
// end of [Cat: different separators]
// QA test [Cat: different encodings]
test.failing('cat command - different encodings', async t => {
const path_ = 'test/fixtures/test-data/files/csv/encodings/iso8859.csv'
let results = await runcli('cat', path_)
let stdout = results.stdout.split('\n')
let hasCorrectPrint = stdout.find(item => item.includes('Réunion'))
t.truthy(hasCorrectPrint)
const url_ = 'https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/csv/encodings/western-macos-roman.csv'
results = await runcli('cat', url_)
stdout = results.stdout.split('\n')
hasCorrectPrint = stdout.find(item => item.includes('Réunion'))
t.truthy(hasCorrectPrint)
})
// end of [Cat: different encodings]
test('cat command - local tsv file', async t => {
const path_= 'test/fixtures/test-data/files/csv/separators/tab.tsv'
const results = await runcli('cat', path_)
const stdout = results.stdout.split('\n')
const hasCorrectPrint = stdout.find(item => item.includes('number'))
t.truthy(hasCorrectPrint)
})
test('cat command - remote tsv file', async t => {
const url_ = 'https://raw.githubusercontent.com/frictionlessdata/test-data/master/files/csv/separators/tab.tsv'
const results = await runcli('cat', url_)
const stdout = results.stdout.split('\n')
const hasCorrectPrint = stdout.find(item => item.includes('number'))
t.truthy(hasCorrectPrint)
})
test('cat command - inconsistent columns', async t => {
const path_ = 'test/fixtures/test-data/files/csv/inconsistent-column-number.csv'
const results = await runcli('cat', path_)
const stdout = results.stdout.split('\n')
const hasErrorMsg = stdout.find(item => item.includes('> Error! Number of columns is inconsistent on line 3'))
t.truthy(hasErrorMsg)
})
test('cat command - remote excel file', async t => {
const url_ = 'https://github.com/frictionlessdata/test-data/raw/master/files/excel/sample-1-sheet.xls'
const results = await runcli('cat', url_)
const stdout = results.stdout.split('\n')
const hasCorrectPrint = stdout.find(item => item.includes('number'))
t.truthy(hasCorrectPrint)
})
test('cat command - specific excel sheet', async t => {
const path_ = 'test/fixtures/test-data/files/excel/sample-2-sheets.xlsx'
// With sheet name:
let results = await runcli('cat', path_, '--sheet=Sheet2')
let stdout = results.stdout.split('\n')
let hasHeaderFrom2ndSheet = stdout.find(item => item.includes('header4'))
t.truthy(hasHeaderFrom2ndSheet)
// With sheet index:
results = await runcli('cat', path_, '--sheet=2')
stdout = results.stdout.split('\n')
hasHeaderFrom2ndSheet = stdout.find(item => item.includes('header4'))
t.truthy(hasHeaderFrom2ndSheet)
// When sheet doesn't exist:
results = await runcli('cat', path_, '--sheet=3')
stdout = results.stdout.split('\n')
t.is(stdout[0], '> Error! Input source is empty or doesn\'t exist.')
})
module.exports = {
runcli
}