diff --git a/.travis.yml b/.travis.yml index 0d4e9c2..5ecd176 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,3 +18,9 @@ script: - npm run test -- --no-progress --code-coverage --single-run --browser=ChromeNoSandbox - npm run e2e -- --no-progress - npm run coverage +addons: + apt: + sources: + - google-chrome + packages: + - google-chrome-stable diff --git a/e2e/app.e2e-spec.ts b/e2e/app.e2e-spec.ts index 9de7cc5..bf242c4 100644 --- a/e2e/app.e2e-spec.ts +++ b/e2e/app.e2e-spec.ts @@ -4,6 +4,8 @@ import { browser } from 'protractor'; describe('ImageLoader Lib E2E Tests', function () { let page: AppPage; + const browserWaitTimeout = 10000; + beforeEach(() => page = new AppPage()); beforeEach(() => page.navigateTo()); @@ -16,6 +18,18 @@ describe('ImageLoader Lib E2E Tests', function () { }); }); + describe('placeholder image', () => { + beforeEach(() => page.setWindowSize(300, 580)); + + it('should load placeholder image', () => { + expect(page.getImageElement().getAttribute('src')).toEqual('http://via.placeholder.com/35x15?text=placeholder'); + }); + + it('should update placeholder loaded boolean on init', () => { + expect(page.getplaceholderBooleanElement().getText()).toEqual('true'); + }); + }); + describe('lazy load image', () => { beforeEach(() => page.setWindowSize(300, 580)); @@ -25,34 +39,94 @@ describe('ImageLoader Lib E2E Tests', function () { expect(imageLoaderCompClass).toContain('sn-image-not-loaded'); expect(imgSrc).toEqual('http://via.placeholder.com/35x15?text=placeholder'); - page.scrollTo(0, 580 * 1.5); + page.scrollTo(0, 580 * 1.5) + .then(() => { + browser.wait(() => page.getLoadedImageElement()); + }); + imageLoaderCompClass = page.getImageLoaderComp().getAttribute('class'); imgSrc = page.getImageElement().getAttribute('srcset'); expect(imageLoaderCompClass).toContain('sn-image-loaded'); expect(imgSrc).toEqual('http://via.placeholder.com/150x350?text=xs+1x 1x, http://via.placeholder.com/300x700?text=xs+2x 2x'); + + }); + + it('should update full res image event count on when in viewport', () => { + expect(page.getFullResCountElement().getText()).toEqual('0'); + + page.scrollTo(0, 580 * 1.5) + .then(() => { + browser.wait(() => page.getLoadedImageElement()); + }); + + expect(page.getFullResCountElement().getText()).toEqual('1'); }); + }); describe('responsive image', () => { beforeEach(() => page.setWindowSize(300, 580)); it('should load correct image for device size', () => { - page.scrollTo(0, 580 * 1.5); + page.scrollTo(0, 580 * 1.5) + .then(() => { + browser.wait(() => page.getLoadedImageElement()); + }); const imageLoaderCompClass = page.getImageLoaderComp().getAttribute('class'); let imgSrc = page.getImageElement().getAttribute('srcset'); - expect(imageLoaderCompClass).toContain('sn-image-loaded'); expect(imgSrc).toEqual('http://via.placeholder.com/150x350?text=xs+1x 1x, http://via.placeholder.com/300x700?text=xs+2x 2x'); - page.setWindowSize(768, 580); + page.setWindowSize(768, 580) + .then(() => { + browser.wait(() => page.getLoadedImageElementBySrcSet( + 'http://via.placeholder.com/350x250?text=md+1x 1x, http://via.placeholder.com/700x500?text=md+2x 2x' + ), browserWaitTimeout); + }); + imgSrc = page.getImageElement().getAttribute('srcset'); expect(imgSrc).toEqual('http://via.placeholder.com/350x250?text=md+1x 1x, http://via.placeholder.com/700x500?text=md+2x 2x'); - page.setWindowSize(1024, 580); + page.setWindowSize(1024, 580) + .then(() => { + browser.wait(() => page.getLoadedImageElementBySrcSet( + 'http://via.placeholder.com/700x400?text=lg+1x 1x, http://via.placeholder.com/1400x800?text=lg+2x 2x' + ), browserWaitTimeout); + }); + imgSrc = page.getImageElement().getAttribute('srcset'); expect(imgSrc).toEqual('http://via.placeholder.com/700x400?text=lg+1x 1x, http://via.placeholder.com/1400x800?text=lg+2x 2x'); }); + + it('should update image loaded event count on window resize when image in viewport', () => { + expect(page.getFullResCountElement().getText()).toEqual('0'); + + page.scrollTo(0, 580 * 1.5) + .then(() => { + browser.wait(() => page.getLoadedImageElement()); + }); + + expect(page.getFullResCountElement().getText()).toEqual('1'); + + page.setWindowSize(768, 580) + .then(() => { + browser.wait(() => page.getLoadedImageElementBySrcSet( + 'http://via.placeholder.com/350x250?text=md+1x 1x, http://via.placeholder.com/700x500?text=md+2x 2x' + ), browserWaitTimeout); + }); + expect(page.getFullResCountElement().getText()).toEqual('2'); + + page.setWindowSize(1024, 580) + .then(() => { + browser.wait(() => page.getLoadedImageElementBySrcSet( + 'http://via.placeholder.com/700x400?text=lg+1x 1x, http://via.placeholder.com/1400x800?text=lg+2x 2x' + ), browserWaitTimeout); + }); + expect(page.getFullResCountElement().getText()).toEqual('3'); + }); + }); + }); diff --git a/e2e/app.po.ts b/e2e/app.po.ts index d4a290f..90f6728 100644 --- a/e2e/app.po.ts +++ b/e2e/app.po.ts @@ -6,13 +6,11 @@ export class AppPage { } scrollTo(x: number = 0, y: number = 0) { - browser.executeScript(`window.scrollTo(${x}, ${y})`); - browser.sleep(200); + return browser.executeScript(`window.scrollTo(${x}, ${y})`); } setWindowSize(x: number, y: number) { - browser.driver.manage().window().setSize(x, y); - browser.sleep(200); + return browser.driver.manage().window().setSize(x, y); } getImageLoaderComp() { @@ -22,4 +20,20 @@ export class AppPage { getImageElement() { return element(by.css('sn-image-loader .foo')); } + + getLoadedImageElement() { + return element(by.css('.sn-image-loaded')).isPresent(); + } + + getLoadedImageElementBySrcSet(srcSet) { + return element(by.css(`img[srcSet="${srcSet}"]`)).isPresent(); + } + + getplaceholderBooleanElement() { + return element(by.css('.placeholder-boolean')); + } + + getFullResCountElement() { + return element(by.css('.full-res-count')); + } } diff --git a/package-lock.json b/package-lock.json index dd130e6..1c0af56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1819,6 +1819,12 @@ } } }, + "conventional-commit-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz", + "integrity": "sha1-XblXOdbCEqy+e29lahG5QLqmiUY=", + "dev": true + }, "conventional-commits-filter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.0.tgz", @@ -2222,6 +2228,19 @@ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, + "cz-conventional-changelog": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz", + "integrity": "sha1-L0vHOQ4yROTfKT5ro1Hkx0Cnx2Q=", + "dev": true, + "requires": { + "conventional-commit-types": "2.2.0", + "lodash.map": "4.6.0", + "longest": "1.0.1", + "right-pad": "1.0.1", + "word-wrap": "1.2.3" + } + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -6491,6 +6510,12 @@ "lodash.isarray": "3.0.4" } }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -9194,6 +9219,12 @@ "align-text": "0.1.4" } }, + "right-pad": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", + "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", + "dev": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -11659,6 +11690,12 @@ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", diff --git a/package.json b/package.json index f172ef2..3458df5 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "codelyzer": "^4.0.1", "core-js": "^2.4.1", "coveralls": "^3.0.0", + "cz-conventional-changelog": "^2.1.0", "jasmine-core": "~2.6.2", "jasmine-spec-reporter": "~4.1.0", "karma": "~1.7.0", @@ -84,5 +85,10 @@ "tslint": "~5.7.0", "typescript": "~2.4.2", "zone.js": "^0.8.14" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } } } diff --git a/src/app/app.component.html b/src/app/app.component.html index 31a64f7..ae7e872 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,8 +1,13 @@