'use strict'; var mime = require('..'); var mimeTypes = require('../node_modules/mime-types'); var assert = require('assert'); var chalk = require('chalk'); describe('class Mime', function() { it('mime and mime/lite coexist', function() { assert.doesNotThrow(function() { require('../lite'); }); }); it('new constructor()', function() { var Mime = require('../Mime'); var mime = new Mime( {'text/a': ['a', 'a1']}, {'text/b': ['b', 'b1']} ); assert.deepEqual(mime._types, { a: 'text/a', a1: 'text/a', b: 'text/b', b1: 'text/b', }); assert.deepEqual(mime._extensions, { 'text/a': 'a', 'text/b': 'b', }); }); it('define()', function() { var Mime = require('../Mime'); var mime = new Mime({'text/a': ['a']}, {'text/b': ['b']}); assert.throws(function() { mime.define({'text/c': ['b']}); }); assert.doesNotThrow(function() { mime.define({'text/c': ['b']}, true); }); assert.deepEqual(mime._types, { a: 'text/a', b: 'text/c', }); assert.deepEqual(mime._extensions, { 'text/a': 'a', 'text/b': 'b', 'text/c': 'b', }); }); it('define() *\'ed types', function() { var Mime = require('../Mime'); var mime = new Mime( {'text/a': ['*b']}, {'text/b': ['b']} ); assert.deepEqual(mime._types, { b: 'text/b', }); assert.deepEqual(mime._extensions, { 'text/a': 'b', 'text/b': 'b', }); }); it ('case-insensitive', function() { var Mime = require('../Mime'); const mime = new Mime({ 'TEXT/UPPER': ['UP'], 'text/lower': ['low'], }); assert.equal(mime.getType('test.up'), 'text/upper'); assert.equal(mime.getType('test.UP'), 'text/upper'); assert.equal(mime.getType('test.low'), 'text/lower'); assert.equal(mime.getType('test.LOW'), 'text/lower'); assert.equal(mime.getExtension('text/upper'), 'up'); assert.equal(mime.getExtension('text/lower'), 'low'); assert.equal(mime.getExtension('TEXT/UPPER'), 'up'); assert.equal(mime.getExtension('TEXT/LOWER'), 'low'); }); it('getType()', function() { // Upper/lower case assert.equal(mime.getType('text.txt'), 'text/plain'); assert.equal(mime.getType('TEXT.TXT'), 'text/plain'); // Bare extension assert.equal(mime.getType('txt'), 'text/plain'); assert.equal(mime.getType('.txt'), 'text/plain'); assert.strictEqual(mime.getType('.bogus'), null); assert.strictEqual(mime.getType('bogus'), null); // Non-sensical assert.strictEqual(mime.getType(null), null); assert.strictEqual(mime.getType(undefined), null); assert.strictEqual(mime.getType(42), null); assert.strictEqual(mime.getType({}), null); // File paths assert.equal(mime.getType('dir/text.txt'), 'text/plain'); assert.equal(mime.getType('dir\\text.txt'), 'text/plain'); assert.equal(mime.getType('.text.txt'), 'text/plain'); assert.equal(mime.getType('.txt'), 'text/plain'); assert.equal(mime.getType('txt'), 'text/plain'); assert.equal(mime.getType('/path/to/page.html'), 'text/html'); assert.equal(mime.getType('c:\\path\\to\\page.html'), 'text/html'); assert.equal(mime.getType('page.html'), 'text/html'); assert.equal(mime.getType('path/to/page.html'), 'text/html'); assert.equal(mime.getType('path\\to\\page.html'), 'text/html'); assert.strictEqual(mime.getType('/txt'), null); assert.strictEqual(mime.getType('\\txt'), null); assert.strictEqual(mime.getType('text.nope'), null); assert.strictEqual(mime.getType('/path/to/file.bogus'), null); assert.strictEqual(mime.getType('/path/to/json'), null); assert.strictEqual(mime.getType('/path/to/.json'), null); assert.strictEqual(mime.getType('/path/to/.config.json'), 'application/json'); assert.strictEqual(mime.getType('.config.json'), 'application/json'); }); it('getExtension()', function() { assert.equal(mime.getExtension('text/html'), 'html'); assert.equal(mime.getExtension(' text/html'), 'html'); assert.equal(mime.getExtension('text/html '), 'html'); assert.strictEqual(mime.getExtension('application/x-bogus'), null); assert.strictEqual(mime.getExtension('bogus'), null); assert.strictEqual(mime.getExtension(null), null); assert.strictEqual(mime.getExtension(undefined), null); assert.strictEqual(mime.getExtension(42), null); assert.strictEqual(mime.getExtension({}), null); }); }); describe('DB', function() { var diffs = []; after(function() { if (diffs.length) { console.log('\n[INFO] The following inconsistencies with MDN (https://goo.gl/lHrFU6) and/or mime-types (https://github.com/jshttp/mime-types) are expected:'); diffs.forEach(function(d) { console.warn( ' ' + d[0]+ '[' + chalk.blue(d[1]) + '] = ' + chalk.red(d[2]) + ', mime[' + d[1] + '] = ' + chalk.green(d[3]) ); }); } }); it('Consistency', function() { for (var ext in this.types) { assert.equal(ext, this.extensions[this.types[ext]], '${ext} does not have consistent ext->type->ext mapping'); } }); it('MDN types', function() { // MDN types listed at https://goo.gl/lHrFU6 var MDN = { aac: 'audio/aac', bin: 'application/octet-stream', css: 'text/css', csv: 'text/csv', doc: 'application/msword', docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', gif: 'image/gif', html: 'text/html', ico: 'image/vnd.microsoft.icon', jpg: 'image/jpeg', js: 'application/javascript', json: 'application/json', midi: 'audio/midi', mjs: 'application/javascript', mp3: 'audio/mpeg', mpeg: 'video/mpeg', oga: 'audio/ogg', ogv: 'video/ogg', otf: 'font/otf', png: 'image/png', pdf: 'application/pdf', rtf: 'application/rtf', svg: 'image/svg+xml', swf: 'application/x-shockwave-flash', tiff: 'image/tiff', ttf: 'font/ttf', txt: 'text/plain', wav: 'audio/wav', weba: 'audio/webm', webm: 'video/webm', webp: 'image/webp', woff: 'font/woff', xls: 'application/vnd.ms-excel', xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', xml: 'application/xml', zip: 'application/zip', '3gp': 'video/3gpp', }; for (var ext in MDN) { var expected = MDN[ext]; var actual = mime.getType(ext); if (actual !== expected) diffs.push(['MDN', ext, expected, actual]); } for (var ext in mimeTypes.types) { var expected = mimeTypes.types[ext]; var actual = mime.getType(ext); if (actual !== expected) diffs.push(['mime-types', ext, expected, actual]); } }); it('Specific types', function() { // Assortment of types we sanity check for good measure assert.equal(mime.getType('html'), 'text/html'); assert.equal(mime.getType('js'), 'application/javascript'); assert.equal(mime.getType('json'), 'application/json'); assert.equal(mime.getType('rtf'), 'application/rtf'); assert.equal(mime.getType('txt'), 'text/plain'); assert.equal(mime.getType('xml'), 'application/xml'); assert.equal(mime.getType('wasm'), 'application/wasm'); }); it('Specific extensions', function() { assert.equal(mime.getExtension('text/html;charset=UTF-8'), 'html'); assert.equal(mime.getExtension('text/HTML; charset=UTF-8'), 'html'); assert.equal(mime.getExtension('text/html; charset=UTF-8'), 'html'); assert.equal(mime.getExtension('text/html; charset=UTF-8 '), 'html'); assert.equal(mime.getExtension('text/html ; charset=UTF-8'), 'html'); assert.equal(mime.getExtension(mime._types.text), 'txt'); assert.equal(mime.getExtension(mime._types.htm), 'html'); assert.equal(mime.getExtension('application/octet-stream'), 'bin'); assert.equal(mime.getExtension('application/octet-stream '), 'bin'); assert.equal(mime.getExtension(' text/html; charset=UTF-8'), 'html'); assert.equal(mime.getExtension('text/html; charset=UTF-8 '), 'html'); assert.equal(mime.getExtension('text/html; charset=UTF-8'), 'html'); assert.equal(mime.getExtension('text/html ; charset=UTF-8'), 'html'); assert.equal(mime.getExtension('text/html;charset=UTF-8'), 'html'); assert.equal(mime.getExtension('text/Html;charset=UTF-8'), 'html'); assert.equal(mime.getExtension('unrecognized'), null); assert.equal(mime.getExtension('text/xml'), 'xml'); // See #180 }); });