Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ env:
global:
- secure: RhmfgnPkrCcjOTWkfYFZS5zlBQhte2cAAtjA/bIKH4qhaLsWHHS0ApJ065PJs4H/lfslWSfnRcUpaeFq8hhr/9dMlCxFJc5CTJ2EfmV56NjsiaETtrxHdNVFtZU/DxJnSxnW4revbFkk/mM6JZ+P7XwVv+iitKhx3uRpX2/rKWA=
- secure: hmu/VH1viA8oPFjxBrjvnLrNa0PnfXsIKMMv9ZmgpXthdhTtuReD9rPmbnFzNh9MyCkLSZcndJakpDu9SwHVDcs5eyV72fuXHW/0htyN9eNTMyShrNIpOJe6JUqMez7MxQU9J45IJGSvbyEfrbZ20mbGGzJ41KnEZ0IfwODPcMY=
- secure: JrGUKctdLs9cwJlLtAHahYlJmE0jGt4/Rkt6RMD20btQcBhcvAmTJFICsYaac4h5cc0krStkeskXkZ8YANhB3OGzbLw7PGcTjnFUvVwpZKRmnsUV6puwEUH0AC6XNl4J2r9G8wPOZyy4WVxZlbdFi9To8dc8X2iufo2RyWf3MDK+OHm0CuMj6JXnJzA5FMk3pxZOjopG2W0/uAZETd9FPWmm8J6NZRsvx4nsQz2/eBjH2+MaoQYK4AcqvFFjwuume2Oali8+NQLyu7zpbfaLtLBg9+53hc59KFB/ha8Q6o0APz6rtTtgwRDckFHUVaxduTaWyKXvD0Krj3d1BvDnZVRebx4OYLstHUfnY4B6CCgKJ0ZdLVIf+I6UtHKoDu+qNc0e7EYY9rRDwFAJiE1OU+QhVE+m5UbUxHY0pCvbiKSsKe7vpe0dDvrsnuZTw8N53n7ZQF3QbMhxwLD+GONWWK6RLK1gbVbvcrBCtBsFPr6rWyYMQPPM09+aKmRTW2uRGAuf8tudiKf19Znd4EMKjVnGAW5qDxEJ2o9x357BXLCjeNH/BjxLOW4oH3bqukMXE4EmLpb6eUXCKVaRUD4+adqw8E3/iKaowotwwPl39dnqk5AmiXY4ID6vaTtFlyg1axDUfZwFysObIP1T+SDMDu2Nx3VQMlRKC4AOOmDz5co=
- secure: Qul/FmeTIuC6origZyNVniL8xm7ah29V0DJVvx7OP2+ibOtORuTa9od7gyZyhc3cuCegAaL8Q+kAxiNedy7m/UdE5eDvgSBpVJsO7g1DxSlb9dB082BSY+7VSjYY9Q08koJgTZZ/pnV3MSL9TaQzxn+HTH/nIiHgn+ZaQ0l19kjzeGclkN7HgPwpjNhb6OAtwTjf82Ys10nunv0pATgmc4BkqXP/UnJ0DXF8+tO+AVz2IRYstk0j5u75UOONvp7OTt4cpZqBK3iDY2zljduXnJ4NbOwdwi8dBk2tOLQCq+il28kM/adsyUomcj8h3qAN4RQD95yE37XZQrx1bT+aJLtphQKsaYmDFVdj5OWOOAjTyZ3J7FROyRmI74tPAAfEXBxueuP15Jlogyci3Bp341cgtBu7EX9etd2W1uTSVWDiUfFedIXgE8py5PFSX48SC0ay6hkeMei7wQ5R4d7tpuQpJ1f/zXR4YsdgKcTHU7XM13nP8QrSAa76QhRtubW0KPoIncftzvw/UKjc5pofqd8+ylQ66Xhig92jabyLKY+1CmfSRaBgj0IqLmCB08SOW7NnvPVAYqqnYNHpdCQMMrqKzMgJepBAruD/PnFAQ6/0Z6Gbkh8AUqkghMXUkf2oxz9uHyIAGf4Lo0T+BBaZWNsh9fitHdCO3YLCiVnet+Y=
before_install:
- npm install -g bower
- npm install -g grunt-cli
- npm install -g protractor && webdriver-manager update
install:
- npm install
script:
Expand Down
13 changes: 12 additions & 1 deletion Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,10 @@ module.exports = function (grunt) {
}
},
production: {
src: ["<%= config.outputDir %>js/app.min.js", "./app/components/angular-mocks/angular-mocks.js"]
options: {
vendor: ["<%= config.vendorFiles %>"]
},
src: ["<%= config.outputDir %><%= pkg.name %>.min.js", "./app/components/angular-mocks/angular-mocks.js"]
}
},

Expand Down Expand Up @@ -249,6 +252,14 @@ module.exports = function (grunt) {
src: ["**/*", "*"],
dest: "<%= config.outputDir %>data/"
}]
},
e2e: {
files: [{
expand: true,
cwd: "./app/components",
src: ["angular/angular.js"],
dest: "<%= config.outputDir %>components/"
}]
}
},

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# snInfiniteScroll

[![Build Status](https://travis-ci.org/thisissoon/sn-infinite-scroll.svg?branch=master)](https://travis-ci.org/thisissoon/sn-infinite-scroll)
[![Coverage Status](https://coveralls.io/repos/thisissoon/sn-infinite-scroll/badge.svg)](https://coveralls.io/r/thisissoon/sn-infinite-scroll)
[![Build Status](https://travis-ci.org/thisissoon/angular-infinite-scroll.svg?branch=master)](https://travis-ci.org/thisissoon/angular-infinite-scroll)
[![Coverage Status](https://coveralls.io/repos/thisissoon/angular-infinite-scroll/badge.svg)](https://coveralls.io/github/thisissoon/angular-infinite-scroll)

Simple, lightweight infinite scrolling for Angular, with no other dependencies.

Expand Down
74 changes: 67 additions & 7 deletions app/index.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<!-- build:[ng-app]:e2e myApp.e2e -->
<!--[if lt IE 8]> <html lang="en" ng-app="sn.infiniteScroll" ng-strict-di class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html lang="en" ng-app="sn.infiniteScroll" ng-strict-di class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en" ng-app="sn.infiniteScroll" ng-strict-di class="no-js"> <!--<![endif]-->
<!-- build:[ng-app]:e2e sn.infiniteScroll.e2e -->
<!--[if lt IE 8]> <html lang="en" ng-app="sn.infiniteScroll.demo" ng-strict-di class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html lang="en" ng-app="sn.infiniteScroll.demo" ng-strict-di class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en" ng-app="sn.infiniteScroll.e2e" ng-strict-di class="no-js"> <!--<![endif]-->
<!-- /build -->
<head>
<meta charset="utf-8">
Expand Down Expand Up @@ -40,11 +40,24 @@
<meta name="msapplication-TileImage" content="img/favicons/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">

</head>
<body>
<style>
.infinite-scroll {
padding: 20px;
}
.user {
height: 150px;
border-bottom: 1px solid black;
}
</style>

<div>
</head>
<body ng-controller="DemoCtrl">

<div class="infinite-scroll" sn-infinite-scroll="loadMore()" data-disabled="page.loading || page.total <= page.pages">
<h2>Infinite list of users</h2>
<div class="user" ng-repeat="user in users">
<p>{{ user.name }}</p>
</div>
</div>


Expand All @@ -68,10 +81,57 @@
<script src="js/config/config.js"></script>
<script src="js/snInfiniteScroll.js"></script>
<!-- /build -->

<script>
/**
* @module sn.infiniteScroll.demo
* @author SOON_
*/
angular.module("sn.infiniteScroll.demo", ["sn.infiniteScroll"])
.controller("DemoCtrl", [
"$scope",
"$http",
function ($scope, $http) {

$scope.users = [];

$http.get("/users")
.then(function (response) {
$scope.users = response.data.items;
$scope.page.total = response.data._pagination.total;
});

$scope.page = {
loading: false,
pages: 1
};

$scope.loadMore = function loadMore () {

$scope.page.loading = true;
$scope.page.pages++;

$http.get("/users")
.then(function(response){
$scope.users = $scope.users.concat(response.data.items);

$scope.page.loading = false;
$scope.page.total = response.data._pagination.total || 0;
});
};

}
]);
</script>
<!--<![endif]-->

<!-- build:js:e2e inline components/angular-mocks/angular-mocks.js --><!-- /build -->
<!-- build:js:e2e inline ../tests/e2e/app.e2e.js --><!-- /build -->

<!-- build:remove -->
<script src="components/angular-mocks/angular-mocks.js"></script>
<script src="../tests/e2e/app.e2e.js"></script>
<!-- /build -->

</body>
</html>
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"grunt-contrib-concat": "~0.5.1",
"grunt-contrib-connect": "~0.10.1",
"grunt-contrib-copy": "~0.8.0",
"grunt-contrib-jasmine": "~0.8.2",
"grunt-contrib-jasmine": "~0.9.1",
"grunt-contrib-jshint": "~0.11.1",
"grunt-contrib-less": "~1.0.1",
"grunt-contrib-uglify": "~0.9.1",
Expand Down
3 changes: 2 additions & 1 deletion tests/e2e/app.e2e.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
* @module sn.infiniteScroll.e2e
* @author SOON_
*/
angular.module("sn.infiniteScroll.e2e", ["sn.infiniteScroll", "ngMockE2E"])
angular.module("sn.infiniteScroll.e2e", ["sn.infiniteScroll.demo", "ngMockE2E"])
.run([
"$httpBackend",
function ($httpBackend) {

$httpBackend.whenGET(/users.*/).respond(200, { items: [{ name: "Micheal Mariah" },{ name: "Ste Letha" },{ name: "Rachel Lorena" },{ name: "Annabella Abby" }], total: 10, _pagination: { total: 3, current: 1, limit: 4 }});
$httpBackend.whenGET(/partials\/.*/).passThrough();

}
Expand Down
36 changes: 22 additions & 14 deletions tests/e2e/protractor.saucelabs.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,41 +26,47 @@ exports.config = {
"tunnel-identifier": process.env.TRAVIS_JOB_NUMBER,
"build": process.env.TRAVIS_BUILD_NUMBER,
"name": pkg.name + " (Chrome: Linux) Build: " + process.env.TRAVIS_BUILD_NUMBER,
"version": "39",
"selenium-version": "2.43.1",
"platform": "Linux"
"version": "43.0",
"selenium-version": "2.46.0",
"chromedriver-version": "2.14",
"platform": "Windows 8.1",
"screenResolution": "1024x768"
}, {
"browserName": "firefox",
"tunnel-identifier": process.env.TRAVIS_JOB_NUMBER,
"build": process.env.TRAVIS_BUILD_NUMBER,
"name": pkg.name + " (FF: Linux) Build: " + process.env.TRAVIS_BUILD_NUMBER,
"version": "34",
"selenium-version": "2.43.1",
"platform": "Linux"
"version": "39.0",
"selenium-version": "2.46.0",
"platform": "Linux",
"screenResolution": "1024x768"
}, {
"browserName": "safari",
"tunnel-identifier": process.env.TRAVIS_JOB_NUMBER,
"build": process.env.TRAVIS_BUILD_NUMBER,
"name": pkg.name + " (Safari: OS X 10.10) Build: " + process.env.TRAVIS_BUILD_NUMBER,
"version": "8",
"selenium-version": "2.43.1",
"platform": "OS X 10.10"
"selenium-version": "2.44.0",
"platform": "OS X 10.10",
"screenResolution": "1024x768"
}, {
"browserName": "internet explorer",
"tunnel-identifier": process.env.TRAVIS_JOB_NUMBER,
"build": process.env.TRAVIS_BUILD_NUMBER,
"name": pkg.name + " (IE11: Win 8.1) Build: " + process.env.TRAVIS_BUILD_NUMBER,
"version": "11",
"selenium-version": "2.43.1",
"platform": "Windows 8.1"
"selenium-version": "2.46.0",
"platform": "Windows 8.1",
"screenResolution": "1024x768"
}, {
"browserName": "internet explorer",
"tunnel-identifier": process.env.TRAVIS_JOB_NUMBER,
"build": process.env.TRAVIS_BUILD_NUMBER,
"name": pkg.name + " (IE10: Win 8) Build: " + process.env.TRAVIS_BUILD_NUMBER,
"version": "10",
"selenium-version": "2.43.1",
"platform": "Windows 8"
"selenium-version": "2.46.0",
"platform": "Windows 8",
"screenResolution": "1024x768"
}, {
"browserName": "chrome",
"tunnel-identifier": process.env.TRAVIS_JOB_NUMBER,
Expand All @@ -71,7 +77,8 @@ exports.config = {
"platformName": "Android",
"appiumVersion": "1.3.4",
"deviceName": "Android Emulator",
"device-orientation": "portrait"
"device-orientation": "portrait",
"selenium-version": "2.46.0"
}, {
"browserName": "safari",
"tunnel-identifier": process.env.TRAVIS_JOB_NUMBER,
Expand All @@ -83,7 +90,8 @@ exports.config = {
"appiumVersion": "1.3.4",
"platform": "iOS",
"deviceName": "iPhone Simulator",
"device-orientation": "portrait"
"device-orientation": "portrait",
"selenium-version": "2.46.0"
}],

// ----- More information for your tests ----
Expand Down
80 changes: 30 additions & 50 deletions tests/e2e/specs/scenarios.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,70 +2,50 @@

/* https://github.com/angular/protractor/blob/master/docs/getting-started.md */

describe("myApp", function() {
describe("sn.infiniteScroll", function() {

describe("search", function() {
var scrollTo = function scrollTo (y) {
return "document.querySelector('.infinite-scroll').scrollTop =" + y;
};

beforeEach(function(){
browser.manage().deleteAllCookies();
browser.get("http://127.0.0.1:8000/");
browser.waitForAngular();
browser.driver.sleep(2000);
});

it("should automatically redirect to / when location hash/fragment is empty", function() {
expect(browser.getLocationAbsUrl()).toMatch("/");
});

it("should render home partial when user navigates to /", function() {
expect(element.all(by.css("ng-view h1")).first().getText()).toContain("Search");
});
beforeEach(function() {
browser.get("http://127.0.0.1:8000/");
browser.waitForAngular();
browser.driver.sleep(2000);
});

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should have some end to end tests for this library, something like we do for FM Frontend mimicking page scrolls.

We can mock a page a with a list of items from a mocked api.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed

it("should search for location", function() {
element(by.model("location")).sendKeys("London");
element(by.buttonText("Submit")).click();
it("should load more pages on scroll to bottom of list (8 items total)", function() {

browser.driver.sleep(5000);
// confirm initial state
expect(element.all(by.repeater("user in users")).count()).toEqual(4);

browser.driver.wait(function() {
return browser.driver.getCurrentUrl().then(function (url) {
return /results/.test(url);
});
});
expect(browser.getLocationAbsUrl()).toMatch("/results");
expect(element.all(by.repeater("result in results")).count()).toEqual(4);
});
// 2nd page
browser.executeScript(scrollTo(2000));
browser.driver.sleep(2000);

expect(element.all(by.repeater("user in users")).count()).toEqual(8);
});

it("should load more pages on scroll to bottom of list (12 items total)", function() {

describe("results", function() {

beforeEach(function(){
browser.get("http://127.0.0.1:8000/results");
browser.waitForAngular();
browser.driver.sleep(2000);
});
// 3rd page
browser.executeScript(scrollTo(2000));
browser.executeScript(scrollTo(4000));
browser.driver.sleep(2000);

it("should render results page view", function() {
expect(element.all(by.css("ng-view h1")).first().getText()).toContain("Results");
expect(element(by.css(".alert-info")).getText()).toContain("No results");
expect(element.all(by.repeater("user in users")).count()).toEqual(12);

});

it("should go back to search page view", function() {
element(by.css("a.home")).click();

browser.driver.wait(function() {
return browser.driver.getCurrentUrl().then(function (url) {
return /\//.test(url);
});
});
});

expect(browser.getLocationAbsUrl()).toMatch("/");
it("should NOT load more pages on scroll to bottom of list", function() {

});
// 4th page - shouldn't exist
browser.executeScript(scrollTo(2000));
browser.executeScript(scrollTo(4000));
browser.executeScript(scrollTo(6000));
browser.driver.sleep(2000);

expect(element.all(by.repeater("user in users")).count()).toEqual(12);
});

});