Skip to content

Instantly share code, notes, and snippets.

@patricksevat
patricksevat / ngif-directive.js
Created November 18, 2019 22:30
StencilJS AngularJS ngIf no Shadow DOM double rendering issue
// Potential fix for https://github.com/ionic-team/stencil/issues/1948 (Components without shadowdom are rendering twice when dynamically added to the DOM)
// copied code from https://github.com/angular/angular.js/blob/master/src/ng/directive/ngIf.js#L3 and https://github.com/angular/angular.js/blob/add78e62004e80bb1e16ab2dfe224afa8e513bc3/src/Angular.js#L2015
angular
.module('demo', [])
.directive('ngIf', function ($animate, $compile) {
function getBlockNodes(nodes) {
var node = nodes[0];
var endNode = nodes[nodes.length - 1];
var blockNodes;
@patricksevat
patricksevat / extended-component-object.ts
Created November 20, 2019 19:48
extended-component-object.ts
// ./objects/base/component-object-base.ts
export interface IComponentObjectConfig {
featureName?: string;
visibleOnMobile: boolean;
visibleOnDesktop: boolean;
}
export abstract class ComponentObjectBase {
componentName: string;
@patricksevat
patricksevat / dashboard-page.ts
Created November 20, 2019 20:02
Naive, not DRY implementation of a Page Object
// ./objects/pages/dashboard-page.ts
import { BankAccountObject } from '../objects/features';
import { NavigationObject } from '../objects/ui-components';
export class DashboardPageObject {
// the root element for the page <dashboard-page />
element = 'dashboard-page';
// all registered features and UI components
features = [
new BankAccountObject(),
@patricksevat
patricksevat / dashboard-page.spec.ts
Created November 20, 2019 20:05
Simple spec file
// ./spec/dashboard-page.spec.ts
import { dashboardPage } from '../objects/pages/';
describe('Dashboard page', () => {
it('should render all features', async () => {
await browser.url(dashboardPage.url);
const isRendered = await dashboardPage.waitUntilRendered();
// at this point, the page is rendered and we can safely kick off all our tests
expect(isRendered).toBe(true);
@patricksevat
patricksevat / component-object-base.ts
Created November 20, 2019 20:09
base class for Component Object
// ./objects/base/component-object-base.ts
export abstract class ComponentObjectBase {
componentName: string;
element: string;
elementToRender: string;
render = async () => {
if (!this.element || !this.elementToRender) {
throw new Error('please define an element and elementToRender to check if the feature was rendered');
}
@patricksevat
patricksevat / dashboard-page.ts
Created November 20, 2019 20:10
Refactored Page Object
// ./objects/pages/dashboard-page.ts
import { BankAccountObject } from '../features';
import { NavigationObject } from '../ui-components';
import { PageObjectBase } from '../base';
class DashboardPageObject extends PageObjectBase {
element = 'dashboard-page';
features = [new BankAccountObject(), new NavigationObject()];
url: string = '/dashboard';
}
@patricksevat
patricksevat / bank-account.ts
Created November 20, 2019 20:10
Refactored Component Object
// ./objects/features/bank-account.ts
import { ComponentObjectBase } from '../base';
export class BankAccountObject extends ComponentObjectBase {
componentName = 'bank-account';
element = 'my-bank-account';
elementToRender = '[data-test="async-fetch-bank-account-balance"]';
}
@patricksevat
patricksevat / wdio.conf.js
Created November 20, 2019 20:22
wdio conf with jasmine grep
// wdio.conf.js
exports.config = {
specs: ['spec/**/*.spec.ts'],
framework: 'jasmine',
jasmineNodeOpts: {
defaultTimeoutInterval: 60000,
grep: '#smoke',
invertGrep: false,
},
// ... other config
@patricksevat
patricksevat / grep-example.spec.ts
Created November 20, 2019 20:23
spec example with hashtag
// ./spec/grep-example.spec.ts
describe('various tests', () => {
it('I will be executed #smoke', () => {});
it('I will be filtered', () => {});
});
@patricksevat
patricksevat / wdio.conf.js
Created November 20, 2019 20:26
Advanced wdio conf
// ./wdio.conf.js
const argv = require('yargs').argv;
const { getFilteredSpecFiles, getRegularExpression } = require('./getSpecFiles');
const cmdOpts = {
smoke: argv.smoke,
target: argv.target,
};