File: /home/frenchy/www/french-american.org/current/node_modules/prettier-stylelint/test.js
'use strict';
const fs = require('fs');
const test = require('ava');
const tempWrite = require('temp-write');
const stylelint = require('stylelint');
const resolveFrom = require('resolve-from');
const { format, resolveConfig, getPrettierConfig } = require('./index');
const linterAPI = stylelint.createLinter({ fix: true });
test('resolveConfig', t =>
resolveConfig({ filePath: './fixtures/style.css' }).then(config =>
t.deepEqual(config[1], {
rules: {
'string-quotes': ['single'],
'indentation': [4, { except: ['value'] }],
'color-hex-case': ['upper'],
'color-hex-length': ['short'],
'block-no-empty': null,
'color-no-invalid-hex': [true],
'comment-empty-line-before': [
'always',
{ ignore: ['stylelint-commands', 'after-comment'] }
],
'declaration-colon-space-after': ['always'],
'max-empty-lines': [2],
'rule-empty-line-before': [
'always',
{
except: ['first-nested'],
ignore: ['after-comment']
}
],
'unit-whitelist': [['em', 'rem', '%', 's']]
}
})
));
test('resolveConfig not found fallback process.cwd', (t) => {
const tempPath = tempWrite.sync(
'a[id="foo"] { content: "x"; }',
'test.css'
);
return resolveConfig({ filePath: tempPath }).then((config) => {
t.is(config[1].rules['function-comma-newline-after'], null);
return config;
});
});
test('resolveConfig shortcircuit ', t =>
resolveConfig({ stylelintConfig: { rules: { 'max-line-length': [20] } } }).then((config) => {
t.is(config[0].printWidth, 20);
return config;
}));
test('resolve string quotes === double ', (t) => {
const config = resolveConfig.resolve({ rules: { 'string-quotes': ['double'] } });
t.is(config[0].singleQuote, undefined);
});
test('resolve indentation === tab', (t) => {
const config = resolveConfig.resolve({ rules: { indentation: ['tab'] } });
t.plan(2);
t.is(config[0].useTabs, true);
t.is(config[0].tabWidth, 2);
});
test('resolveConfig prettier merge', t =>
resolveConfig({
filePath: './fixtures/style.css',
prettierOptions: getPrettierConfig('./fixtures/style.css')
}).then((config) => {
t.is(config[0].semi, false);
return config;
}));
test('format', (t) => {
const source = fs.readFileSync('./fixtures/style.css', 'utf8');
return format({
text: source,
filePath: './fixtures/style.css'
}).then((source) => {
t.is(
source,
`@media print {
a {
color: #FFF;
background-position: top left, top right;
}
}
a[id='foo'] {
content: 'x';
}
`
);
return source;
});
});
test('format without code but with filePath', t =>
format({ filePath: './fixtures/style.css' }).then((source) => {
t.is(
source,
`@media print {
a {
color: #FFF;
background-position: top left, top right;
}
}
a[id='foo'] {
content: 'x';
}
`
);
return source;
}));
test('format less', (t) => {
const source = fs.readFileSync('./fixtures/less.less', 'utf8');
return format({
text: source,
filePath: './fixtures/less.less'
}).then((source) => {
t.is(
source,
`@base: #F938AB;
.box-shadow(@style, @c) when (iscolor(@c)) {
-webkit-box-shadow: @style @c;
box-shadow: @style @c;
}
.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
.box-shadow(@style, rgba(0, 0, 0, @alpha));
}
.box {
color: saturate(@base, 5%);
border-color: lighten(@base, 30%);
div {
.box-shadow(0 0 5px, 30%);
}
}
`
);
return source;
});
});
test('format with syntax error from prettier', (t) => {
const source = fs.readFileSync('./tests/error-syntax.css', 'utf8');
return format({
text: source,
filePath: './tests/error-syntax.css'
}).catch((err) => {
t.is(err.name, 'SyntaxError');
});
});
test('alternate stylelint format', (t) => {
const source = fs.readFileSync('./fixtures/style.css', 'utf8');
return linterAPI
._lintSource({
code: source
// codeFilename: process.cwd()
// codeFilename: path.resolve(process.cwd(), './tests/less.less')
// filePath: path.resolve(process.cwd(), './fixtures/style.css')
})
.then((result) => {
const fixed = result.root.toString(result.opts.syntax);
t.is(
result.root.toString(result.opts.syntax),
`@media print {
a {
color: #FFF;
background-position: top left,
top right;
}
}
a[id="foo"] { content: "x"; }
`
);
return fixed;
});
});
test('resolve relative package', (t) => {
const path = resolveFrom('./fixtures/find-package/style.css', 'prettier');
t.is('1.6.0', require(path).version);
});
test('resolve relative package deep', (t) => {
const path = resolveFrom(
'./fixtures/find-package/deep/style.css',
'prettier'
);
t.is('1.6.0', require(path).version);
});
test('resolve relative package fallback', (t) => {
const path = resolveFrom('./fixtures/style.css', 'prettier');
t.is('1.7.0', require(path).version);
});
test('resolve relative package null', (t) => {
const path = resolveFrom(__filename, 'prettier');
t.is('1.7.0', require(path).version);
});