From 871956956cec9a39ed891916ebed775705104059 Mon Sep 17 00:00:00 2001 From: Julio Casal Date: Fri, 18 Sep 2015 15:12:59 -0700 Subject: [PATCH 1/2] Add definitions for msportalfx-test --- msportalfx-test/msportalfx-test-tests.ts | 81 ++++++++ msportalfx-test/msportalfx-test.d.ts | 224 +++++++++++++++++++++++ 2 files changed, 305 insertions(+) create mode 100644 msportalfx-test/msportalfx-test-tests.ts create mode 100644 msportalfx-test/msportalfx-test.d.ts diff --git a/msportalfx-test/msportalfx-test-tests.ts b/msportalfx-test/msportalfx-test-tests.ts new file mode 100644 index 000000000..4bf402d1b --- /dev/null +++ b/msportalfx-test/msportalfx-test-tests.ts @@ -0,0 +1,81 @@ + +/// + +import testFx = require('MsPortalFx-Test'); + +var galleryPackageName = "My.Package"; +var bladeTitle = "A Service"; +var resourceProvider = 'My.Provider'; +var resourceType = 'myResourceType'; +var resourceName = 'myResource'; +var userName = 'johndoe@johndoe.com'; +var password = '123'; +var resourceId = '/subscriptions/123/resourceGroups/456/providers/My.Provider/myResourceType/myResource'; +var extensionName = 'LocalExtension'; +var label = 'Field label'; +var extensionUrl = 'https://localhost:44300/'; +var voidPromise: Q.Promise; +var boolPromise: Q.Promise; +var anyPromise: Q.Promise; + +var summaryBlade = new testFx.Blades.Blade(resourceName); + +function TestPortal() { + + testFx.portal.portalContext.signInEmail = userName; + testFx.portal.portalContext.signInPassword = password; + testFx.portal.portalContext.features = [{ name: "greatfeature", value: "true" }]; + testFx.portal.portalContext.testExtensions = [{ name: extensionName, uri: extensionUrl }]; + + anyPromise = testFx.portal.waitForElementLocated(summaryBlade.getLocator(), 30000); + anyPromise = testFx.portal.quit(); + var createBladePromise = testFx.portal.openGalleryCreateBlade(galleryPackageName, bladeTitle, 20000); + var browseResourcePromise = testFx.portal.openBrowseBlade(resourceProvider, resourceType, bladeTitle, 20000); + var bladePromise = testFx.portal.openResourceBlade(resourceId, summaryBlade.title, 20000) + var stringPromise = testFx.portal.takeScreenshot("TestPortal"); + var stringArrayPromise = testFx.portal.getBrowserLogs(testFx.LogLevel.All); +} + +function TestBlades() { + var blade = new testFx.Blades.Blade(resourceName); + blade.clickCommand('Delete'); + + var createBlade = new testFx.Blades.CreateBlade(bladeTitle); + voidPromise = createBlade.actionBar.clickCreate(); + voidPromise = createBlade.actionBar.clickDelete(); + + var browseBlade = new testFx.Blades.BrowseResourceBlade(bladeTitle); + voidPromise = browseBlade.selectResource(resourceName); + + var pickerBlade = new testFx.Blades.PickerBlade(bladeTitle); + pickerBlade.pickItem('abc'); +} + +function TestParts() { + var part = new testFx.Parts.Part(summaryBlade.getLocator(), "Roles"); + voidPromise = part.click(); + boolPromise = part.isSelected(); + boolPromise = part.waitUntilLoaded(); + boolPromise = part.isLoaded(); + + var resourceSummary = new testFx.Parts.ResourceSummaryPart(summaryBlade.getLocator()); + var count = resourceSummary.properties.length; +} + +function TestControls() { + var selector = new testFx.Controls.SelectorField(summaryBlade.getLocator(), label); + voidPromise = selector.openPicker(); + + var creatorAndSelector = new testFx.Controls.CreatorAndSelectorField(summaryBlade.getLocator(), label, label); + var creatorAndSelectorPromise = creatorAndSelector.clickCreateNew(); + creatorAndSelectorPromise = creatorAndSelector.enterNewValue('XYZ'); + + var textField = new testFx.Controls.TextField(summaryBlade.getLocator(), "Resource name"); + var textFieldPromise = textField.sendKeys(resourceName); +} + +function TestActionBars() { + var bar = new testFx.ActionBars.ActionBar(summaryBlade.getLocator()); + voidPromise = bar.clickCreate(); + voidPromise = bar.clickDelete(); +} \ No newline at end of file diff --git a/msportalfx-test/msportalfx-test.d.ts b/msportalfx-test/msportalfx-test.d.ts new file mode 100644 index 000000000..aeeded31a --- /dev/null +++ b/msportalfx-test/msportalfx-test.d.ts @@ -0,0 +1,224 @@ +// Type definitions for msportalfx-test +// Project: https://msazure.visualstudio.com/DefaultCollection/AzureUX/_git/portalfx-msportalfx-test +// Definitions by: Julio Casal +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +declare module MsPortalTestFx { + + export module Locators { + export class Locator { + seleniumLocator: any; + findElements(context: any): any; + toString(): string; + } + + export class ContentLocator extends Locator { + locators: Array; + constructor(innerLocators: Locator[]); + findElements(context: any): any; + toString(): string; + } + + export class ChainedLocator extends Locator { + locators: Array; + constructor(innerLocators: Locator[]); + findElements(context: any): any; + toString(): string; + } + + export class By { + static className(value: string): Locator; + static css(value: string): Locator; + static id(value: string): Locator; + static js(script: any, ...var_args: any[]): Locator; + static linkText(value: string): Locator; + static name(value: string): Locator; + static partialLinkText(value: string): Locator; + static tagName(value: string): Locator; + static xpath(value: string): Locator; + static chained(...values: Locator[]): Locator; + static content(...values: Locator[]): Locator; + } + } + + export module ActionBars { + export class ActionBar extends MsPortalTestFx.PortalElement { + constructor(parentLocator?: Locators.Locator); + clickCreate(): Q.Promise; + clickDelete(): Q.Promise; + } + } + + export module Blades { + export class Blade extends MsPortalTestFx.PortalElement { + public title: string; + + constructor(title: string); + clickCommand(commandText: string): Q.Promise; + } + + export class CreateBlade extends Blade { + public actionBar: ActionBars.ActionBar; + } + + export class BrowseResourceBlade extends Blade { + constructor(title: string); + selectResource(resourceName: string): Q.Promise; + filterItems(filter: string): Q.Promise; + } + + export class PickerBlade extends Blade { + constructor(title: string); + pickItem(item: string): Q.Promise; + } + } + + export module Controls { + export class FormElement extends MsPortalTestFx.PortalElement { + protected label: string; + + constructor(baseLocator: Locators.Locator, parentLocator?: Locators.Locator, label?: string); + } + + export class CheckBoxField extends FormElement { + constructor(parentLocator?: Locators.Locator, label?: string); + } + + export class SelectorField extends FormElement { + constructor(parentLocator?: Locators.Locator, label?: string); + openPicker(): Q.Promise; + } + + export class CreatorAndSelectorField extends FormElement { + constructor(parentLocator?: Locators.Locator, selectModeLabel?: string, createModeLabel?: string); + openPicker(): Q.Promise; + clickCreateNew(): Q.Promise; + enterNewValue(...var_args: string[]): Q.Promise; + } + + export class GridCell extends MsPortalTestFx.PortalElement { + constructor(text: string, parentLocator?: Locators.Locator); + getLocator(): Locators.Locator; + } + + export class TextField extends FormElement { + constructor(parentLocator?: Locators.Locator, label?: string, baseLocator?: Locators.Locator); + sendKeys(...var_args: string[]): Q.Promise; + } + + export class ResourceFilterTextField extends TextField { + constructor(parentLocator?: Locators.Locator); + } + } + + export module Parts { + export class Part extends MsPortalTestFx.PortalElement { + public innerText: string; + + constructor(parentLocator?: Locators.Locator, innerText?: string, baseLocator?: Locators.Locator); + isSelected(): Q.Promise; + isLoaded(): Q.Promise; + waitUntilLoaded(timeout?: number): Q.Promise; + } + + export class PartProperty extends MsPortalTestFx.PortalElement { + public name: string; + + constructor(name: string, parentLocator?: Locators.Locator); + getValue(): Q.Promise; + } + + export class ResourceSummaryPart extends Part { + public properties: Array; + public resourceGroupProperty: PartProperty; + + constructor(parentLocator?: Locators.Locator); + } + + export class Tile extends MsPortalTestFx.PortalElement { + public progressLocator: Locators.Locator; + + constructor(parentLocator?: Locators.Locator); + } + } + + export class PortalElement { + protected baseLocator: Locators.Locator; + protected parentLocator: Locators.Locator; + + constructor(baseLocator: Locators.Locator, parentLocator?: Locators.Locator); + getLocator(): Locators.Locator; + click(): Q.Promise; + getAttribute(attributeName: string): Q.Promise; + } + + export interface TestExtension { + name: string; + uri: string; + } + + export interface Feature { + name: string; + value: string; + } + + export interface PortalContext { + capabilities: { + browserName: string; + chromeOptions: { + args: string[] + } + }, + chromeDriverPath?: string, + portalUrl: string; + signInUrl?: string; + signInEmail?: string; + signInPassword?: string; + features?: Feature[]; + testExtensions?: TestExtension[]; + } + + export enum LogLevel { + All, + Debug, + Info, + Warning, + Severe, + Off + } + + export class Portal { + portalContext: PortalContext; + click(locator: Locators.Locator): Q.Promise; + sendKeys(locator: Locators.Locator, ...var_args: string[]): Q.Promise + getText(locator: Locators.Locator): Q.Promise; + openGalleryCreateBlade(galleryPackageName: string, bladeTitle: string, timeout?: number): Q.Promise; + openBrowseBlade(resourceProvider: string, resourceType: string, bladeTitle: string, timeout?: number): Q.Promise; + openResourceBlade(resourceId: string, bladeTitle: string, timeout?: number): Q.Promise; + navigateToDeepLink(deepLink: string, timeout?: number): Q.Promise; + getAttribute(locator: Locators.Locator, attributeName: string, timeout?: number): Q.Promise; + waitForElementNotVisible(locator: Locators.Locator, timeout?: number): Q.Promise; + waitUntilElementContainsAttribute(locator: Locators.Locator, attributeName: string, attributeValue: string, timeout?: number): Q.Promise; + waitForElementLocated(locator: Locators.Locator, timeout?: number): Q.Promise; + takeScreenshot(filePrefix?: string): Q.Promise; + goHome(timeout?: number): Q.Promise; + getBrowserLogs(level: LogLevel): Q.Promise; + applyFeature(name: string, value: string): void; + executeScript(script: string): Q.Promise; + quit(): Q.Promise; + } + + export class SplashScreen extends PortalElement { + clickUntrustedExtensionsOkButton(): Q.Promise; + } + + export var portal: Portal; +} + + + +declare module "MsPortalFx-Test" { + export = MsPortalTestFx; +} \ No newline at end of file From 721bb9bb8573c603463d8de760a3a2fa1aea6f76 Mon Sep 17 00:00:00 2001 From: Julio Casal Date: Fri, 18 Sep 2015 15:29:01 -0700 Subject: [PATCH 2/2] Update reference to Q definitions --- msportalfx-test/msportalfx-test.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msportalfx-test/msportalfx-test.d.ts b/msportalfx-test/msportalfx-test.d.ts index aeeded31a..cb0d6de41 100644 --- a/msportalfx-test/msportalfx-test.d.ts +++ b/msportalfx-test/msportalfx-test.d.ts @@ -3,7 +3,7 @@ // Definitions by: Julio Casal // Definitions: https://github.com/borisyankov/DefinitelyTyped -/// +/// declare module MsPortalTestFx {