Browse Source

test(core): add sort.pipe.spec

pull/1897/head
thediaval 7 years ago
parent
commit
3154baeba7
  1. 6
      npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts
  2. 26
      npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts
  3. 30
      npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts
  4. 2
      npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts

6
npm/ng-packs/packages/core/src/lib/directives/table-sort.directive.ts

@ -1,14 +1,11 @@
import { Directive, Input, Optional, Self, SimpleChanges, OnChanges } from '@angular/core';
import { Table } from 'primeng/table';
import { SortPipe, SortOrder } from '../pipes/sort.pipe';
import { timer } from 'rxjs';
import clone from 'just-clone';
export interface TableSortOptions {
key: string;
order: SortOrder;
}
@Directive({
selector: '[abpTableSort]',
providers: [SortPipe],
@ -16,12 +13,9 @@ export interface TableSortOptions {
export class TableSortDirective implements OnChanges {
@Input()
abpTableSort: TableSortOptions;
@Input()
value: any[] = [];
constructor(@Optional() @Self() private table: Table, private sortPipe: SortPipe) {}
ngOnChanges({ value, abpTableSort }: SimpleChanges) {
if (value || abpTableSort) {
this.abpTableSort = this.abpTableSort || ({} as TableSortOptions);

26
npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts

@ -1,29 +1,27 @@
import { Pipe, PipeTransform, Injectable } from '@angular/core';
import clone from 'just-clone';
import { Injectable, Pipe, PipeTransform } from '@angular/core';
export type SortOrder = 'asc' | 'desc';
@Injectable()
@Pipe({
name: 'abpSort',
})
export class SortPipe implements PipeTransform {
intialValue: any[];
transform(value: any[], sortOrder: SortOrder | string = 'asc', sortKey?: string): any {
sortOrder = sortOrder && (sortOrder.toLowerCase() as any);
if (!this.intialValue) this.intialValue = clone(value);
if (!value || (sortOrder !== 'asc' && sortOrder !== 'desc')) return this.intialValue;
if (!value || (sortOrder !== 'asc' && sortOrder !== 'desc')) return value;
let sorted;
if (!sortKey) {
sorted = value.sort();
const numberArray = [];
const stringArray = [];
value.forEach(item => (typeof item === 'number' ? numberArray.push(item) : stringArray.push(item)));
sorted = numberArray.sort().concat(stringArray.sort());
} else {
sorted = value.sort((a, b) => (a[sortKey] < b[sortKey] ? -1 : a[sortKey] > b[sortKey] ? 1 : 0));
sorted = value.sort((a, b) => {
return (
Number(typeof b[sortKey] === 'number') - Number(typeof a[sortKey] === 'number') ||
(a[sortKey] < b[sortKey] ? -1 : 1)
);
});
}
return sortOrder === 'asc' ? sorted : sorted.reverse();
}
}

30
npm/ng-packs/packages/core/src/lib/tests/sort.pipe.spec.ts

@ -0,0 +1,30 @@
import { createServiceFactory, SpectatorService } from '@ngneat/spectator';
import { SortPipe } from '../pipes/sort.pipe';
describe('SortPipe', () => {
let pipe: SortPipe;
let spectator: SpectatorService<SortPipe>;
const createService = createServiceFactory(SortPipe);
beforeEach(() => {
spectator = createService();
pipe = spectator.service;
});
test('should sort array in ascending and descending orders', () => {
expect(pipe.transform([5, 'b', 1, 'a'], 'asc')).toEqual([1, 5, 'a', 'b']);
expect(pipe.transform([5, 'b', 1, 'a'], 'desc')).toEqual(['b', 'a', 5, 1]);
});
test('should sort object array in given order with given key', () => {
const array = [{ key: 5 }, { key: 'b' }, { key: 1 }, { key: 'a' }];
expect(pipe.transform(array, 'asc', 'key')).toEqual([{ key: 1 }, { key: 5 }, { key: 'a' }, { key: 'b' }]);
expect(pipe.transform(array, 'desc', 'key')).toEqual([{ key: 'b' }, { key: 'a' }, { key: 5 }, { key: 1 }]);
});
test('should require an array as value', () => {
expect(pipe.transform(null, 'asc')).toBeFalsy();
expect(pipe.transform(undefined, 'desc')).toBeFalsy();
});
});

2
npm/ng-packs/packages/core/src/lib/tests/table-sort.directive.spec.ts

@ -1,4 +1,4 @@
import { SpectatorDirective, createDirectiveFactory, SpyObject } from '@ngneat/spectator/jest';
import { SpectatorDirective, createDirectiveFactory } from '@ngneat/spectator/jest';
import { TableSortDirective } from '../directives/table-sort.directive';
import { TableModule, Table } from 'primeng/table';

Loading…
Cancel
Save