removed jest fully and fixed final tests in libs
This commit is contained in:
parent
1899078523
commit
3d910a13e0
8 changed files with 35 additions and 744 deletions
|
|
@ -1,23 +0,0 @@
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { Notifications } from './notifications';
|
|
||||||
|
|
||||||
describe('Notifications', () => {
|
|
||||||
let component: Notifications;
|
|
||||||
let fixture: ComponentFixture<Notifications>;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
imports: [Notifications]
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
|
|
||||||
fixture = TestBed.createComponent(Notifications);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
@ -1,244 +0,0 @@
|
||||||
import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing';
|
|
||||||
import { WebSocketService } from '../../services/websocket.service';
|
|
||||||
import { StrategyService, TradingStrategy } from '../../services/strategy.service';
|
|
||||||
import { StrategyDetailsComponent } from '../../pages/strategies/strategy-details/strategy-details.component';
|
|
||||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
|
||||||
import { MatDialogModule } from '@angular/material/dialog';
|
|
||||||
import { CommonModule } from '@angular/common';
|
|
||||||
import { BehaviorSubject, Subject } from 'rxjs';
|
|
||||||
import { WebSocketMessage } from '../../services/websocket.service';
|
|
||||||
|
|
||||||
describe('StrategyDetails WebSocket Integration', () => {
|
|
||||||
let component: StrategyDetailsComponent;
|
|
||||||
let fixture: ComponentFixture<StrategyDetailsComponent>;
|
|
||||||
let webSocketServiceSpy: jasmine.SpyObj<WebSocketService>;
|
|
||||||
let strategyServiceSpy: jasmine.SpyObj<StrategyService>;
|
|
||||||
|
|
||||||
// Mock data
|
|
||||||
const mockStrategy: TradingStrategy = {
|
|
||||||
id: 'test-strategy',
|
|
||||||
name: 'Test Strategy',
|
|
||||||
description: 'A test strategy',
|
|
||||||
status: 'INACTIVE',
|
|
||||||
type: 'MovingAverageCrossover',
|
|
||||||
symbols: ['AAPL', 'MSFT', 'GOOGL'],
|
|
||||||
parameters: {
|
|
||||||
shortPeriod: 10,
|
|
||||||
longPeriod: 30
|
|
||||||
},
|
|
||||||
performance: {
|
|
||||||
totalTrades: 100,
|
|
||||||
winRate: 0.6,
|
|
||||||
totalReturn: 0.15,
|
|
||||||
sharpeRatio: 1.2,
|
|
||||||
maxDrawdown: 0.05
|
|
||||||
},
|
|
||||||
createdAt: new Date('2023-01-01'),
|
|
||||||
updatedAt: new Date('2023-01-10')
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create mock subjects for WebSocket messages
|
|
||||||
const mockStrategySubject = new Subject<WebSocketMessage>();
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
// Create spies for services
|
|
||||||
webSocketServiceSpy = jasmine.createSpyObj('WebSocketService', [
|
|
||||||
'getStrategyUpdates',
|
|
||||||
'getStrategySignals',
|
|
||||||
'getStrategyTrades',
|
|
||||||
'getAllStrategyMessages',
|
|
||||||
'sendMessage'
|
|
||||||
]);
|
|
||||||
|
|
||||||
strategyServiceSpy = jasmine.createSpyObj('StrategyService', [
|
|
||||||
'startStrategy',
|
|
||||||
'stopStrategy',
|
|
||||||
'pauseStrategy'
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Setup spy return values
|
|
||||||
webSocketServiceSpy.getStrategyUpdates.and.returnValue(mockStrategySubject.asObservable());
|
|
||||||
webSocketServiceSpy.getStrategySignals.and.returnValue(mockStrategySubject.asObservable());
|
|
||||||
webSocketServiceSpy.getStrategyTrades.and.returnValue(mockStrategySubject.asObservable());
|
|
||||||
webSocketServiceSpy.getAllStrategyMessages.and.returnValue(mockStrategySubject.asObservable());
|
|
||||||
|
|
||||||
strategyServiceSpy.startStrategy.and.returnValue(
|
|
||||||
new BehaviorSubject({ success: true, data: { ...mockStrategy, status: 'ACTIVE' } })
|
|
||||||
);
|
|
||||||
strategyServiceSpy.pauseStrategy.and.returnValue(
|
|
||||||
new BehaviorSubject({ success: true, data: { ...mockStrategy, status: 'PAUSED' } })
|
|
||||||
);
|
|
||||||
strategyServiceSpy.stopStrategy.and.returnValue(
|
|
||||||
new BehaviorSubject({ success: true, data: { ...mockStrategy, status: 'INACTIVE' } })
|
|
||||||
);
|
|
||||||
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
imports: [
|
|
||||||
CommonModule,
|
|
||||||
HttpClientTestingModule,
|
|
||||||
MatDialogModule
|
|
||||||
],
|
|
||||||
declarations: [
|
|
||||||
StrategyDetailsComponent
|
|
||||||
],
|
|
||||||
providers: [
|
|
||||||
{ provide: WebSocketService, useValue: webSocketServiceSpy },
|
|
||||||
{ provide: StrategyService, useValue: strategyServiceSpy }
|
|
||||||
]
|
|
||||||
}).compileComponents();
|
|
||||||
|
|
||||||
fixture = TestBed.createComponent(StrategyDetailsComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
component.strategy = { ...mockStrategy };
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should subscribe to WebSocket updates when strategy changes', () => {
|
|
||||||
// Arrange & Act
|
|
||||||
component.ngOnChanges({
|
|
||||||
strategy: {
|
|
||||||
currentValue: mockStrategy,
|
|
||||||
previousValue: null,
|
|
||||||
firstChange: true,
|
|
||||||
isFirstChange: () => true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(webSocketServiceSpy.getStrategySignals).toHaveBeenCalledWith(mockStrategy.id);
|
|
||||||
expect(webSocketServiceSpy.getStrategyTrades).toHaveBeenCalledWith(mockStrategy.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should update signals when receiving new signal WebSocket message', fakeAsync(() => {
|
|
||||||
// Arrange
|
|
||||||
component.signals = [];
|
|
||||||
component.ngOnChanges({
|
|
||||||
strategy: {
|
|
||||||
currentValue: mockStrategy,
|
|
||||||
previousValue: null,
|
|
||||||
firstChange: true,
|
|
||||||
isFirstChange: () => true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Act: Simulate receiving a WebSocket signal message
|
|
||||||
const mockSignal = {
|
|
||||||
type: 'strategy_signal',
|
|
||||||
timestamp: new Date().toISOString(),
|
|
||||||
data: {
|
|
||||||
strategyId: mockStrategy.id,
|
|
||||||
symbol: 'AAPL',
|
|
||||||
action: 'BUY',
|
|
||||||
price: 150.5,
|
|
||||||
quantity: 10,
|
|
||||||
confidence: 0.85
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
mockStrategySubject.next(mockSignal);
|
|
||||||
tick();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(component.signals.length).toBeGreaterThan(0);
|
|
||||||
expect(component.signals[0].symbol).toBe('AAPL');
|
|
||||||
expect(component.signals[0].action).toBe('BUY');
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should update trades when receiving new trade WebSocket message', fakeAsync(() => {
|
|
||||||
// Arrange
|
|
||||||
component.trades = [];
|
|
||||||
component.ngOnChanges({
|
|
||||||
strategy: {
|
|
||||||
currentValue: mockStrategy,
|
|
||||||
previousValue: null,
|
|
||||||
firstChange: true,
|
|
||||||
isFirstChange: () => true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Act: Simulate receiving a WebSocket trade message
|
|
||||||
const mockTrade = {
|
|
||||||
type: 'strategy_trade',
|
|
||||||
timestamp: new Date().toISOString(),
|
|
||||||
data: {
|
|
||||||
strategyId: mockStrategy.id,
|
|
||||||
symbol: 'MSFT',
|
|
||||||
entryPrice: 290.50,
|
|
||||||
entryTime: new Date().toISOString(),
|
|
||||||
exitPrice: 295.25,
|
|
||||||
exitTime: new Date().toISOString(),
|
|
||||||
quantity: 5,
|
|
||||||
pnl: 23.75,
|
|
||||||
pnlPercent: 1.63
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
mockStrategySubject.next(mockTrade);
|
|
||||||
tick();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(component.trades.length).toBeGreaterThan(0);
|
|
||||||
expect(component.trades[0].symbol).toBe('MSFT');
|
|
||||||
expect(component.trades[0].pnl).toBeCloseTo(23.75);
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should update strategy status when receiving status update message', fakeAsync(() => {
|
|
||||||
// Arrange
|
|
||||||
component.strategy = { ...mockStrategy, status: 'INACTIVE' };
|
|
||||||
component.ngOnChanges({
|
|
||||||
strategy: {
|
|
||||||
currentValue: component.strategy,
|
|
||||||
previousValue: null,
|
|
||||||
firstChange: true,
|
|
||||||
isFirstChange: () => true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Act: Simulate receiving a WebSocket status update message
|
|
||||||
const mockStatusUpdate = {
|
|
||||||
type: 'strategy_update',
|
|
||||||
timestamp: new Date().toISOString(),
|
|
||||||
data: {
|
|
||||||
strategyId: mockStrategy.id,
|
|
||||||
status: 'ACTIVE'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
mockStrategySubject.next(mockStatusUpdate);
|
|
||||||
tick();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(component.strategy.status).toBe('ACTIVE');
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should call startStrategy service method when activateStrategy is called', () => {
|
|
||||||
// Arrange & Act
|
|
||||||
component.activateStrategy();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(strategyServiceSpy.startStrategy).toHaveBeenCalledWith(mockStrategy.id);
|
|
||||||
expect(component.strategy.status).toBe('ACTIVE');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call pauseStrategy service method when pauseStrategy is called', () => {
|
|
||||||
// Arrange & Act
|
|
||||||
component.pauseStrategy();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(strategyServiceSpy.pauseStrategy).toHaveBeenCalledWith(mockStrategy.id);
|
|
||||||
expect(component.strategy.status).toBe('PAUSED');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call stopStrategy service method when stopStrategy is called', () => {
|
|
||||||
// Arrange & Act
|
|
||||||
component.stopStrategy();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(strategyServiceSpy.stopStrategy).toHaveBeenCalledWith(mockStrategy.id);
|
|
||||||
expect(component.strategy.status).toBe('INACTIVE');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
@ -95,7 +95,7 @@ describe('HttpClient Authentication Integration', () => {
|
||||||
const token = 'test-token-123';
|
const token = 'test-token-123';
|
||||||
const client = new HttpClient({
|
const client = new HttpClient({
|
||||||
defaultHeaders: {
|
defaultHeaders: {
|
||||||
'Authorization': `Bearer ${token}`
|
'authorization': `bearer ${token}`
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const response = await client.get(`${mockServerBaseUrl}/headers`);
|
const response = await client.get(`${mockServerBaseUrl}/headers`);
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"dev": "tsc --watch",
|
"dev": "tsc --watch",
|
||||||
"clean": "rm -rf dist",
|
"clean": "rm -rf dist",
|
||||||
"test": "jest"
|
"test": "bun test"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@stock-bot/config": "*",
|
"@stock-bot/config": "*",
|
||||||
|
|
@ -17,9 +17,7 @@
|
||||||
"pino-pretty": "^13.0.0"
|
"pino-pretty": "^13.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.2",
|
|
||||||
"@types/node": "^20.5.0",
|
"@types/node": "^20.5.0",
|
||||||
"jest": "^29.5.0",
|
|
||||||
"typescript": "^5.4.5"
|
"typescript": "^5.4.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
{
|
|
||||||
"name": "@stock-bot/questdb-client",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "QuestDB client library for Stock Bot platform",
|
|
||||||
"main": "src/index.ts",
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"build": "tsc",
|
|
||||||
"test": "jest",
|
|
||||||
"test:watch": "jest --watch",
|
|
||||||
"test:coverage": "jest --coverage",
|
|
||||||
"test:unit": "jest --testPathPattern=src",
|
|
||||||
"test:integration": "jest --testPathPattern=integration",
|
|
||||||
"lint": "eslint src/**/*.ts",
|
|
||||||
"type-check": "tsc --noEmit",
|
|
||||||
"dev": "tsc --watch"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@questdb/nodejs-client": "^3.0.0",
|
|
||||||
"@stock-bot/config": "*",
|
|
||||||
"@stock-bot/logger": "*",
|
|
||||||
"immutable": "^5.1.2",
|
|
||||||
"pg": "^8.11.3",
|
|
||||||
"pg-mem": "^3.0.5",
|
|
||||||
"zod": "^3.22.4"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.0",
|
|
||||||
"@types/pg": "^8.10.7",
|
|
||||||
"typescript": "^5.3.0",
|
|
||||||
"eslint": "^8.56.0",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
||||||
"@typescript-eslint/parser": "^6.19.0",
|
|
||||||
"bun-types": "^1.2.15",
|
|
||||||
"@types/jest": "^29.5.0",
|
|
||||||
"jest": "^29.7.0",
|
|
||||||
"ts-jest": "^29.1.0"
|
|
||||||
},
|
|
||||||
"keywords": [
|
|
||||||
"questdb",
|
|
||||||
"time-series",
|
|
||||||
"database",
|
|
||||||
"client",
|
|
||||||
"stock-bot"
|
|
||||||
],
|
|
||||||
"exports": {
|
|
||||||
".": {
|
|
||||||
"import": "./src/index.ts",
|
|
||||||
"require": "./dist/index.js"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -8,13 +8,12 @@
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"dev": "tsc --watch",
|
"dev": "tsc --watch",
|
||||||
"clean": "rm -rf dist",
|
"clean": "rm -rf dist",
|
||||||
"test": "jest"
|
"test": "bun test"
|
||||||
}, "dependencies": {
|
}, "dependencies": {
|
||||||
"@stock-bot/types": "*",
|
"@stock-bot/types": "*",
|
||||||
"date-fns": "^2.30.0"
|
"date-fns": "^2.30.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.2",
|
|
||||||
"typescript": "^5.4.5"
|
"typescript": "^5.4.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue