Skip to content

Commit

Permalink
NAS-125772: Add tests for audit component (#9341)
Browse files Browse the repository at this point in the history
  • Loading branch information
undsoft authored Dec 19, 2023
1 parent b1c6535 commit fcf4cbc
Show file tree
Hide file tree
Showing 18 changed files with 383 additions and 206 deletions.
13 changes: 7 additions & 6 deletions src/app/core/testing/classes/mock-websocket.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
} from 'app/core/testing/interfaces/mock-websocket-responses.interface';
import { ApiCallDirectory, ApiCallMethod, ApiCallParams } from 'app/interfaces/api/api-call-directory.interface';
import { ApiEventDirectory } from 'app/interfaces/api/api-event-directory.interface';
import { ApiJobDirectory, ApiJobMethod } from 'app/interfaces/api/api-job-directory.interface';
import { ApiJobDirectory, ApiJobMethod, ApiJobParams } from 'app/interfaces/api/api-job-directory.interface';
import { ApiEvent } from 'app/interfaces/api-message.interface';
import { Job } from 'app/interfaces/job.interface';
import { WebsocketConnectionService } from 'app/services/websocket-connection.service';
Expand Down Expand Up @@ -59,9 +59,9 @@ export class MockWebsocketService extends WebSocketService {
}

mockCall<K extends ApiCallMethod>(method: K, response: CallResponseOrFactory<K>): void {
const mockedImplementation = (): Observable<unknown> => {
const mockedImplementation = (_: K, params: ApiCallParams<K>): Observable<unknown> => {
if (response instanceof Function) {
return of(response());
return of(response(params));
}

return of(response);
Expand All @@ -79,10 +79,10 @@ export class MockWebsocketService extends WebSocketService {
.mockReturnValueOnce(of(response));
}
mockJob<K extends ApiJobMethod>(method: K, response: JobResponseOrFactory<K>): void {
const getJobResponse = (): Job<ApiJobDirectory[K]['response']> => {
const getJobResponse = (params: ApiJobParams<K> = undefined): Job<ApiJobDirectory[K]['response']> => {
let job: Job;
if (response instanceof Function) {
job = response();
job = response(params);
} else {
job = response;
}
Expand All @@ -95,7 +95,8 @@ export class MockWebsocketService extends WebSocketService {
when(this.startJob).calledWith(method).mockReturnValue(of(this.jobIdCounter));
when(this.startJob).calledWith(method, anyArgument).mockReturnValue(of(this.jobIdCounter));
when(this.job).calledWith(method).mockImplementation(() => of(getJobResponse()));
when(this.job).calledWith(method, anyArgument).mockImplementation(() => of(getJobResponse()));
when(this.job).calledWith(method, anyArgument)
.mockImplementation((_, params) => of(getJobResponse(params)));
when(this.call)
.calledWith('core.get_jobs', [[['id', '=', this.jobIdCounter]]])
.mockImplementation(() => of([getJobResponse()]));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ApiCallDirectory, ApiCallMethod } from 'app/interfaces/api/api-call-directory.interface';
import { ApiJobDirectory, ApiJobMethod } from 'app/interfaces/api/api-job-directory.interface';
import { ApiCallDirectory, ApiCallMethod, ApiCallParams } from 'app/interfaces/api/api-call-directory.interface';
import { ApiJobDirectory, ApiJobMethod, ApiJobParams } from 'app/interfaces/api/api-job-directory.interface';
import { Job } from 'app/interfaces/job.interface';

export enum MockWebsocketResponseType {
Expand All @@ -18,8 +18,13 @@ export interface MockWebsocketCallResponse {
export interface MockWebsocketJobResponse {
type: MockWebsocketResponseType.Job;
method: ApiJobMethod;
response: Job | (() => Job);
response: Job | ((params: unknown) => Job);
id?: number;
}
export type CallResponseOrFactory<M extends ApiCallMethod> = ApiCallDirectory[M]['response'] | (() => ApiCallDirectory[M]['response']);
export type JobResponseOrFactory<M extends ApiJobMethod> = Job<ApiJobDirectory[M]['response']> | (() => Job<ApiJobDirectory[M]['response']>);
export type CallResponseOrFactory<M extends ApiCallMethod> =
| ApiCallDirectory[M]['response']
| ((params: ApiCallParams<M>) => ApiCallDirectory[M]['response']);

export type JobResponseOrFactory<M extends ApiJobMethod> =
| Job<ApiJobDirectory[M]['response']>
| ((params: ApiJobParams<M>) => Job<ApiJobDirectory[M]['response']>);
47 changes: 0 additions & 47 deletions src/app/enums/audit-event.enum.ts

This file was deleted.

43 changes: 43 additions & 0 deletions src/app/enums/audit.enum.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,47 @@
import { marker as T } from '@biesbjerg/ngx-translate-extract-marker';

export enum AuditService {
Smb = 'SMB',
Middleware = 'MIDDLEWARE',
}

export enum AuditEvent {
Connect = 'CONNECT',
Disconnect = 'DISCONNECT',
Create = 'CREATE',
Close = 'CLOSE',
Read = 'READ',
Write = 'WRITE',
OffloadRead = 'OFFLOAD_READ',
OffloadWrite = 'OFFLOAD_WRITE',
SetAcl = 'SET_ACL',
Rename = 'RENAME',
Unlink = 'UNLINK',
SetAttr = 'SET_ATTR',
SetQuota = 'SET_QUOTA',
Authentication = 'AUTHENTICATION',
MethodCall = 'METHOD_CALL',
}

export const auditServiceLabels = new Map<AuditService, string>([
[AuditService.Smb, T('SMB')],
[AuditService.Middleware, T('Middleware')],
]);

export const auditEventLabels = new Map<AuditEvent, string>([
[AuditEvent.Connect, T('Connect')],
[AuditEvent.Disconnect, T('Disconnect')],
[AuditEvent.Create, T('Create')],
[AuditEvent.Close, T('Close')],
[AuditEvent.Read, T('Read')],
[AuditEvent.Write, T('Write')],
[AuditEvent.OffloadRead, T('Offload Read')],
[AuditEvent.OffloadWrite, T('Offload Write')],
[AuditEvent.SetAcl, T('Set ACL')],
[AuditEvent.Rename, T('Rename')],
[AuditEvent.Unlink, T('Unlink')],
[AuditEvent.SetAttr, T('Set Attribute')],
[AuditEvent.SetQuota, T('Set Quota')],
[AuditEvent.Authentication, T('Authentication')],
[AuditEvent.MethodCall, T('Method Call')],
]);
4 changes: 2 additions & 2 deletions src/app/interfaces/api/api-call-directory.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {
import { ApiTimestamp } from 'app/interfaces/api-date.interface';
import { ApiKey, CreateApiKeyRequest, UpdateApiKeyRequest } from 'app/interfaces/api-key.interface';
import { UpgradeSummary } from 'app/interfaces/application.interface';
import { AuditConfig, AuditEntry } from 'app/interfaces/audit/audit.interface';
import { AuditConfig, AuditEntry, AuditQueryParams } from 'app/interfaces/audit/audit.interface';
import { AuthSession } from 'app/interfaces/auth-session.interface';
import { LoginQuery } from 'app/interfaces/auth.interface';
import { AvailableApp } from 'app/interfaces/available-app.interface';
Expand Down Expand Up @@ -314,7 +314,7 @@ export interface ApiCallDirectory {
'app.latest': { params: QueryParams<AvailableApp>; response: AvailableApp[] };

// Audit
'audit.query': { params: QueryParams<AuditEntry>; response: AuditEntry[] };
'audit.query': { params: [AuditQueryParams]; response: AuditEntry[] };
'audit.update': { params: [AuditConfig]; response: AuditEntry[] };
'audit.config': { params: void; response: AuditConfig };

Expand Down
9 changes: 8 additions & 1 deletion src/app/interfaces/audit/audit.interface.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import { AuditEvent } from 'app/enums/audit-event.enum';
import { AuditEvent, AuditService } from 'app/enums/audit.enum';
import { ApiTimestamp } from 'app/interfaces/api-date.interface';
import { MiddlewareAuditEntry } from 'app/interfaces/audit/middleware-audit-entry.interface';
import { SmbAuditEntry } from 'app/interfaces/audit/smb-audit-entry.interface';
import { QueryFilters, QueryOptions } from 'app/interfaces/query-api.interface';

export interface AuditQueryParams {
services?: AuditService[];
'query-filters'?: QueryFilters<AuditEntry>;
'query-options'?: QueryOptions<AuditEntry>;
}

export interface BaseAuditEntry {
audit_id: string;
Expand Down
3 changes: 1 addition & 2 deletions src/app/interfaces/audit/middleware-audit-entry.interface.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { AuditEvent } from 'app/enums/audit-event.enum';
import { AuditService } from 'app/enums/audit.enum';
import { AuditEvent, AuditService } from 'app/enums/audit.enum';
import { AuditVersions, BaseAuditEntry } from 'app/interfaces/audit/audit.interface';
import { CredentialType } from 'app/interfaces/credential-type.interface';

Expand Down
3 changes: 1 addition & 2 deletions src/app/interfaces/audit/smb-audit-entry.interface.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { AuditEvent } from 'app/enums/audit-event.enum';
import { AuditService } from 'app/enums/audit.enum';
import { AuditEvent, AuditService } from 'app/enums/audit.enum';
import { AuditVersions, BaseAuditEntry } from 'app/interfaces/audit/audit.interface';

export interface BaseSmbAuditEntry extends BaseAuditEntry {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ export class IxTable2Harness extends ContentContainerComponentHarness {
const texts = await parallel(() => cells.map((cell) => cell.getText()));
const columnCount = await this.getColumnCount();

if (!columnCount) {
throw new Error('Could not determine column count');
}

const result: string[][] = [];
for (let i = 0; i < texts.length; i += columnCount) {
result.push(texts.slice(i, i + columnCount));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { createComponentFactory, Spectator } from '@ngneat/spectator/jest';
import { auditEventLabels, AuditService } from 'app/enums/audit-event.enum';
import { auditEventLabels, AuditService } from 'app/enums/audit.enum';
import { QueryFilters } from 'app/interfaces/query-api.interface';
import { User } from 'app/interfaces/user.interface';
import { AdvancedSearchComponent } from 'app/modules/search-input/components/advanced-search/advanced-search.component';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { TranslateService } from '@ngx-translate/core';
import { of } from 'rxjs';
import { AuditService } from 'app/enums/audit-event.enum';
import { AuditService } from 'app/enums/audit.enum';
import { IxFormatterService } from 'app/modules/ix-forms/services/ix-formatter.service';
import {
ConnectorType,
Expand Down
4 changes: 2 additions & 2 deletions src/app/pages/audit/components/audit/audit.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
</button>
</div>
<ix-export-button
*ngIf="this.dataProvider.totalRows"
*ngIf="dataProvider.totalRows"
method="audit.export"
[searchQuery]="searchQuery"
[sorting]="this.dataProvider.sorting"
[sorting]="dataProvider.sorting"
[defaultFilters]="basicQueryFilters"
></ix-export-button>
</div>
Expand Down
Loading

0 comments on commit fcf4cbc

Please sign in to comment.