105 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var createTestPackage = require('../../helpers/test-package');
 | 
						|
var Dgeni = require('dgeni');
 | 
						|
 | 
						|
describe('addImageDimensions post-processor', () => {
 | 
						|
  let processor, getImageDimensionsSpy, addImageDimensions, log;
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    const testPackage = createTestPackage('angular-base-package')
 | 
						|
        .factory('getImageDimensions', mockGetImageDimensions);
 | 
						|
    const dgeni = new Dgeni([testPackage]);
 | 
						|
    const injector = dgeni.configureInjector();
 | 
						|
    log = injector.get('log');
 | 
						|
    addImageDimensions = injector.get('addImageDimensions');
 | 
						|
    addImageDimensions.basePath = 'base/path';
 | 
						|
    getImageDimensionsSpy = injector.get('getImageDimensions');
 | 
						|
    processor = injector.get('postProcessHtml');
 | 
						|
    processor.docTypes = ['a'];
 | 
						|
    processor.plugins = [addImageDimensions];
 | 
						|
  });
 | 
						|
 | 
						|
  it('should add the image dimensions into <img> tags', () => {
 | 
						|
    const docs = [{
 | 
						|
      docType: 'a',
 | 
						|
      renderedContent: `
 | 
						|
        <p>xxx</p>
 | 
						|
        <img src="a/b.jpg">
 | 
						|
        <p>yyy</p>
 | 
						|
        <img src="c/d.png">
 | 
						|
        <p>zzz</p>
 | 
						|
      `
 | 
						|
    }];
 | 
						|
    processor.$process(docs);
 | 
						|
    expect(getImageDimensionsSpy).toHaveBeenCalledWith('base/path', 'a/b.jpg');
 | 
						|
    expect(getImageDimensionsSpy).toHaveBeenCalledWith('base/path', 'c/d.png');
 | 
						|
    expect(docs).toEqual([jasmine.objectContaining({
 | 
						|
      docType: 'a',
 | 
						|
      renderedContent: `
 | 
						|
        <p>xxx</p>
 | 
						|
        <img src="a/b.jpg" width="10" height="20">
 | 
						|
        <p>yyy</p>
 | 
						|
        <img src="c/d.png" width="30" height="40">
 | 
						|
        <p>zzz</p>
 | 
						|
      `
 | 
						|
    })]);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should log a warning for images with no src attribute', () => {
 | 
						|
    const docs = [{
 | 
						|
      docType: 'a',
 | 
						|
      renderedContent: '<img attr="value">'
 | 
						|
    }];
 | 
						|
    processor.$process(docs);
 | 
						|
    expect(getImageDimensionsSpy).not.toHaveBeenCalled();
 | 
						|
    expect(docs).toEqual([jasmine.objectContaining({
 | 
						|
      docType: 'a',
 | 
						|
      renderedContent: '<img attr="value">'
 | 
						|
    })]);
 | 
						|
    expect(log.warn).toHaveBeenCalled();
 | 
						|
  });
 | 
						|
 | 
						|
  it('should fail for images whose source cannot be loaded', () => {
 | 
						|
    getImageDimensionsSpy.and.callFake(() => {
 | 
						|
      const error = new Error('no such file or directory');
 | 
						|
      error.code = 'ENOENT';
 | 
						|
      throw error;
 | 
						|
    });
 | 
						|
    const docs = [{
 | 
						|
      docType: 'a',
 | 
						|
      renderedContent: '<img src="missing">'
 | 
						|
    }];
 | 
						|
    expect(() => processor.$process(docs)).toThrowError('Unable to load src in image tag `<img src="missing">` - doc (a) ');
 | 
						|
    expect(getImageDimensionsSpy).toHaveBeenCalled();
 | 
						|
  });
 | 
						|
 | 
						|
  it('should ignore images with width or height attributes', () => {
 | 
						|
    const docs = [{
 | 
						|
      docType: 'a',
 | 
						|
      renderedContent: `
 | 
						|
        <img src="a/b.jpg" width="10">
 | 
						|
        <img src="c/d.jpg" height="10">
 | 
						|
        <img src="e/f.jpg" width="10" height="10">
 | 
						|
      `
 | 
						|
    }];
 | 
						|
    processor.$process(docs);
 | 
						|
    expect(docs).toEqual([jasmine.objectContaining({
 | 
						|
      docType: 'a',
 | 
						|
      renderedContent: `
 | 
						|
        <img src="a/b.jpg" width="10">
 | 
						|
        <img src="c/d.jpg" height="10">
 | 
						|
        <img src="e/f.jpg" width="10" height="10">
 | 
						|
      `
 | 
						|
    })]);
 | 
						|
  });
 | 
						|
 | 
						|
  function mockGetImageDimensions() {
 | 
						|
    const imageInfo = {
 | 
						|
      'a/b.jpg': { width: 10, height: 20 },
 | 
						|
      'c/d.png': { width: 30, height: 40 },
 | 
						|
    };
 | 
						|
    // eslint-disable-next-line jasmine/no-unsafe-spy
 | 
						|
    return jasmine.createSpy('getImageDimensions')
 | 
						|
      .and.callFake((base, url) => imageInfo[url]);
 | 
						|
  }
 | 
						|
});
 |