| // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:http_parser/http_parser.dart'; |
| import 'package:test/test.dart'; |
| |
| void main() { |
| group('parse', () { |
| test('parses a simple MIME type', () { |
| final type = MediaType.parse('text/plain'); |
| expect(type.type, equals('text')); |
| expect(type.subtype, equals('plain')); |
| }); |
| |
| test('allows leading whitespace', () { |
| expect(MediaType.parse(' text/plain').mimeType, equals('text/plain')); |
| expect(MediaType.parse('\ttext/plain').mimeType, equals('text/plain')); |
| }); |
| |
| test('allows trailing whitespace', () { |
| expect(MediaType.parse('text/plain ').mimeType, equals('text/plain')); |
| expect(MediaType.parse('text/plain\t').mimeType, equals('text/plain')); |
| }); |
| |
| test('disallows separators in the MIME type', () { |
| expect(() => MediaType.parse('te(xt/plain'), throwsFormatException); |
| expect(() => MediaType.parse('text/pla=in'), throwsFormatException); |
| }); |
| |
| test('disallows whitespace around the slash', () { |
| expect(() => MediaType.parse('text /plain'), throwsFormatException); |
| expect(() => MediaType.parse('text/ plain'), throwsFormatException); |
| }); |
| |
| test('parses parameters', () { |
| final type = MediaType.parse('text/plain;foo=bar;baz=bang'); |
| expect(type.mimeType, equals('text/plain')); |
| expect(type.parameters, equals({'foo': 'bar', 'baz': 'bang'})); |
| }); |
| |
| test('allows whitespace around the semicolon', () { |
| final type = MediaType.parse('text/plain ; foo=bar ; baz=bang'); |
| expect(type.mimeType, equals('text/plain')); |
| expect(type.parameters, equals({'foo': 'bar', 'baz': 'bang'})); |
| }); |
| |
| test('disallows whitespace around the equals', () { |
| expect( |
| () => MediaType.parse('text/plain; foo =bar'), throwsFormatException); |
| expect( |
| () => MediaType.parse('text/plain; foo= bar'), throwsFormatException); |
| }); |
| |
| test('disallows separators in the parameters', () { |
| expect( |
| () => MediaType.parse('text/plain; fo:o=bar'), throwsFormatException); |
| expect( |
| () => MediaType.parse('text/plain; foo=b@ar'), throwsFormatException); |
| }); |
| |
| test('parses quoted parameters', () { |
| final type = |
| MediaType.parse('text/plain; foo="bar space"; baz="bang\\\\escape"'); |
| expect(type.mimeType, equals('text/plain')); |
| expect( |
| type.parameters, equals({'foo': 'bar space', 'baz': 'bang\\escape'})); |
| }); |
| |
| test('lower-cases type and subtype', () { |
| final type = MediaType.parse('TeXt/pLaIn'); |
| expect(type.type, equals('text')); |
| expect(type.subtype, equals('plain')); |
| expect(type.mimeType, equals('text/plain')); |
| }); |
| |
| test('records parameters as case-insensitive', () { |
| final type = MediaType.parse('test/plain;FoO=bar;bAz=bang'); |
| expect(type.parameters, equals({'FoO': 'bar', 'bAz': 'bang'})); |
| expect(type.parameters, containsPair('foo', 'bar')); |
| expect(type.parameters, containsPair('baz', 'bang')); |
| }); |
| }); |
| |
| group('change', () { |
| MediaType type; |
| setUp(() { |
| type = MediaType.parse('text/plain; foo=bar; baz=bang'); |
| }); |
| |
| test('uses the existing fields by default', () { |
| final newType = type.change(); |
| expect(newType.type, equals('text')); |
| expect(newType.subtype, equals('plain')); |
| expect(newType.parameters, equals({'foo': 'bar', 'baz': 'bang'})); |
| }); |
| |
| test('[type] overrides the existing type', () { |
| expect(type.change(type: 'new').type, equals('new')); |
| }); |
| |
| test('[subtype] overrides the existing subtype', () { |
| expect(type.change(subtype: 'new').subtype, equals('new')); |
| }); |
| |
| test('[mimeType] overrides the existing type and subtype', () { |
| final newType = type.change(mimeType: 'image/png'); |
| expect(newType.type, equals('image')); |
| expect(newType.subtype, equals('png')); |
| }); |
| |
| test('[parameters] overrides and adds to existing parameters', () { |
| expect( |
| type.change(parameters: {'foo': 'zap', 'qux': 'fblthp'}).parameters, |
| equals({'foo': 'zap', 'baz': 'bang', 'qux': 'fblthp'})); |
| }); |
| |
| test('[clearParameters] removes existing parameters', () { |
| expect(type.change(clearParameters: true).parameters, isEmpty); |
| }); |
| |
| test('[clearParameters] with [parameters] removes before adding', () { |
| final newType = |
| type.change(parameters: {'foo': 'zap'}, clearParameters: true); |
| expect(newType.parameters, equals({'foo': 'zap'})); |
| }); |
| |
| test('[type] with [mimeType] is illegal', () { |
| expect(() => type.change(type: 'new', mimeType: 'image/png'), |
| throwsArgumentError); |
| }); |
| |
| test('[subtype] with [mimeType] is illegal', () { |
| expect(() => type.change(subtype: 'new', mimeType: 'image/png'), |
| throwsArgumentError); |
| }); |
| }); |
| |
| group('toString', () { |
| test('serializes a simple MIME type', () { |
| expect(MediaType('text', 'plain').toString(), equals('text/plain')); |
| }); |
| |
| test('serializes a token parameter as a token', () { |
| expect(MediaType('text', 'plain', {'foo': 'bar'}).toString(), |
| equals('text/plain; foo=bar')); |
| }); |
| |
| test('serializes a non-token parameter as a quoted string', () { |
| expect(MediaType('text', 'plain', {'foo': 'bar baz'}).toString(), |
| equals('text/plain; foo="bar baz"')); |
| }); |
| |
| test('escapes a quoted string as necessary', () { |
| expect(MediaType('text', 'plain', {'foo': 'bar"\x7Fbaz'}).toString(), |
| equals('text/plain; foo="bar\\"\\\x7Fbaz"')); |
| }); |
| |
| test('serializes multiple parameters', () { |
| expect( |
| MediaType('text', 'plain', {'foo': 'bar', 'baz': 'bang'}).toString(), |
| equals('text/plain; foo=bar; baz=bang')); |
| }); |
| }); |
| } |