Add tests for AbstractTemplateParser and DirectiveParser
This commit is contained in:
		| @@ -15,7 +15,8 @@ | |||||||
|     "build": "npm run clean && tsc", |     "build": "npm run clean && tsc", | ||||||
|     "watch": "npm run clean && tsc --watch", |     "watch": "npm run clean && tsc --watch", | ||||||
|     "clean": "rm -rf ./dist", |     "clean": "rm -rf ./dist", | ||||||
|     "lint": "tslint --force './src/**/*.ts'" |     "lint": "tslint --force './src/**/*.ts'", | ||||||
|  |     "test": "mocha -r ts-node/register tests/**/*.spec.ts" | ||||||
|   }, |   }, | ||||||
|   "repository": { |   "repository": { | ||||||
|     "type": "git", |     "type": "git", | ||||||
| @@ -41,9 +42,14 @@ | |||||||
|   }, |   }, | ||||||
|   "config": {}, |   "config": {}, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  |     "@types/chai": "^3.4.34", | ||||||
|     "@types/cheerio": "^0.17.31", |     "@types/cheerio": "^0.17.31", | ||||||
|     "@types/glob": "^5.0.30", |     "@types/glob": "^5.0.30", | ||||||
|     "@types/lodash": "^4.14.41", |     "@types/lodash": "^4.14.41", | ||||||
|  |     "@types/mocha": "^2.2.33", | ||||||
|  |     "chai": "^3.5.0", | ||||||
|  |     "mocha": "^3.2.0", | ||||||
|  |     "ts-node": "^1.7.0", | ||||||
|     "tslint": "^4.0.2", |     "tslint": "^4.0.2", | ||||||
|     "tslint-eslint-rules": "^3.1.0", |     "tslint-eslint-rules": "^3.1.0", | ||||||
|     "typescript": "^2.0.10" |     "typescript": "^2.0.10" | ||||||
|   | |||||||
| @@ -12,9 +12,9 @@ export abstract class AbstractTemplateParser { | |||||||
| 	 * Extracts inline template from components | 	 * Extracts inline template from components | ||||||
| 	 */ | 	 */ | ||||||
| 	protected _extractInlineTemplate(contents: string): string { | 	protected _extractInlineTemplate(contents: string): string { | ||||||
| 		const match = new RegExp('template\\s?:\\s?(("|\'|`)(.|[\\r\\n])+?[^\\\\]\\2)').exec(contents); | 		const match = new RegExp('template\\s?:\\s?("|\'|`)((.|[\\r\\n])+?[^\\\\])\\1').exec(contents); | ||||||
| 		if (match !== null) { | 		if (match !== null) { | ||||||
| 			return match[1]; | 			return match[2]; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return ''; | 		return ''; | ||||||
|   | |||||||
| @@ -18,7 +18,8 @@ export class DirectiveParser extends AbstractTemplateParser implements ParserInt | |||||||
|  |  | ||||||
| 		template = this._normalizeTemplateAttributes(template); | 		template = this._normalizeTemplateAttributes(template); | ||||||
| 		$(template) | 		$(template) | ||||||
| 			.find('[translate]') | 			.find('[translate],[ng2-translate]') | ||||||
|  | 			.addBack() | ||||||
| 			.each((i: number, element: CheerioElement) => { | 			.each((i: number, element: CheerioElement) => { | ||||||
| 				const $element = $(element); | 				const $element = $(element); | ||||||
| 				const attr = $element.attr('translate'); | 				const attr = $element.attr('translate'); | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								tests/abstract-template.parser.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								tests/abstract-template.parser.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | import { expect } from 'chai'; | ||||||
|  |  | ||||||
|  | import { AbstractTemplateParser } from '../src/parsers/abstract-template.parser'; | ||||||
|  |  | ||||||
|  | class TestTemplateParser extends AbstractTemplateParser { | ||||||
|  |  | ||||||
|  | 	public isAngularComponent(filePath: string): boolean { | ||||||
|  | 		return this._isAngularComponent(filePath); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public normalizeTemplateAttributes(template: string): string { | ||||||
|  | 		return this._normalizeTemplateAttributes(template); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public extractInlineTemplate(contents: string): string { | ||||||
|  | 		return this._extractInlineTemplate(contents); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | describe('AbstractTemplateParser', () => { | ||||||
|  |  | ||||||
|  | 	let parser: TestTemplateParser; | ||||||
|  |  | ||||||
|  | 	beforeEach(() => { | ||||||
|  | 		parser = new TestTemplateParser(); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should recognize js extension as angular component', () => { | ||||||
|  | 		const result = parser.isAngularComponent('test.js'); | ||||||
|  | 		expect(result).to.equal(true); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should recognize ts extension as angular component', () => { | ||||||
|  | 		const result = parser.isAngularComponent('test.ts'); | ||||||
|  | 		expect(result).to.equal(true); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should not recognize html extension as angular component', () => { | ||||||
|  | 		const result = parser.isAngularComponent('test.html'); | ||||||
|  | 		expect(result).to.equal(false); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract inline template', () => { | ||||||
|  | 		const contents = ` | ||||||
|  | 			@Component({ | ||||||
|  | 				selector: 'test', | ||||||
|  | 				template: '<p translate>Hello World</p>' | ||||||
|  | 			}) | ||||||
|  | 			export class TestComponent { } | ||||||
|  | 		`; | ||||||
|  | 		const template = parser.extractInlineTemplate(contents); | ||||||
|  | 		expect(template).to.equal('<p translate>Hello World</p>'); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should normalize bound attributes', () => { | ||||||
|  | 		const contents = `<p [translate]="'KEY'">Hello World</p>`; | ||||||
|  | 		const template = parser.normalizeTemplateAttributes(contents); | ||||||
|  | 		expect(template).to.equal('<p translate="KEY">Hello World</p>'); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | }); | ||||||
							
								
								
									
										83
									
								
								tests/directive.parser.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								tests/directive.parser.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | |||||||
|  | import { expect } from 'chai'; | ||||||
|  |  | ||||||
|  | import { DirectiveParser } from '../src/parsers/directive.parser'; | ||||||
|  |  | ||||||
|  | describe('DirectiveParser', () => { | ||||||
|  |  | ||||||
|  | 	const templateFilename: string = 'test.template.html'; | ||||||
|  | 	const componentFilename: string = 'test.component.ts'; | ||||||
|  |  | ||||||
|  | 	let parser: DirectiveParser; | ||||||
|  |  | ||||||
|  | 	beforeEach(() => { | ||||||
|  | 		parser = new DirectiveParser(); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract contents when no translate attribute value is provided', () => { | ||||||
|  | 		const contents = '<div translate>Hello World</div>'; | ||||||
|  | 		const messages = parser.process(templateFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['Hello World']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract translate attribute if provided', () => { | ||||||
|  | 		const contents = '<div translate="KEY">Hello World<div>'; | ||||||
|  | 		const messages = parser.process(templateFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['KEY']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract bound translate attribute as key if provided', () => { | ||||||
|  | 		const contents = '<div [translate]="\'KEY\'">Hello World<div>'; | ||||||
|  | 		const messages = parser.process(templateFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['KEY']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract direct text nodes when no translate attribute value is provided', () => { | ||||||
|  | 		const contents = ` | ||||||
|  | 			<div translate> | ||||||
|  | 				<span>✓</span> | ||||||
|  | 				Hello <strong>World</strong> | ||||||
|  | 				Hi <em>there</em> | ||||||
|  | 			</div> | ||||||
|  | 		`; | ||||||
|  | 		const messages = parser.process(templateFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['Hello', 'Hi']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract direct text nodes of tags with a translate attribute', () => { | ||||||
|  | 		const contents = ` | ||||||
|  | 			<div translate> | ||||||
|  | 				<span>✓</span> | ||||||
|  | 				Hello World | ||||||
|  | 				<div translate>Hi there</div> | ||||||
|  | 			</div> | ||||||
|  | 		`; | ||||||
|  | 		const messages = parser.process(templateFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['Hello World', 'Hi there']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract translate attribute if provided or direct text nodes if not', () => { | ||||||
|  | 		const contents = ` | ||||||
|  | 			<div translate="KEY"> | ||||||
|  | 				<span>✓</span> | ||||||
|  | 				Hello World | ||||||
|  | 				<p translate>Hi there</p> | ||||||
|  | 				<p [translate]="'OTHER_KEY'">Lorem Ipsum</p> | ||||||
|  | 			</div> | ||||||
|  | 		`; | ||||||
|  | 		const messages = parser.process(templateFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['KEY', 'Hi there', 'OTHER_KEY']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract and parse inline template', () => { | ||||||
|  | 		const contents = ` | ||||||
|  | 			@Component({ | ||||||
|  | 				selector: 'test', | ||||||
|  | 				template: '<p translate>Hello World</p>' | ||||||
|  | 			}) | ||||||
|  | 			export class TestComponent { } | ||||||
|  | 		`; | ||||||
|  | 		const messages = parser.process(componentFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['Hello World']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | }); | ||||||
		Reference in New Issue
	
	Block a user