From af630d1b3e1b52df1fafb848f44787d90fffcd87 Mon Sep 17 00:00:00 2001 From: Jesse Date: Wed, 29 Jul 2015 12:55:15 -0700 Subject: [PATCH] Add Protractor Directory --- protractor/StressTest.js | 54 ++++++++ protractor/UI/DragDrop.js | 118 ++++++++++++++++ protractor/UI/Fullscreen.js | 29 ++++ protractor/UI/InfoBubble.js | 25 ++++ protractor/UI/NewWindow.js | 72 ++++++++++ protractor/UI/RightClick.js | 30 ++++ protractor/common/Buttons.js | 20 +++ protractor/common/CreateItem.js | 173 ++++++++++++++++++++++++ protractor/common/EditItem.js | 45 ++++++ protractor/common/RightMenu.js | 90 ++++++++++++ protractor/common/drag.js | 49 +++++++ protractor/conf.js | 20 +++ protractor/create/CreateActivity.js | 40 ++++++ protractor/create/CreateActivityMode.js | 41 ++++++ protractor/create/CreateButton.js | 23 ++++ protractor/create/CreateClock.js | 84 ++++++++++++ protractor/create/CreateDisplay.js | 41 ++++++ protractor/create/CreateFolder.js | 42 ++++++ protractor/create/CreateSineWave.js | 42 ++++++ protractor/create/CreateTelemetry.js | 41 ++++++ protractor/create/CreateTimeline.js | 64 +++++++++ protractor/create/CreateTimer.js | 52 +++++++ protractor/create/CreateWebPage.js | 40 ++++++ protractor/ctrl.sh | 60 ++++++++ protractor/delete/DeleteActivity.js | 21 +++ protractor/delete/DeleteActivityMode.js | 21 +++ protractor/delete/DeleteClock.js | 21 +++ protractor/delete/DeleteDisplay.js | 21 +++ protractor/delete/DeleteFolder.js | 21 +++ protractor/delete/DeleteTelemetry.js | 21 +++ protractor/delete/DeleteTimeline.js | 21 +++ protractor/delete/DeleteTimer.js | 21 +++ protractor/delete/DeleteWebPage.js | 20 +++ protractor/logs/MAMP.log | Bin 0 -> 581 bytes protractor/logs/elasticSearch.log | Bin 0 -> 589213 bytes protractor/logs/webdriver.log | Bin 0 -> 4516366 bytes 36 files changed, 1483 insertions(+) create mode 100644 protractor/StressTest.js create mode 100644 protractor/UI/DragDrop.js create mode 100644 protractor/UI/Fullscreen.js create mode 100644 protractor/UI/InfoBubble.js create mode 100644 protractor/UI/NewWindow.js create mode 100644 protractor/UI/RightClick.js create mode 100644 protractor/common/Buttons.js create mode 100644 protractor/common/CreateItem.js create mode 100644 protractor/common/EditItem.js create mode 100644 protractor/common/RightMenu.js create mode 100644 protractor/common/drag.js create mode 100644 protractor/conf.js create mode 100644 protractor/create/CreateActivity.js create mode 100644 protractor/create/CreateActivityMode.js create mode 100644 protractor/create/CreateButton.js create mode 100644 protractor/create/CreateClock.js create mode 100644 protractor/create/CreateDisplay.js create mode 100644 protractor/create/CreateFolder.js create mode 100644 protractor/create/CreateSineWave.js create mode 100644 protractor/create/CreateTelemetry.js create mode 100644 protractor/create/CreateTimeline.js create mode 100644 protractor/create/CreateTimer.js create mode 100644 protractor/create/CreateWebPage.js create mode 100755 protractor/ctrl.sh create mode 100644 protractor/delete/DeleteActivity.js create mode 100644 protractor/delete/DeleteActivityMode.js create mode 100644 protractor/delete/DeleteClock.js create mode 100644 protractor/delete/DeleteDisplay.js create mode 100644 protractor/delete/DeleteFolder.js create mode 100644 protractor/delete/DeleteTelemetry.js create mode 100644 protractor/delete/DeleteTimeline.js create mode 100644 protractor/delete/DeleteTimer.js create mode 100644 protractor/delete/DeleteWebPage.js create mode 100644 protractor/logs/MAMP.log create mode 100644 protractor/logs/elasticSearch.log create mode 100644 protractor/logs/webdriver.log diff --git a/protractor/StressTest.js b/protractor/StressTest.js new file mode 100644 index 0000000000..f8e0715452 --- /dev/null +++ b/protractor/StressTest.js @@ -0,0 +1,54 @@ +//TODO Add filter for duplications/ +var itemCreate = require("./common/CreateItem"); +var itemEdit = require("./common/EditItem"); +var right_click = require("./common/RightMenu.js"); + +describe('Create Folder', function() { + var clickClass = new right_click(); + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Folder"; + var ITEM_TYPE = "folder"; + var ITEM_MENU_GLYPH = 'F\nFolder'; + var ITEM_GRID_SELECT = 'P\nF\nFolder\n0 Items'; + var ITEM_SIDE_SELECT = ">\nF\nFolder" + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Folder', function(){ + browser.sleep(5000); + for(var i=0; i < 50; i++){ + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE); + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + browser.sleep(1000); + // if(i === 1){ + clickClass.delete(ITEM_SIDE_SELECT, true); + element.all(by.css('.ui-symbol.view-control.ng-binding.ng-scope')).click(); + // }else{ + browser.sleep(1000); + + // clickClass.delete(ITEM_SIDE_SELECT, false); + // } + }); + } + browser.pause(); + + }); + +}); diff --git a/protractor/UI/DragDrop.js b/protractor/UI/DragDrop.js new file mode 100644 index 0000000000..80fb12ea03 --- /dev/null +++ b/protractor/UI/DragDrop.js @@ -0,0 +1,118 @@ +var fullScreenFile = require("../common/Buttons"); +var createItem = require("../common/CreateItem") +var itemEdit = require("../common/EditItem"); +var rightMenu = require("../common/RightMenu"); +var Drag = require("../common/drag"); + +describe('Test Drag and Drop', function() { + var fullScreenClass = new fullScreenFile(); + var createClass = new createItem(); + var editItemClass = new itemEdit(); + var rightMenuClass = new rightMenu(); + var dragDrop = new Drag(); + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(4000); // 4 seconds + }); + + it('should create a folder', function(){ + var ITEM_NAME = "Folder"; + var ITEM_TYPE = "folder"; + var ITEM_MENU_GLYPH = 'F\nFolder'; + var ITEM_GRID_SELECT = 'P\nF\nFolder\n0 Items'; + + browser.wait(function() { + return createClass.createButton().click(); + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE); + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1000); + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + }); + it('should create a timer',function (){ + var ITEM_NAME = "Timer"; + var ITEM_TYPE = "timer"; + var ITEM_MENU_GLYPH = 'õ\nTimer'; + var ITEM_GRID_SELECT = 'P\nõ\nTimer'; + + browser.wait(function() { + return createClass.createButton().click(); + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1500); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + + }); + it('should drag timer into folder', function(){ + var ITEM_SIDE_SELECT = ">\nF\nFolder" + var name = "õ\nTimer"; + + rightMenuClass.select(ITEM_SIDE_SELECT, true).click(); + browser.sleep(2000); + var object = element.all(by.css('.ng-isolate-scope.ng-pristine.ng-valid')).filter(function (ele){ + return ele.getText().then(function(text) { + return text === name; + }); + }); + var clock = object.get(1); + var panel = element(by.css('.items-holder.grid.abs.ng-scope')); + + //drag + expect(panel.isPresent()).toBe(true) + expect(clock.isPresent()).toBe(true) + browser.executeScript(dragDrop.DragDrop,clock.getWebElement(),panel.getWebElement()) + browser.sleep(3000); + //check + var dragObject = element.all(by.repeater('childObject in composition')).filter(function (ele) { + return ele.getText().then(function(text) { + return text === "P\nõ\nTimer" + }) + })//output console.log + /*expect(dragObject.get(0).isPresent()).toBe(true); + browser.manage().logs().get('browser').then(function(browserLogs) { + browserLogs.forEach(function(log){ + console.log(log.message); + }); + });*/ + }); + it('should delete the Folder Item', function(){ + var ITEM_SIDE_SELECT = ">\nF\nFolder" + browser.wait(function() { + return element.all(by.css('.ui-symbol.view-control.ng-binding.ng-scope')).isDisplayed(); + }); + rightMenuClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + it('should delete the Timer Item', function(){ + var ITEM_SIDE_SELECT = "õ\nTimer"; + browser.wait(function() { + return element.all(by.css('.ui-symbol.view-control.ng-binding.ng-scope')).isDisplayed(); + }); + rightMenuClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); +}); \ No newline at end of file diff --git a/protractor/UI/Fullscreen.js b/protractor/UI/Fullscreen.js new file mode 100644 index 0000000000..91c0fea36e --- /dev/null +++ b/protractor/UI/Fullscreen.js @@ -0,0 +1,29 @@ +//TODO Add filter for duplications/ +var fullScreenFile = require("../common/Buttons"); + +describe('Test Fullscreen', function() { + var fullScreenClass = new fullScreenFile(); + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(1000); + browser.wait(function(){ + return element(by.css('[title="Enter full screen mode"]')).isPresent(); + }, 7000); + browser.sleep(1000) + }); + it('should find fullscreen button', function(){ + expect(element(by.css('[title="Enter full screen mode"]')).isDisplayed()).toBeTruthy(); + + });it('should enter fullscreen when fullscreen button is pressed', function(){ + function getFullScreen(){ + return document.webkitIsFullScreen; + } + var fullscreen = browser.executeScript(getFullScreen) + expect(fullscreen).toBeFalsy(); + fullScreenClass.fullScreen() + fullscreen = browser.executeScript(getFullScreen) + expect(fullscreen).toBeTruthy(); + }); +}); \ No newline at end of file diff --git a/protractor/UI/InfoBubble.js b/protractor/UI/InfoBubble.js new file mode 100644 index 0000000000..0b32ec46f7 --- /dev/null +++ b/protractor/UI/InfoBubble.js @@ -0,0 +1,25 @@ +var fullScreenFile = require("../common/Buttons"); +var createItem = require("../common/CreateItem") +var itemEdit = require("../common/EditItem"); +var rightMenu = require("../common/RightMenu"); +var Drag = require("../common/drag"); + +describe('Test Info Bubble', function() { + var fullScreenClass = new fullScreenFile(); + var createClass = new createItem(); + var editItemClass = new itemEdit(); + var rightMenuClass = new rightMenu(); + var dragDrop = new Drag(); + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(4000); // 4 seconds + }); + it('should detect info bubble', function(){ + var myitem = (element.all(by.repeater('child in composition'))).get(0); + browser.actions().mouseMove(myitem).perform(); + browser.sleep(4000); + expect(element(by.css('.t-infobubble.s-infobubble.l-infobubble-wrapper')).isDisplayed()).toBe(true); + }); +}); \ No newline at end of file diff --git a/protractor/UI/NewWindow.js b/protractor/UI/NewWindow.js new file mode 100644 index 0000000000..56831dc045 --- /dev/null +++ b/protractor/UI/NewWindow.js @@ -0,0 +1,72 @@ +var fullScreenFile = require("../common/Buttons"); +var createClassFile = require("../common/CreateItem") +var itemEdit = require("../common/EditItem"); +var rightMenu = require("../common/RightMenu.js"); + +describe('Test New Window', function() { + var fullScreenClass = new fullScreenFile(); + var createClass = new createClassFile(); + var editItemClass = new itemEdit(); + var rightMenuClass = new rightMenu(); + + var ITEM_NAME = "Folder"; + var ITEM_TYPE = "folder"; + var ITEM_MENU_GLYPH = 'F\nFolder'; + var ITEM_GRID_SELECT = 'P\nF\nFolder\n0 Items'; + var ITEM_SIDE_SELECT = ">\nF\nFolder" + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should create an object and open it in new window', function(){ + function replaceString(string){ + //used to remove timestamp on the output so files can be compared + return string.replace(new RegExp("([0-1]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]","g"),"z"); + } + browser.wait(function() { + return createClass.createButton().click(); + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE); + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + //open file in new page + var before = browser.driver.getPageSource(); + before = browser.executeScript(replaceString, before) + + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + fullScreenClass.newWidnow().click(); + + var after = browser.driver.getPageSource(); + after = browser.executeScript(replaceString, after) + + browser.getAllWindowHandles().then(function (handles) { + browser.driver.switchTo().window(handles[1]); + browser.sleep(1000); + expect(before).toEqual(after); + browser.sleep(1000); + browser.driver.close(); + browser.driver.switchTo().window(handles[0]); + }); + }); + }); + it('should delete the object in the new window', function(){ + browser.wait(function() { + return element.all(by.css('.ui-symbol.view-control.ng-binding.ng-scope')).isDisplayed(); + }); + rightMenuClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/UI/RightClick.js b/protractor/UI/RightClick.js new file mode 100644 index 0000000000..aa892286e2 --- /dev/null +++ b/protractor/UI/RightClick.js @@ -0,0 +1,30 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Right Click Interations', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Folder"; + var ITEM_TYPE = "folder"; + var ITEM_MENU_GLYPH = 'F\nFolder'; + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the specified object', function(){ + createClass.createButton().click(); + var folder = createClass.selectNewItem(ITEM_TYPE); + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + browser.sleep(1000); + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + clickClass.delete(ITEM_NAME); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/common/Buttons.js b/protractor/common/Buttons.js new file mode 100644 index 0000000000..baf48eb43d --- /dev/null +++ b/protractor/common/Buttons.js @@ -0,0 +1,20 @@ +var Buttons = (function () { + function Buttons() { + } + //finds the Edit Button + Buttons.prototype.fullScreen = function () { + element(by.css('[title="Enter full screen mode"]')).click(); + + }; + Buttons.prototype.newWidnow = function () { + return element.all(by.css('[ng-click="parameters.action.perform()"]')).filter(function (arg) { + return arg.getAttribute("title").then(function (title){ + //expect(title).toEqual("Edit this object."); + return title == 'Open in a new browser tab'; + }) + }); + }; + return Buttons; + +})(); +module.exports = Buttons; diff --git a/protractor/common/CreateItem.js b/protractor/common/CreateItem.js new file mode 100644 index 0000000000..0a9b6d3052 --- /dev/null +++ b/protractor/common/CreateItem.js @@ -0,0 +1,173 @@ +var CreateItem = (function () { + function CreateItem() {} + //finds the Create Button + CreateItem.prototype.createButton = function () { + return element.all(by.css('[ng-click="createController.toggle()"]')); + }; + function getFolderType(arg) { + switch(arg) { + case 'folder': + return "F\nFolder" + break; + case 'display': + return "L\nDisplay Layout" + break; + case 'telemetry': + return "t\nTelemetry Panel" + break; + case 'webpage': + return "ê\nWeb Page" + break; + case 'clock': + return "C\nClock" + break; + case 'timer': + return "õ\nTimer" + case 'timeline': + return "S\nTimeline" + break; + case 'activity': + return "a\nActivity" + break; + case 'activity-mode': + return "A\nActivity Mode" + break; + case 'sinewave': + return "T\nSine Wave Generator" + break; + default: + throw new Error("Unexpect State"); + } + } + //Selects Object from Create Menu + CreateItem.prototype.selectNewItem = function (itemText) { + item = getFolderType(itemText); + browser.wait(function(){ + return element(by.css('[ng-click="createAction.perform()"]')).isPresent(); + }, 6000); + this.els =element.all(by.css('[ng-click="createAction.perform()"]')); + this.todoButton = this.els.filter(function(elem) { + return elem.getText().then(function(text) { + return text === item; + }); + }); + return this.todoButton; + }; + //Fills Out Folder Forum + CreateItem.prototype.fillFolderForum = function (folderName, type) { + this.namefields = element.all(by.css('[ng-required="ngRequired"]')).filter(function (elem) { + return elem.getAttribute('type').then(function(text) { + return text === 'text'; + }); + }); + + browser.sleep(1000); + this.namefields.clear(); + browser.sleep(1000); + + this.namefields.get(0).sendKeys(folderName); + switch(type) { + case 'folder': + // return "F\nFolder" + break; + case 'display': + this.namefields.get(1).sendKeys("1"); + browser.sleep(1000); + this.namefields.get(2).sendKeys("2"); + break; + case 'telemetry': + this.namefields.get(1).sendKeys("1"); + browser.sleep(1000); + this.namefields.get(2).sendKeys("2"); + this.dropdownElement = element.all(by.model('ngModel[field]')).filter(function(elem) { + return elem.getTagName().then(function(tag) { + return tag === 'select'; + }); + }); + this.dropdownElement.click(); + this.dropdownElement.all(by.css('option')).get(1).click(); + browser.sleep(1000); + break; + case 'webpage': + this.namefields.get(1).sendKeys("http://test.com"); + browser.sleep(1000); + break; + case 'clock': + this.dropdownElement = element.all(by.model('ngModel[field]')).filter(function(elem) { + return elem.getTagName().then(function(tag) { + return tag === 'select'; + }); + }); + this.dropdownElement.get(0).click(); + this.dropdownElement.get(0).all(by.css('option')).get(0).click(); + browser.sleep(1000); + this.dropdownElement.get(1).click(); + this.dropdownElement.get(1).all(by.css('option')).get(0).click(); + browser.sleep(1000); + + break; + case 'timer': + this.timerDate = element.all(by.model('datetime.date')); + browser.sleep(1000); + this.timerDate.clear().sendKeys("2015-07-22"); + browser.sleep(1000); + this.timerDate = element.all(by.model('datetime.hour')); + this.timerDate.get(0).sendKeys("7"); + this.timerDate = element.all(by.model('datetime.min')); + this.timerDate.get(0).sendKeys("30"); + this.timerDate = element.all(by.model('datetime.sec')); + this.timerDate.get(0).sendKeys("000"); + browser.sleep(1000); + break; + case 'timeline': + this.timerDate = element.all(by.model('datetime.days')); + this.timerDate.clear().sendKeys("10"); + browser.sleep(1000); + this.timerDate = element.all(by.model('datetime.hours')); + this.timerDate.get(0).sendKeys("7"); + this.timerDate = element.all(by.model('datetime.minutes')); + this.timerDate.get(0).sendKeys("30"); + this.timerDate = element.all(by.model('datetime.seconds')); + this.timerDate.get(0).sendKeys("3"); + browser.sleep(1000); + break; + case 'activity': + this.startDay = element.all(by.model('datetime.days')); + this.startDay.clear().sendKeys("10"); + this.startHours = element.all(by.model('datetime.hours')); + this.startHours.get(0).clear().sendKeys("7"); + this.startMinutes = element.all(by.model('datetime.minutes')); + this.startMinutes.get(0).clear().sendKeys("30"); + this.startSeconds = element.all(by.model('datetime.seconds')); + this.startSeconds.get(0).clear().sendKeys("3"); + browser.sleep(1000); + //Duration + this.startDay.get(1).clear().sendKeys("1"); + this.startHours.get(1).clear().sendKeys("1"); + this.startMinutes.get(1).clear().sendKeys("0"); + this.startSeconds.get(1).clear().sendKeys("0"); + browser.sleep(1000); + break; + case 'activity-mode': + this.namefields.get(1).sendKeys("55"); + browser.sleep(1000); + this.namefields.get(2).sendKeys("10"); + break; + case 'sinewave': + this.namefields.get(1).sendKeys("10"); + browser.sleep(1000); + break; + default: + throw new Error("Unexpect State"); + } + return element.all(by.css('[ng-click="ngModel.confirm()"]')); + + }; + //TODO USAGE FOR CLICK ON OBJECT ONCE CREATED + CreateItem.prototype.findFolder = function (){ + return element.all(by.css('[ng-click="action.perform("navigate")"]')); + }; + return CreateItem; + +})(); +module.exports = CreateItem; diff --git a/protractor/common/EditItem.js b/protractor/common/EditItem.js new file mode 100644 index 0000000000..2361317c6d --- /dev/null +++ b/protractor/common/EditItem.js @@ -0,0 +1,45 @@ +var EditItem = (function () { + function EditItem() { + } + //finds the Edit Button + EditItem.prototype.SelectItem = function (item_title) { + return element.all(by.css('.item.grid-item.ng-scope')).filter(function (arg){ + return arg.getText().then(function (text) { + // expect(text).toEqual("fh"); + return text == item_title; + }); + }); + }; + EditItem.prototype.EditButton = function () { + return element.all(by.css('[ng-click="parameters.action.perform()"]')).filter(function (arg) { + return arg.getAttribute("title").then(function (title){ + //expect(title).toEqual("Edit this object."); + return title == 'Edit this object.'; + }) + }); + }; + EditItem.prototype.CreateActivity = function () { + element.all(by.css('[ng-controller="ClickAwayController as toggle"]')).click(); + browser.sleep(1000); + var list = element.all(by.css('[ng-repeat="option in structure.options"]')).filter(function (arg){ + return arg.getText().then(function (text){ + //expect(text).toEqual("Edit this object."); + return text == "a\nActivity"; + }); + }).click(); + }; + EditItem.prototype.saveButton = function () { + element.all(by.css('[ng-click="currentAction.perform()"]')).filter(function (args){ + return args.getText().then(function (text) { + //expect(text).toEqual("Save"); + return text == "Save"; + }); + }).click(); + }; + function getFolderType(arg) { + + } + return EditItem; + +})(); +module.exports = EditItem; diff --git a/protractor/common/RightMenu.js b/protractor/common/RightMenu.js new file mode 100644 index 0000000000..c18a596103 --- /dev/null +++ b/protractor/common/RightMenu.js @@ -0,0 +1,90 @@ + +var RightMenu = (function () { + + function RightMenu() { + } + //RightMenu Click on Object + RightMenu.prototype.delete = function (name, flag) { + if(flag === 'undefined'){ + flag = true; + } + if(flag === true){ + var carrot = element.all(by.css('.ui-symbol.view-control.ng-binding.ng-scope')).get(0).click(); + } + browser.sleep(1000) + var object = element.all(by.repeater('child in composition')).filter(function (ele){ + return ele.getText().then(function(text) { + //expect(text).toEqual("3"); + return text === name; + }); + }); + browser.sleep(1000) + browser.actions().mouseMove(object.get(0)).perform(); + browser.actions().click(protractor.Button.RIGHT).perform(); + browser.sleep(1000) + var remove = element.all(by.css('.ng-binding')).filter(function (ele){ + return ele.getText().then(function (text) { + return text == "Z\nRemove"; + }) + }).click(); + browser.sleep(1000) + element.all(by.repeater('child in composition')).filter(function (ele){ + return ele.getText().then(function(text) { + return text === name; + }); + }).then(function (folder) { + expect(folder.length).toBe(0); + }); + }; + RightMenu.prototype.reset = function (name) { + var carrot = element.all(by.css('.ui-symbol.view-control.ng-binding.ng-scope')).click(); + browser.sleep(1000) + var object = element.all(by.repeater('child in composition')).filter(function (ele){ + return ele.getText().then(function(text) { + //expect(text).toEqual("3"); + return text === name; + }); + }).click(); + browser.sleep(1000) + browser.actions().mouseMove(object.get(0)).perform(); + browser.actions().click(protractor.Button.RIGHT).perform(); + browser.sleep(1000) + var remove = element.all(by.css('.ng-binding')).filter(function (ele){ + return ele.getText().then(function (text) { + return text == "r\nRestart at 0"; + }) + }).click(); + }; + RightMenu.prototype.select = function(name, flag){ + if(typeof flag == "undefined"){ + flag = true; + } + //click '<', true==yes false==no + if(flag == true){ + var carrot = element.all(by.css('.ui-symbol.view-control.ng-binding.ng-scope')).click(); + } + browser.sleep(1000) + return element.all(by.repeater('child in composition')).filter(function (ele){ + return ele.getText().then(function(text) { + // expect(text).toEqual("3"); + return text === name; + }); + }); + + }; + RightMenu.prototype.dragDrop = function(name){ + var object = element.all(by.repeater('child in composition')).filter(function (ele){ + return ele.getText().then(function(text) { + //expect(text).toEqual("3"); + return text === name; + }); + }); + var folder = object.get(0); + var panel = element(by.css('.items-holder.grid.abs.ng-scope')); + + browser.actions().dragAndDrop(folder, panel).perform(); + }; + return RightMenu; + +})(); +module.exports = RightMenu; diff --git a/protractor/common/drag.js b/protractor/common/drag.js new file mode 100644 index 0000000000..efb07551e1 --- /dev/null +++ b/protractor/common/drag.js @@ -0,0 +1,49 @@ +//drag function +/* +var e = document.createEvent("Event"); +e.initEvent('dragstart',true,false); +_element.dispatchEvent(e); +*/ +// qux.js +var Drag = (function () { + + function Drag() {}; + Drag.prototype.DragDrop = function(elem, zone){ + createEvent = function(type) { + var event = document.createEvent("event"); + event.initEvent(type, true, false); + event.dataTransfer = { + data: { + }, + setData: function(type, val){ + event.dataTransfer.data[type] = val; + }, + getData: function(type){ + return event.dataTransfer.data[type]; + } + }; + return event; + } + var event = createEvent('dragstart'); + event.effectAllowed = "copyMove"; + elem.dispatchEvent(event); + + var ele = createEvent('dragover'); + ele.preventDefault(); + zone.dispatchEvent(ele); + + var dropEvent = createEvent('drop', {}); + dropEvent.dataTransfer = event.dataTransfer; + dropEvent.preventDefault(); + zone.dispatchEvent(dropEvent); + + var dragEndEvent = createEvent('dragend', {}); + dragEndEvent.dataTransfer = event.dataTransfer; + elem.dispatchEvent(dragEndEvent); + }; + return Drag; +})(); +module.exports = Drag; + + + diff --git a/protractor/conf.js b/protractor/conf.js new file mode 100644 index 0000000000..9d2693c2cf --- /dev/null +++ b/protractor/conf.js @@ -0,0 +1,20 @@ +// conf.js +exports.config = { + allScriptsTimeout: 500000, + defaultTimeoutInterval: 60000, + seleniumAddress: 'http://localhost:4444/wd/hub', + //specs: ['StressTest.js'], + specs: [ 'create/CreateActivity.js', 'delete/DeleteActivity.js', 'create/CreateActivityMode.js', 'delete/DeleteActivityMode.js', + 'create/CreateActivityMode.js', 'create/CreateClock.js', 'delete/DeleteClock.js', + 'create/CreateDisplay.js', 'delete/DeleteDisplay.js', 'create/CreateFolder.js', 'delete/DeleteFolder.js', + 'create/CreateTelemetry.js', 'delete/DeleteTelemetry.js', 'create/CreateTimeline.js', 'delete/DeleteTimeline.js', + 'create/CreateTimer.js', 'delete/DeleteTimer.js', 'create/CreateWebPage.js', 'delete/DeleteWebPage.js', + 'UI/Fullscreen.js', 'create/CreateButton.js', "UI/DragDrop.js", "UI/NewWindow.js", 'UI/InfoBubble.js' + ], + capabilities: { + 'browserName': 'chrome', // or 'safari' + 'chromeOptions': { + // 'args' : ['--remote-debugging-port=9222'] + } + }, +} diff --git a/protractor/create/CreateActivity.js b/protractor/create/CreateActivity.js new file mode 100644 index 0000000000..2045d0df4c --- /dev/null +++ b/protractor/create/CreateActivity.js @@ -0,0 +1,40 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); + +describe('Create Activity', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Activity"; + var ITEM_TYPE = "activity"; + var ITEM_MENU_GLYPH = 'a\nActivity'; + var ITEM_GRID_SELECT = 'P\na\nActivity\n0 Items'; + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 2 seconds + }); + it('should Create new Activity', function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + var ok = createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1000); + //ok.click(); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + }); + + }); + +}); diff --git a/protractor/create/CreateActivityMode.js b/protractor/create/CreateActivityMode.js new file mode 100644 index 0000000000..f9354ec492 --- /dev/null +++ b/protractor/create/CreateActivityMode.js @@ -0,0 +1,41 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); + +describe('Create Web Page', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Activity Mode"; + var ITEM_TYPE = "activity-mode"; + var ITEM_MENU_GLYPH = 'A\nActivity Mode'; + var ITEM_GRID_SELECT = 'P\nA\nActivity Mode'; + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Activity Mode', function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME,ITEM_TYPE).click(); + browser.sleep(1000); + + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + + }); + +}); diff --git a/protractor/create/CreateButton.js b/protractor/create/CreateButton.js new file mode 100644 index 0000000000..a64266d88a --- /dev/null +++ b/protractor/create/CreateButton.js @@ -0,0 +1,23 @@ +//TODO Add filter for duplications/ +describe('Create Button', function() { + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 10 seconds + }); + //it('should hava title "My Items"', function(){ + // expect(browser.getTitle()).toEqual('My Items'); + //}); + it('should find create menu to be invisible', function(){ + expect(element(by.css('[ng-show="createController.isActive()"]')).isDisplayed()).toBeFalsy(); + }); + it('should find create menu only visable after the create button clicked', function(){ + element(by.css('[ng-click="createController.toggle()"]')).click(); + expect(element(by.css('[ng-show="createController.isActive()"]')).isDisplayed()).toBeTruthy(); + }); + it('should find create menu only visable after the create button clicked', function(){ + element(by.css('[ng-click="createController.toggle()"]')).click(); + expect(element(by.css('[ng-show="createController.isActive()"]')).isDisplayed()).toBeTruthy(); + }); + +}); diff --git a/protractor/create/CreateClock.js b/protractor/create/CreateClock.js new file mode 100644 index 0000000000..7a42b45527 --- /dev/null +++ b/protractor/create/CreateClock.js @@ -0,0 +1,84 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); +var rightClick = require("../common/RightMenu"); +describe('Create Clock', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var rightClickClass = new rightClick(); + + var ITEM_NAME = "Clock"; + var ITEM_TYPE = "clock"; + var ITEM_MENU_GLYPH = 'C\nClock'; + var ITEM_GRID_SELECT = 'P\nC\nClock'; + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Clock', function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME,ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + + }); + it('should check clock', function () { + + function getTime() { + function addZero(time){ + if(time < 10){ + return '0' + time; + } + return time; + } + var currentdate = new Date(); + + + var month = currentdate.getMonth() + 1; + month = addZero(month); + + var day = currentdate.getDate(); + day = addZero(day); + + var hour = currentdate.getHours() - 5; + hour = addZero(hour); + + var second = currentdate.getSeconds(); + second = addZero(second); + + var minute = currentdate.getMinutes(); + minute = addZero(minute); + + return ("UTC " + currentdate.getFullYear() + "/" + (month) + "/" + + day + " " + (hour) + ":" + minute + ":" + second + " PM"); + } + + var current,clock; + rightClickClass.select(ITEM_MENU_GLYPH, true).click().then(function () { + browser.sleep(1000); + current = browser.executeScript(getTime); + }).then(function () { + clock = element(by.css('.l-time-display.l-digital.l-clock.s-clock.ng-scope')); + clock.getText().then(function (time) { + expect(current).toEqual(time); + }) + }) + + }); +}); diff --git a/protractor/create/CreateDisplay.js b/protractor/create/CreateDisplay.js new file mode 100644 index 0000000000..71fe5091b7 --- /dev/null +++ b/protractor/create/CreateDisplay.js @@ -0,0 +1,41 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); + +describe('Create Display', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Display"; + var ITEM_TYPE = "display"; + var ITEM_MENU_GLYPH = 'L\nDisplay Layout'; + var ITEM_GRID_SELECT = 'P\nL\nDisplay\n0 Items'; + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Display', function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME,ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + + }); + +}); diff --git a/protractor/create/CreateFolder.js b/protractor/create/CreateFolder.js new file mode 100644 index 0000000000..26b6bfb8d1 --- /dev/null +++ b/protractor/create/CreateFolder.js @@ -0,0 +1,42 @@ +//TODO Add filter for duplications/ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); + +describe('Create Folder', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Folder"; + var ITEM_TYPE = "folder"; + var ITEM_MENU_GLYPH = 'F\nFolder'; + var ITEM_GRID_SELECT = 'P\nF\nFolder\n0 Items'; + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Folder', function(){ + + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE); + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + + }); + +}); diff --git a/protractor/create/CreateSineWave.js b/protractor/create/CreateSineWave.js new file mode 100644 index 0000000000..ed1d454e27 --- /dev/null +++ b/protractor/create/CreateSineWave.js @@ -0,0 +1,42 @@ +var itemCreate = require("../common/CreateItem"); + +describe('Create Sine Wave Generator', function() { + var createClass = new itemCreate(); + var ITEM_NAME = "Sine Wave G"; + var ITEM_TYPE = "sinewave"; + var ITEM_MENU_GLYPH = 'T\nSine Wave Generator' + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Sin Wave Generator' , function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + var ok = createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE); + browser.sleep(1000); + ok.click(); + }).then(function (){ + var checkfolder = element.all(by.css('.title.ng-binding')).filter(function (ele) { + return ele.getTagName('div').then(function (tag){ + return tag == 'div'; + }); + }) + expect(checkfolder.getText()).toEqual([ '', 'Sine Wave G' ]); + + }); + + }); + +}); diff --git a/protractor/create/CreateTelemetry.js b/protractor/create/CreateTelemetry.js new file mode 100644 index 0000000000..fbf3da1362 --- /dev/null +++ b/protractor/create/CreateTelemetry.js @@ -0,0 +1,41 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); + +describe('Create Telemetry', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Telemetry"; + var ITEM_TYPE = "telemetry"; + var ITEM_MENU_GLYPH = 't\nTelemetry Panel' + var ITEM_GRID_SELECT = 'P\nt\nTelemetry\n0 Items'; + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Telemetry', function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + + }); + +}); diff --git a/protractor/create/CreateTimeline.js b/protractor/create/CreateTimeline.js new file mode 100644 index 0000000000..69fc31b006 --- /dev/null +++ b/protractor/create/CreateTimeline.js @@ -0,0 +1,64 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); + +describe('Create Timeline', function() { + var createItemClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Timeline"; + var ITEM_TYPE = "timeline"; + var ITEM_MENU_GLYPH = 'S\nTimeline'; + var ITEM_GRID_SELECT = 'P\nS\nTimeline\n0 Items'; + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create Timeline', function(){ + //button.click() + browser.wait(function() { + createItemClass.createButton().click(); + return true; + }).then(function (){ + var folder = createItemClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createItemClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + var fo= element.all(by.css('.item.grid-item.ng-scope')).filter(function (arg){ + return arg.getText().then(function (text) { + expect(text).toEqual("fh"); + return text == ITEM_GRID_SELECT; + }); + }); + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + + }); + }); + it('should Create Timeline Activity', function(){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + item.click(); + browser.sleep(1000); + expect(browser.getTitle()).toEqual(ITEM_NAME); + browser.sleep(1000); + var edit = editItemClass.EditButton(); + expect(edit.count()).toBe(1); + edit.click(); + browser.sleep(1000); + editItemClass.CreateActivity(); + var ok = createItemClass.fillFolderForum("Activity", "activity"); + browser.sleep(1000); + ok.click(); + browser.sleep(1000); + editItemClass.saveButton(); + //save.click(); + browser.sleep(5000); + }); + +}); diff --git a/protractor/create/CreateTimer.js b/protractor/create/CreateTimer.js new file mode 100644 index 0000000000..bd49451106 --- /dev/null +++ b/protractor/create/CreateTimer.js @@ -0,0 +1,52 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); +var rightClick = require("../common/RightMenu"); + +describe('Create Timer', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var rightMenu = new rightClick(); + + var ITEM_NAME = "Timer"; + var ITEM_TYPE = "timer"; + var ITEM_MENU_GLYPH = 'õ\nTimer'; + var ITEM_GRID_SELECT = 'P\nõ\nTimer'; + + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create Timer', function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem(ITEM_TYPE) + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME, ITEM_TYPE).click(); + browser.sleep(1500); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + }); + it('should test Timer', function(){ + browser.sleep(2000) + rightMenu.reset(ITEM_MENU_GLYPH); + browser.sleep(1000) + var timer = element(by.css('.value.ng-binding.active')) + timer.getText().then(function (time) { + expect(time).toEqual("0D 00:00:01") + }) + }); + +}); diff --git a/protractor/create/CreateWebPage.js b/protractor/create/CreateWebPage.js new file mode 100644 index 0000000000..a54a32cf7e --- /dev/null +++ b/protractor/create/CreateWebPage.js @@ -0,0 +1,40 @@ +var itemCreate = require("../common/CreateItem"); +var itemEdit = require("../common/EditItem"); + +describe('Create Web Page', function() { + var createClass = new itemCreate(); + var editItemClass = new itemEdit(); + var ITEM_NAME = "Webpage"; + var ITEM_TYPE = "webpage"; + var ITEM_MENU_GLYPH = 'ê\nWeb Page'; + var ITEM_GRID_SELECT = 'P\nê\nWebpage'; + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should Create new Web Page', function(){ + //button.click() + browser.wait(function() { + createClass.createButton().click(); + return true; + }).then(function (){ + var folder = createClass.selectNewItem('webpage') + expect(folder.getText()).toEqual([ ITEM_MENU_GLYPH ]); + browser.sleep(1000); + folder.click() + }).then(function() { + browser.wait(function () { + return element.all(by.model('ngModel[field]')).isDisplayed(); + }) + createClass.fillFolderForum(ITEM_NAME,ITEM_TYPE).click(); + browser.sleep(1000); + }).then(function (){ + var item = editItemClass.SelectItem(ITEM_GRID_SELECT); + expect(item.count()).toBe(1); + browser.sleep(1000); + }); + + }); + +}); diff --git a/protractor/ctrl.sh b/protractor/ctrl.sh new file mode 100755 index 0000000000..04d6ebcc45 --- /dev/null +++ b/protractor/ctrl.sh @@ -0,0 +1,60 @@ +#! /bin/bash +ARGUMENT=$1; +DIRECTORY=/Users/jsanderf/Applications; + +if [ $# != 1 ]; then + echo "Expected 1 Aurgument. Received " $# 1>&2; + exit 1 +fi +#Start webdrive and http-server +if [ $ARGUMENT == start ]; then + echo + echo "Starting MMAP ..." + $DIRECTORY/MAMP/ctlscript.sh start > logs/MAMP.log 2>&1 & + wait $! + if [ $? != 0 ]; then + echo " Error: MMAP" + echo " Check Log file" + echo + else + echo " Started: MMAP" + echo + fi + echo "Starting webdriver ..." + webdriver-manager start > logs/webdriver.log 2>&1 & + sleep 3; + if grep -iq "Exception" logs/webdriver.log; then + echo " Error: webdriver-manager" + echo " Check Log file" + echo + else + echo " Started: webdriver-manager" + fi + echo "Starting Elastic Search..." + elasticsearch > logs/elasticSearch.log 2>&1 & + sleep 3; + if grep -iq "Exception" logs/elasticSearch.log; then + echo " Error: ElasticSearch" + echo " Check Log file" + echo + else + echo " Started: ElasticSearch" + fi +#Runs Protractor tests +elif [ $ARGUMENT == run ]; then + protractor ./conf.js +#Kill Process +elif [ $ARGUMENT == stop ]; then + echo "Stopping MAMP" + $DIRECTORY/MAMP/ctlscript.sh stop >> logs/MAMP.log 2>&1 & + sleep 1; + echo "Stopping webdriver ..." + kill $(ps aux | grep "[p]rotractor" | awk '{print $2}'); + kill $(ps aux | grep "[w]ebdriver-manager" | awk '{print $2}'); + sleep 1; + echo "Stopping Elastic..." + kill $(ps aux | grep "[e]lastic" | awk '{print $2}'); + sleep 1; +else + echo "Unkown: Command" $1; +fi diff --git a/protractor/delete/DeleteActivity.js b/protractor/delete/DeleteActivity.js new file mode 100644 index 0000000000..c33f533ea1 --- /dev/null +++ b/protractor/delete/DeleteActivity.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Activity', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Activity"; + var ITEM_TYPE = "activity"; + var ITEM_MENU_GLYPH = 'a\nActivity'; + //var ITEM_GRID_SELECT = 'P\nS\nTimeline\n0 Items'; + var ITEM_SIDE_SELECT = ">\na\nActivity" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the Activity', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteActivityMode.js b/protractor/delete/DeleteActivityMode.js new file mode 100644 index 0000000000..33212c2283 --- /dev/null +++ b/protractor/delete/DeleteActivityMode.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Activity Mode', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Activity Mode"; + var ITEM_TYPE = "activity-mode"; + var ITEM_MENU_GLYPH = 'A\nActivity Mode'; + var ITEM_GRID_SELECT = 'P\nA\nActivity Mode'; + var ITEM_SIDE_SELECT = "A\nActivity Mode" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the Activty Mode', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteClock.js b/protractor/delete/DeleteClock.js new file mode 100644 index 0000000000..b7d5fb5d51 --- /dev/null +++ b/protractor/delete/DeleteClock.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Clock', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Clock"; + var ITEM_TYPE = "clock"; + var ITEM_MENU_GLYPH = 'C\nClock'; + var ITEM_GRID_SELECT = 'P\nC\nClock'; + var ITEM_SIDE_SELECT = "C\nClock"; + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the Clock', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteDisplay.js b/protractor/delete/DeleteDisplay.js new file mode 100644 index 0000000000..101392638c --- /dev/null +++ b/protractor/delete/DeleteDisplay.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Display', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Display"; + var ITEM_TYPE = "display"; + var ITEM_MENU_GLYPH = 'L\nDisplay Layout'; + var ITEM_GRID_SELECT = 'P\nL\nDisplay Layout'; + var ITEM_SIDE_SELECT = ">\nL\nDisplay" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the Dispay', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteFolder.js b/protractor/delete/DeleteFolder.js new file mode 100644 index 0000000000..4a1180e3ab --- /dev/null +++ b/protractor/delete/DeleteFolder.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Folder', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Folder"; + var ITEM_TYPE = "folder"; + var ITEM_MENU_GLYPH = 'F\nFolder'; + var ITEM_GRID_SELECT = 'P\nF\nFolder\n0 Items'; + var ITEM_SIDE_SELECT = ">\nF\nFolder" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the folder', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteTelemetry.js b/protractor/delete/DeleteTelemetry.js new file mode 100644 index 0000000000..26a0bfe0f1 --- /dev/null +++ b/protractor/delete/DeleteTelemetry.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Telemetry', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Telemetry"; + var ITEM_TYPE = "telemetry"; + var ITEM_MENU_GLYPH = 't\nTelemetry Panel' + var ITEM_GRID_SELECT = 'P\nt\nTelemetry\n0 Items'; + var ITEM_SIDE_SELECT = ">\nt\nTelemetry" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the Telemetry', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteTimeline.js b/protractor/delete/DeleteTimeline.js new file mode 100644 index 0000000000..c693911ec5 --- /dev/null +++ b/protractor/delete/DeleteTimeline.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Timeline', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Timeline"; + var ITEM_TYPE = "timeline"; + var ITEM_MENU_GLYPH = 'S\nTimeline'; + var ITEM_GRID_SELECT = 'P\nS\nTimeline\n0 Items'; + var ITEM_SIDE_SELECT = ">\nS\nTimeline" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the specified object', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteTimer.js b/protractor/delete/DeleteTimer.js new file mode 100644 index 0000000000..4c5645760d --- /dev/null +++ b/protractor/delete/DeleteTimer.js @@ -0,0 +1,21 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Timer', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Timer"; + var ITEM_TYPE = "timer"; + var ITEM_MENU_GLYPH = 'õ\nTimer'; + var ITEM_GRID_SELECT = 'P\nõ\nTimer'; + var ITEM_SIDE_SELECT = "õ\nTimer" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the Timer', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/delete/DeleteWebPage.js b/protractor/delete/DeleteWebPage.js new file mode 100644 index 0000000000..aa40e86453 --- /dev/null +++ b/protractor/delete/DeleteWebPage.js @@ -0,0 +1,20 @@ +var right_click = require("../common/RightMenu.js"); +var Create = require("../common/CreateItem") +describe('Delete Webpage', function() { + var clickClass = new right_click(); + var createClass = new Create(); + var ITEM_NAME = "Webpage"; + var ITEM_TYPE = "webpage"; + var ITEM_MENU_GLYPH = 'ê\nWeb Page'; + var ITEM_SIDE_SELECT = "ê\nWebpage" + beforeEach(function() { + browser.ignoreSynchronization = true; + browser.get('http://localhost:1984/warp/'); + browser.sleep(2000); // 20 seconds + }); + it('should delete the Webpage', function(){ + clickClass.delete(ITEM_SIDE_SELECT); + browser.sleep(1000); + }); + +}); \ No newline at end of file diff --git a/protractor/logs/MAMP.log b/protractor/logs/MAMP.log new file mode 100644 index 0000000000000000000000000000000000000000..f2933b7cf5db7f2ef96dfa904fe58fd4f64cd497 GIT binary patch literal 581 zcmc(c!3u&v5I{To6?3dho05gzJckrS=NOzdH`aCA*&zQu%{&FwC7RPPFg$oq99TLQ zXGTNPl_IlNs{*}h42wL=ccO0jq6HUDSH z3ihq>c!TXG5Fa6Ev8ZJ9imAM}G*VXaPbushYb6Df|4kS#)=|<4O`{}@SA%6bGM4hW iL+P3tdh4aq5g literal 0 HcmV?d00001 diff --git a/protractor/logs/elasticSearch.log b/protractor/logs/elasticSearch.log new file mode 100644 index 0000000000000000000000000000000000000000..9ad8811cd73c14d2ff463d553b6236bde0a9930e GIT binary patch literal 589213 zcmeIwPjBNy7zbdk&8L_nNQvV(f7;{*h)OG@-9z_;Wg#~$7HK!E zDB}2x54Jqx-@Nm@PLp`Cp2e55WE&RAF4^vq)pWg1vh>yK>o*}wo3<#!xsiqR<~}dl zU&HrRbC-pO^3YdplP;o76lc@WRYkhFO19(U?XjwhbYB$9e7~B%-*GdGw{I8A-Ey;A zu71cS>G?vIFE6BOs-ep3>i4m%5Jk~HMQ@*@yZU%nHT|cj{P>J@n-^sf((z1vHI)7M zbUu9(Up=Rn&BLe3r#By`ANy0q=^_h7KIEaxhx>jSerb=*Fz%Gj!a(&g1ATHW0~%?<64*B_=eDMo`r9!rg(eEo4#ug z!*{>!%WgRRjZbTaHr$R2!gx=&%Q()m$;G$#dDE2jXV&gQ96et1r~B^l+sVbnX}7;W z{JJO(W#5OqK9qU!E>z9fmNJ`sVGtldfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk|4ATC;>CIvU(S+kSR}h- zyIZfP%SD`}uU=oj30c~-MH$YGETlJ8{ZJmV&<}0bRn1+9qG)nHakGATVp;q@Vf(u6 QKVRKt@}lZafn#xh0e+D?4*&oF literal 0 HcmV?d00001 diff --git a/protractor/logs/webdriver.log b/protractor/logs/webdriver.log new file mode 100644 index 0000000000000000000000000000000000000000..68fa88863fedc7d13ada65797b8ebf5584e49af3 GIT binary patch literal 4516366 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 P>1lE~2#wzTH6Q;ETw5i9 literal 0 HcmV?d00001