Skip to content

Commit

Permalink
Merge pull request #1077 from lukzeg/fix/enable_reopening_device_view
Browse files Browse the repository at this point in the history
#1076 - Fix/enable reopening device view
  • Loading branch information
koral-- authored Feb 8, 2020
2 parents 1937cfb + 7d593cd commit 6742a4d
Show file tree
Hide file tree
Showing 9 changed files with 224 additions and 18 deletions.
1 change: 0 additions & 1 deletion TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ Test results can be found in:

---

===
## Multiple Browsers Local STF with a specific suite
- Connect a device
- Run stf
Expand Down
8 changes: 5 additions & 3 deletions res/app/device-list/icons/device-list-icons-directive.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ module.exports = function DeviceListIconsDirective(
a.removeAttribute('href')
li.classList.add('device-is-busy')
}

return li
}
}
Expand Down Expand Up @@ -159,8 +158,11 @@ module.exports = function DeviceListIconsDirective(
}

if (device.using) {
kickDevice(device)
e.preventDefault()
if (e.target.classList.contains('btn') &&
e.target.classList.contains('state-using')) {
kickDevice(device)
e.preventDefault()
}
}
}
})
Expand Down
19 changes: 13 additions & 6 deletions res/test/e2e/control/control-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,21 @@ describe('Control Page', function() {
this.get = function() {
browser.get(localhost + 'control')
}
this.kickDeviceButton = element.all(by.css('.kick-device')).first()
this.kickDevice = function() {
this.openDevicesDropDown()
this.kickDeviceButton.click()
}

this.kickDeviceButton = element.all(by.css('.kick-device'))
this.devicesDropDown = element(by.css('.device-name-text'))

this.openDevicesDropDown = function() {
this.devicesDropDown.click()
return this.devicesDropDown.click()
}

this.getFirstKickDeviceButton = function() {
return this.kickDeviceButton.first()
}

this.kickDevice = function() {
this.openDevicesDropDown()
this.getFirstKickDeviceButton().click()
}
}

Expand Down
78 changes: 78 additions & 0 deletions res/test/e2e/devices/devices-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ describe('Device Page', function() {
var DeviceListPage = require('./')
var deviceListPage = new DeviceListPage()

var LoginPage = require('../login')
var loginPage = new LoginPage()

var WidgetContainerPage = require('../widget-container')
var widgetContainerObj = new WidgetContainerPage()

it('should go to Devices List page', function() {
deviceListPage.get()
browser.getCurrentUrl().then(function(newUrl) {
Expand All @@ -20,6 +26,18 @@ describe('Device Page', function() {
expect(deviceListPage.searchInput.getAttribute('value')).toBe('state: "available"')
})

it('should not display used device if filter is set to - state using', function() {
deviceListPage.get()
deviceListPage.filterUsingDevices()
deviceListPage.getNumberOfFilteredOutDevices().then(function(amount) {
var filteredOut = amount
deviceListPage.numberOfDevices().then(function(amount) {
var notFiltered = amount
expect(notFiltered - filteredOut).toBe(0)
})
})
})

it('should have more than 1 device available', function() {
expect(deviceListPage.devicesUsable.count()).toBeGreaterThan(0)
})
Expand All @@ -28,6 +46,66 @@ describe('Device Page', function() {
expect(deviceListPage.availableDevice().getAttribute('class')).toMatch('state-available')
})

it('should be able to unassign used device', function() {
deviceListPage.get()
deviceListPage.controlAvailableDevice()
deviceListPage.get()
deviceListPage.unassignDevice()
browser.getCurrentUrl().then(function(newUrl) {
expect(newUrl).toBe(browser.baseUrl + 'devices')
})
})

it('should be able to reuse assign device', function() {
// Test for issue #1076

deviceListPage.get()
deviceListPage.controlAvailableDevice()
deviceListPage.get()
deviceListPage.selectAssignedDevice()
browser.getCurrentUrl().then(function(newUrl) {
expect(newUrl).toContain(browser.baseUrl + 'control/')
})
})

it('should one device be marked as busy as is used by another user', function() {
deviceListPage.get()
deviceListPage.controlAvailableDevice()

loginPage.doFreshLogin('tester', 'test_user2@login.com')
deviceListPage.get()
expect(deviceListPage.getNumberOfBusyDevices()).toBe(1)
})

it('should not be able to pick up device marked as busy', function() {
deviceListPage.get()
deviceListPage.controlAvailableDevice()

loginPage.doFreshLogin('tester', 'test_user2@login.com')
deviceListPage.get()
deviceListPage.selectBusyDevice()
browser.getCurrentUrl().then(function(newUrl) {
expect(newUrl).toContain(browser.baseUrl + 'devices')
})
})

afterEach(function() {
// Relogin to test account if don't use standard test account
deviceListPage.get()
widgetContainerObj.getUserNameFromWidget().then(function(userName) {
if (userName.toLowerCase() !== loginPage.getUserName().toLowerCase()) {
loginPage.doFreshLogin()
}
})

// Unassign element if is assigned
deviceListPage.get()
deviceListPage.deviceStopUsingBtn.count().then(function(elements) {
if (elements > 0) {
deviceListPage.unassignDevice()
}
})
})
})

describe('List View', function() {
Expand Down
54 changes: 51 additions & 3 deletions res/test/e2e/devices/index.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,70 @@
module.exports = function DeviceListPage() {

this.get = function() {
// TODO: Let's get rid off the login first
browser.get(browser.baseUrl + 'devices')
browser.wait(waitUrl(/devices/), 5000)
}

this.devices = element(by.model('tracker.devices'))
this.deviceStopUsingBtn = element.all(by.css('.state-using'))
this.devicesByCss = element.all(by.css('ul.devices-icon-view > li'))
this.devicesUsable = element.all(by.css('.state-available'))
this.devicesBusy = element.all(by.css('.state-busy'))
this.searchInput = element(by.model('search.deviceFilter'))
this.devicesFilteredOut = element.all(by.xpath('//*[contains(@class, "filter-out")]'))

this.filterAvailableDevices = function() {
return this.searchInput.sendKeys('state: "available"')
}

this.filterUsingDevices = function() {
return this.searchInput.sendKeys('state: "using"')
}

this.numberOfDevices = function() {
return this.devicesByCss.count()
return this.devicesByCss.count().then(function(amount) {
return amount
})
}

this.getNumberOfFilteredOutDevices = function() {
return this.devicesFilteredOut.count().then(function(amount) {
return amount
})
}

this.getNumberOfBusyDevices = function() {
return this.devicesBusy.count().then(function(amount) {
return amount
})
}

this.availableDevice = function() {
return this.devicesUsable.first()
}

this.controlAvailableDevice = function() {
return this.availableDevice().click()
this.availableDevice().click()
browser.wait(waitUrl(/control/), 5000)
}

this.assignedDevice = function() {
return this.deviceStopUsingBtn.first()
}

this.getFirstBusyDevice = function() {
return this.devicesBusy.first()
}

this.unassignDevice = function() {
return this.assignedDevice().click()
}

this.selectAssignedDevice = function() {
return this.assignedDevice().element(by.xpath('..')).click()
}

this.selectBusyDevice = function() {
return this.getFirstBusyDevice().element(by.xpath('..')).click()
}
}
26 changes: 22 additions & 4 deletions res/test/e2e/login/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,24 @@ module.exports = function LoginPage() {
return this.username.submit()
}

this.doLogin = function() {
this.getUserName = function() {
return this.login.username
}

this.doLogin = function(userName, email, password) {
var EC = protractor.ExpectedConditions
var timeout = 15000
var loginName = (typeof userName !== 'undefined') ? userName : this.login.username
var loginEmail = (typeof email !== 'undefined') ? email : this.login.email
var loginPassword = (typeof password !== 'undefined') ? email : this.login.password

this.get()
browser.wait(EC.presenceOf(element(by.css('[value="Log In"]'))), timeout)
this.setName(this.login.username)
this.setName(loginName)
if (this.login.method === 'ldap') {
this.setPassword(this.login.password)
this.setPassword(loginPassword)
} else {
this.setEmail(this.login.email)
this.setEmail(loginEmail)
}

this.submit()
Expand All @@ -51,6 +59,16 @@ module.exports = function LoginPage() {
})
}

this.doFreshLogin = function(userName, email, password) {
// Clean up cookies
browser.executeScript('window.localStorage.clear();')
browser.executeScript('window.sessionStorage.clear();')
browser.driver.manage().deleteAllCookies()

// Procced again through login process
this.doLogin(userName, email, password)
}

this.cleanUp = function() {
this.username = null
this.password = null
Expand Down
18 changes: 18 additions & 0 deletions res/test/e2e/widget-container/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module.exports = function WidgetContainerPage() {

this.get = function() {
browser.get(browser.baseUrl + 'devices')
browser.wait(waitUrl(/devices/), 5000)
}

this.userName = element(by.binding('currentUser.name'))
this.amountOfAssignedToUserDevices = element(by.xpath('//*[@class="number color-orange"]/span'))

this.getUserNameFromWidget = function() {
return this.userName.getText()
}

this.getAmountOfAssignedToUserDevices = function() {
return this.amountOfAssignedToUserDevices.getText()
}
}
36 changes: 36 additions & 0 deletions res/test/e2e/widget-container/widget-container-spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
describe('Widget Container Page', function() {

var DeviceListPage = require('../devices')
var deviceListPage = new DeviceListPage()

var WidgetContainerPage = require('./')
var widgetContainerObj = new WidgetContainerPage()

var LoginPage = require('../login')
var loginPage = new LoginPage()

it('should display amount of devices used by the user', function() {
deviceListPage.get()
deviceListPage.controlAvailableDevice()
deviceListPage.get()
widgetContainerObj.getAmountOfAssignedToUserDevices().then(function(amount) {
expect(amount).toBe('1')
})
})

it('should display user name after login on widget', function() {
widgetContainerObj.getUserNameFromWidget().then(function(userName) {
expect(userName.toLowerCase()).toBe(loginPage.getUserName().toLowerCase())
})
})

afterEach(function() {
// Unassign element if is assigned
deviceListPage.get()
deviceListPage.deviceStopUsingBtn.count().then(function(elements) {
if (elements > 0) {
deviceListPage.unassignDevice()
}
})
})
})
2 changes: 1 addition & 1 deletion res/test/protractor.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ module.exports.config = {
reportTitle: 'Protractor Test Execution Report',
outputPath: dashboardReportDirectory,
outputFilename: 'index',
screenshotPath: './',
screenshotPath: '.',
testBrowser: browserName,
browserVersion: browserVersion,
modifiedSuiteName: false,
Expand Down

0 comments on commit 6742a4d

Please sign in to comment.