Spaces:
Building
Building
File size: 4,835 Bytes
9f79da5 68e9789 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
<div class="test-container">
<h2>System Tests</h2>
<div class="test-controls">
<button mat-raised-button color="primary" (click)="runAllTests()" [disabled]="running">
<mat-icon>play_arrow</mat-icon>
Run All Tests
</button>
<button mat-raised-button (click)="runSelectedTests()"
[disabled]="running || selectedTests.length === 0">
<mat-icon>play_circle_outline</mat-icon>
Run Selected ({{ selectedTests.length }})
</button>
<button mat-raised-button color="warn" (click)="stopTests()" [disabled]="!running">
<mat-icon>stop</mat-icon>
Stop
</button>
</div>
<mat-card class="test-categories">
<mat-checkbox [(ngModel)]="allSelected" (change)="toggleAll()">
<strong>All Tests ({{ totalTests }} tests)</strong>
</mat-checkbox>
<mat-accordion>
<mat-expansion-panel *ngFor="let category of categories"
[(expanded)]="category.expanded">
<mat-expansion-panel-header>
<mat-panel-title>
<mat-checkbox [checked]="allSelected" (change)="toggleAll()">
<strong>All Tests ({{ totalTests }} tests)</strong>
</mat-checkbox>
</mat-panel-title>
<mat-panel-description>
<div class="category-status" *ngIf="getCategoryResults(category).total > 0">
<mat-chip-listbox>
<mat-chip-option *ngIf="getCategoryResults(category).passed > 0"
class="success-chip">
{{ getCategoryResults(category).passed }} passed
</mat-chip-option>
<mat-chip-option *ngIf="getCategoryResults(category).failed > 0"
class="error-chip">
{{ getCategoryResults(category).failed }} failed
</mat-chip-option>
</mat-chip-listbox>
</div>
</mat-panel-description>
</mat-expansion-panel-header>
<mat-list>
<mat-list-item *ngFor="let test of category.tests">
<mat-icon matListItemIcon [class]="'status-' + (getTestResult(test.name)?.status || 'pending')">
{{ getTestResult(test.name)?.status === 'PASS' ? 'check_circle' :
getTestResult(test.name)?.status === 'FAIL' ? 'cancel' :
getTestResult(test.name)?.status === 'RUNNING' ? 'hourglass_empty' :
'radio_button_unchecked' }}
</mat-icon>
<div matListItemTitle>{{ test.name }}</div>
<div matListItemLine *ngIf="getTestResult(test.name)">
<span class="test-duration" *ngIf="getTestResult(test.name)?.duration_ms">
{{ getTestResult(test.name)?.duration_ms }}ms
</span>
<span class="test-details" *ngIf="getTestResult(test.name)?.details">
• {{ getTestResult(test.name)?.details }}
</span>
<span class="test-error" *ngIf="getTestResult(test.name)?.error">
• {{ getTestResult(test.name)?.error }}
</span>
</div>
<mat-icon matListItemMeta *ngIf="currentTest === test.name" class="running-icon">
sync
</mat-icon>
</mat-list-item>
</mat-list>
</mat-expansion-panel>
</mat-accordion>
</mat-card>
<mat-card class="test-results" *ngIf="testResults.length > 0 || running">
<mat-card-header>
<mat-card-title>Test Progress</mat-card-title>
</mat-card-header>
<mat-card-content>
<mat-progress-bar [value]="progress"
[mode]="running ? 'determinate' : 'determinate'"
[color]="failedTests > 0 ? 'warn' : 'primary'">
</mat-progress-bar>
<div class="test-summary">
<div class="summary-item">
<mat-icon class="success">check_circle</mat-icon>
<span>Passed: {{ passedTests }}</span>
</div>
<div class="summary-item">
<mat-icon class="error">cancel</mat-icon>
<span>Failed: {{ failedTests }}</span>
</div>
<div class="summary-item">
<mat-icon>timer</mat-icon>
<span>Total: {{ testResults.length }}/{{ selectedTests.length }}</span>
</div>
</div>
<div class="current-test" *ngIf="currentTest">
<mat-icon class="spin">sync</mat-icon>
Running: {{ currentTest }}
</div>
</mat-card-content>
</mat-card>
<div class="empty-state" *ngIf="!running && testResults.length === 0">
<mat-icon>assignment_turned_in</mat-icon>
<p>No test results yet. Select tests and click "Run Selected" to start.</p>
</div>
</div> |