File

src/client/app/modules/core/testing/mocks/mock-location-strategy.ts

Description

A mock implementation of {@link LocationStrategy} that allows tests to fire simulated location events.

Example

Index

Properties
Methods

Constructor

constructor()

Methods

back
back()
Returns : void
forward
forward()
Returns : void
getBaseHref
getBaseHref()
Returns : string
onPopState
onPopState(fn: function)
Returns : void
path
path(includeHash: boolean)
Returns : string
prepareExternalUrl
prepareExternalUrl(internal: string)
Returns : string
pushState
pushState(ctx: any, title: string, path: string, query: string)
Returns : void
replaceState
replaceState(ctx: any, title: string, path: string, query: string)
Returns : void
simulatePopState
simulatePopState(url: string)
Returns : void

Properties

_subject
_subject: EventEmitter<any>
Type : EventEmitter<any>
internalBaseHref
internalBaseHref: string
Type : string
Default value : /
internalPath
internalPath: string
Type : string
Default value : /
internalTitle
internalTitle: string
Type : string
urlChanges
urlChanges: string[]
Type : string[]
import { LocationStrategy } from '@angular/common';
import { Injectable, EventEmitter } from '@angular/core';

/**
 * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated
 * location events.
 *
 * @stable
 */
@Injectable()
export class MockLocationStrategy extends LocationStrategy {
  internalBaseHref: string = '/';
  internalPath: string = '/';
  internalTitle: string = '';
  urlChanges: string[] = [];
  /** @internal */
  _subject: EventEmitter<any> = new EventEmitter();
  constructor() { super(); }

  simulatePopState(url: string): void {
    this.internalPath = url;
    this._subject.emit(new MockPopStateEvent(this.path()));
  }

  path(includeHash: boolean = false): string { return this.internalPath; }

  prepareExternalUrl(internal: string): string {
    if ((<any>internal).startsWith('/') && (<any>this.internalBaseHref).endsWith('/')) {
      return this.internalBaseHref + internal.substring(1);
    }
    return this.internalBaseHref + internal;
  }

  pushState(ctx: any, title: string, path: string, query: string): void {
    this.internalTitle = title;

    var url = path + (query.length > 0 ? ('?' + query) : '');
    this.internalPath = url;

    var externalUrl = this.prepareExternalUrl(url);
    this.urlChanges.push(externalUrl);
  }

  replaceState(ctx: any, title: string, path: string, query: string): void {
    this.internalTitle = title;

    var url = path + (query.length > 0 ? ('?' + query) : '');
    this.internalPath = url;

    var externalUrl = this.prepareExternalUrl(url);
    this.urlChanges.push('replace: ' + externalUrl);
  }

  onPopState(fn: (value: any) => void): void { this._subject.subscribe({next: fn}); }

  getBaseHref(): string { return this.internalBaseHref; }

  back(): void {
    if (this.urlChanges.length > 0) {
      this.urlChanges.pop();
      var nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : '';
      this.simulatePopState(nextUrl);
    }
  }

  forward(): void { throw 'not implemented'; }
}

class MockPopStateEvent {
  pop: boolean = true;
  type: string = 'popstate';
  constructor(public newUrl: string) {}
}

results matching ""

    No results matching ""