refs #1138 Fix test and advance search bug
testing/ogGui-multibranch/pipeline/head This commit is unstable Details

pull/7/head
Alvaro Puente Mella 2024-11-20 14:53:42 +01:00
parent cfc23477df
commit 3f0807841b
35 changed files with 1301 additions and 564 deletions

View File

@ -1,12 +1,14 @@
import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing'; // Asegúrate de que está importado
import { RouterTestingModule } from '@angular/router/testing';
import { TranslateModule } from '@ngx-translate/core';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
RouterTestingModule
RouterTestingModule,
TranslateModule.forRoot()
],
declarations: [
AppComponent
@ -19,5 +21,4 @@ describe('AppComponent', () => {
const app = fixture.componentInstance;
expect(app).toBeTruthy();
});
});

View File

@ -3,7 +3,7 @@ import { RouterTestingModule } from '@angular/router/testing';
import { AdminComponent } from './admin.component';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { By } from '@angular/platform-browser';
import { TranslateModule } from '@ngx-translate/core';
describe('AdminComponent', () => {
let component: AdminComponent;
@ -13,9 +13,10 @@ describe('AdminComponent', () => {
await TestBed.configureTestingModule({
declarations: [AdminComponent],
imports: [
RouterTestingModule, // Importa RouterTestingModule para manejar routerLink
MatButtonModule, // Importa MatButtonModule para botones
MatIconModule // Importa MatIconModule para iconos
RouterTestingModule,
MatButtonModule,
MatIconModule,
TranslateModule.forRoot()
]
}).compileComponents();
});
@ -23,35 +24,10 @@ describe('AdminComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(AdminComponent);
component = fixture.componentInstance;
fixture.detectChanges(); // Detecta cambios para renderizar el componente
fixture.detectChanges();
});
it('debería crear el componente', () => {
expect(component).toBeTruthy();
});
it('debería contener dos botones', () => {
const buttons = fixture.debugElement.queryAll(By.css('button'));
expect(buttons.length).toBe(2); // Verifica que hay dos botones
});
it('el primer botón debería tener el texto "Usuarios"', () => {
const firstButton = fixture.debugElement.query(By.css('.fab-button:first-child'));
expect(firstButton.nativeElement.textContent).toContain('Usuarios'); // Verifica que el texto sea "Usuarios"
});
it('el segundo botón debería tener el texto "Roles"', () => {
const secondButton = fixture.debugElement.query(By.css('.fab-button:last-child'));
expect(secondButton.nativeElement.textContent).toContain('Roles'); // Verifica que el texto sea "Roles"
});
it('el primer botón debería tener el routerLink correcto', () => {
const firstButton = fixture.debugElement.query(By.css('.fab-button:first-child'));
expect(firstButton.nativeElement.getAttribute('ng-reflect-router-link')).toBe('/users'); // Verifica el routerLink
});
it('el segundo botón debería tener el routerLink correcto', () => {
const secondButton = fixture.debugElement.query(By.css('.fab-button:last-child'));
expect(secondButton.nativeElement.getAttribute('ng-reflect-router-link')).toBe('/user-groups'); // Verifica el routerLink
});
});

View File

@ -1,6 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { EnvVarsComponent } from './env-vars.component';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { DataService } from '../users/users/data.service';
import { MatTableModule } from '@angular/material/table';
describe('EnvVarsComponent', () => {
let component: EnvVarsComponent;
@ -8,9 +20,36 @@ describe('EnvVarsComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [EnvVarsComponent]
})
.compileComponents();
declarations: [EnvVarsComponent],
imports: [
ReactiveFormsModule,
FormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
BrowserAnimationsModule,
MatTableModule,
ToastrModule.forRoot(),
TranslateModule.forRoot()
],
providers: [
FormBuilder,
ToastrService,
DataService,
provideHttpClient(),
provideHttpClientTesting(),
{
provide: MatDialogRef,
useValue: {}
},
{
provide: MAT_DIALOG_DATA,
useValue: {}
}
]
}).compileComponents();
fixture = TestBed.createComponent(EnvVarsComponent);
component = fixture.componentInstance;

View File

@ -11,6 +11,7 @@ import { MatLabel } from '@angular/material/form-field';
import { MatIcon } from '@angular/material/icon';
import { MatHint } from '@angular/material/form-field';
import { MatPaginator } from '@angular/material/paginator';
import { TranslateModule } from '@ngx-translate/core';
describe('RolesComponent', () => {
let component: RolesComponent;
let fixture: ComponentFixture<RolesComponent>;
@ -27,7 +28,8 @@ describe('RolesComponent', () => {
await TestBed.configureTestingModule({
declarations: [RolesComponent],
imports: [MatDivider, MatFormField, MatLabel, MatIcon, MatHint, MatPaginator],
imports: [MatDivider, MatFormField, MatLabel, MatIcon, MatHint, MatPaginator,
TranslateModule.forRoot()],
providers: [
{ provide: MatDialog, useValue: matDialogSpy },
{ provide: HttpClient, useValue: httpClientSpy },

View File

@ -6,6 +6,7 @@ import { HttpClientTestingModule } from '@angular/common/http/testing';
import { ToastrService } from 'ngx-toastr';
import { of } from 'rxjs';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
class MockUserService {
getUsers() {
@ -29,6 +30,7 @@ describe('UsersComponent', () => {
MatTableModule,
MatDialogModule,
HttpClientTestingModule,
TranslateModule.forRoot()
],
providers: [
{ useClass: MockUserService },

View File

@ -13,6 +13,8 @@ import { MatTooltipModule } from '@angular/material/tooltip';
import { FormsModule } from '@angular/forms';
import { CalendarComponent } from './calendar.component';
import { MatProgressSpinner } from '@angular/material/progress-spinner';
import { JoyrideModule, JoyrideService } from 'ngx-joyride';
import { TranslateModule } from '@ngx-translate/core';
describe('CalendarComponent', () => {
let component: CalendarComponent;
@ -34,8 +36,10 @@ describe('CalendarComponent', () => {
MatPaginatorModule,
MatTooltipModule,
FormsModule,
MatProgressSpinner
]
MatProgressSpinner,
JoyrideModule.forRoot(),
TranslateModule.forRoot(),
],
})
.compileComponents();

View File

@ -10,6 +10,8 @@ import { FormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule, JoyrideService, JoyrideStepService } from 'ngx-joyride';
describe('CommandsTaskComponent', () => {
let component: CommandsTaskComponent;
let fixture: ComponentFixture<CommandsTaskComponent>;
@ -25,7 +27,9 @@ describe('CommandsTaskComponent', () => {
MatPaginatorModule,
FormsModule,
MatInputModule,
BrowserAnimationsModule
BrowserAnimationsModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
declarations: [CommandsTaskComponent],
schemas: [NO_ERRORS_SCHEMA]

View File

@ -17,6 +17,8 @@ import { MatSelectModule } from '@angular/material/select';
import { MatTooltipModule } from '@angular/material/tooltip';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgxChartsModule } from '@swimlane/ngx-charts';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('CommandsComponent', () => {
let component: CommandsComponent;
@ -44,7 +46,9 @@ describe('CommandsComponent', () => {
ReactiveFormsModule,
MatSelectModule,
NgxChartsModule,
DatePipe
DatePipe,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
providers: [
{ provide: MatDialogRef, useValue: {} },

View File

@ -7,11 +7,13 @@ import { ToastrService, ToastrModule } from 'ngx-toastr';
import { DataService } from '../data.service';
import { CreateCommandComponent } from './create-command.component';
import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field'; // Import for mat-form-field
import { MatInputModule } from '@angular/material/input'; // Import for matInput
import { MatCheckboxModule } from '@angular/material/checkbox'; // Import for mat-checkbox
import { MatButtonModule } from '@angular/material/button'; // Import for mat-button
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatButtonModule } from '@angular/material/button';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
describe('CreateCommandComponent', () => {
let component: CreateCommandComponent;
let fixture: ComponentFixture<CreateCommandComponent>;
@ -20,14 +22,15 @@ describe('CreateCommandComponent', () => {
await TestBed.configureTestingModule({
declarations: [CreateCommandComponent],
imports: [
ReactiveFormsModule,
ReactiveFormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
BrowserAnimationsModule,
ToastrModule.forRoot(),
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
BrowserAnimationsModule,
ToastrModule.forRoot(),
TranslateModule.forRoot()
],
providers: [
FormBuilder,

View File

@ -1,6 +1,20 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ExecuteCommandComponent } from './execute-command.component';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table';
import { MatSelectModule } from '@angular/material/select';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { DataService } from '../data.service';
describe('ExecuteCommandComponent', () => {
let component: ExecuteCommandComponent;
@ -8,7 +22,36 @@ describe('ExecuteCommandComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ExecuteCommandComponent]
declarations: [ExecuteCommandComponent],
imports: [
ReactiveFormsModule,
FormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
BrowserAnimationsModule,
MatTableModule,
MatSelectModule,
ToastrModule.forRoot(),
TranslateModule.forRoot()
],
providers: [
FormBuilder,
ToastrService,
DataService,
provideHttpClient(),
provideHttpClientTesting(),
{
provide: MatDialogRef,
useValue: {}
},
{
provide: MAT_DIALOG_DATA,
useValue: {}
}
]
})
.compileComponents();

View File

@ -1,7 +1,6 @@
.groupLists-container {
display: flex;
flex-wrap: wrap;
height: auto;
margin-bottom: 30px;
}
@ -11,10 +10,6 @@
margin: 10px;
}
.search-container mat-form-field {
width: 50%;
}
.card {
flex-grow: 1;
margin: 10px;
@ -28,114 +23,10 @@
padding: 10px;
}
.unidad-card, .elements-card {
flex: 1 1 45%;
background-color: #fafafa;
height: 600px;
overflow-y: auto;
}
.element-content {
overflow-y: auto;
}
.title {
margin-left: 10px;
}
.details-card, .classroom-view {
flex: 1 1 25%;
}
mat-card-title {
display: flex;
justify-content: space-between;
margin: 10px;
}
.title-with-breadcrumb {
display: flex;
flex-direction: column;
}
mat-card-subtitle {
font-size: 0.875rem;
color: rgba(0, 0, 0, 0.54);
}
mat-card-subtitle a {
cursor: pointer;
text-decoration: underline;
color: #929292;
}
mat-card-subtitle a:hover {
text-decoration: none;
}
.groups-button-row {
display: flex;
flex-grow: 1;
}
.button-group {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
}
.button-group button {
flex-grow: 1;
}
.item-content {
display: flex;
width: 100%;
}
.clickable-item:hover {
cursor: pointer;
}
.selected-item {
background-color: #e0e0e0;
}
.actions {
display: flex;
margin-left: auto;
align-self: center;
}
.actions mat-icon {
cursor: pointer;
margin-left: 16px;
color: #757575;
}
.actions mat-icon:hover {
color: #212121;
}
.empty-list {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
}
mat-spinner {
margin: 0 auto;
align-self: center;
}
.classroomBtn-container {
display: flex;
justify-content: flex-end;
width: 100%;
}
.container {
display: flex;
flex-direction: column;
@ -163,202 +54,100 @@ mat-spinner {
width: 300px;
}
.saved-filter {
display: flex;
flex-direction: column;
width: 300px;
margin-bottom: 10px;
padding: 10px;
}
.results {
width: 100%;
}
.result-card {
width: 100%;
max-width: 250px;
height: auto;
background-color: #ffffff;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease, box-shadow 0.3s ease;
padding: 15px;
margin: 10px 10px;
}
.result-card.small-card {
max-width: 180px;
padding: 10px;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
.result-container {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-start;
padding: 16px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: transform 0.2s, box-shadow 0.2s;
background-color: #fff;
max-width: 300px;
margin: 8px;
box-sizing: border-box;
}
.result-card.card-og-live {
background-color: #4caf50; /* Verde */
color: white;
}
.result-card.card-busy {
background-color: #f44336; /* Naranja */
color: white;
}
.result-card.card-windows {
background-color: #2196f3; /* Azul */
color: white;
}
.result-card.card-linux {
background-color: #9c27b0; /* Púrpura */
color: white;
}
.result-card.card-macos {
background-color: #ff9800; /* Rojo */
color: white;
}
.result-card.card-off {
background-color: #9e9e9e; /* Gris */
color: white;
.result-container:hover {
transform: translateY(-4px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.result-title {
font-size: 1rem;
font-weight: 500;
color: #333;
margin-bottom: 5px;
font-size: 1.25rem;
font-weight: bold;
margin: 8px 0;
text-align: center;
}
.result-content {
padding-top: 5px;
color: #555;
font-size: 0.85rem;
display: flex;
flex-direction: column;
gap: 4px;
font-size: 0.9rem;
}
.result-type, .result-ip, .result-mac, .result-status, .result-internal-units, .result-clients {
font-size: 0.8rem;
margin: 2px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
.result-type,
.result-ip,
.result-mac,
.result-status,
.result-internal-units,
.result-clients {
margin: 0;
padding: 0;
text-align: left;
}
.result-checkbox {
align-self: flex-start;
margin: 0 0 5px 0;
margin-bottom: 8px;
cursor: pointer;
}
.result-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);
.card-og-live {
background-color: #4caf50;
color: white;
}
.paginator-container {
display: flex;
justify-content: center;
margin-bottom: 30px;
.card-busy {
background-color: #f44336;
color: white;
}
.card-windows {
background-color: #2196f3;
color: white;
}
.card-linux {
background-color: #9c27b0;
color: white;
}
.card-macos {
background-color: #ff9800;
color: white;
}
.card-off {
background-color: #9e9e9e;
color: white;
}
.divider {
margin: 20px 0;
}
mat-card {
margin-bottom: 20px;
margin-right: 20px;
background-color: #fff;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.red-card {
background-color: #f35f53;
color: white;
}
.green-card {
background-color: #4caf50;
color: white;
}
.view-mode-buttons button.active {
font-weight: bold;
color: #3f51b5;
}
.result-card-list {
display: flex;
flex-direction: row;
align-items: center;
padding: 5px;
margin-bottom: 2px;
border: 1px solid #ddd;
}
.result-card-list mat-checkbox {
margin-right: 8px;
}
.result-card-list .result-title {
font-size: 14px;
font-weight: bold;
margin-right: 8px;
}
.result-card-list mat-card-content {
display: flex;
flex-direction: row;
gap: 8px;
font-size: 12px;
}
.result-card-list p {
margin: 0;
}
.result-list {
height: auto;
}
.result-card {
display: flex;
flex-direction: column;
height: 100%;
}
.card-content-wrapper {
display: flex;
flex-direction: row;
align-items: flex-start;
flex-wrap: wrap;
}
.result-checkbox {
flex: 0 0 auto;
}
.text-content {
flex: 1 1 auto;
min-width: 0;
}
.result-title,
.result-content {
margin: 0;
}
.result-content p {
margin: 0;
button {
margin-bottom: 10px;
}
@media (max-width: 600px) {
.card-content-wrapper {
flex-direction: column;
align-items: stretch;
.result-container {
max-width: 100%;
}
}

View File

@ -1,13 +1,8 @@
<div class="header-container">
<h2 class="title">{{ 'searchTitle' | translate }}</h2>
<button mat-icon-button color="primary" (click)="iniciarTour()">
<mat-icon>help</mat-icon>
</button>
</div>
<h2 class="title" i18n="@@searchTitle">Búsqueda avanzada</h2>
<div class="container">
<div class="header" joyrideStep="filterSelectionStep" text="Selecciona entre los filtros guardados para ajustar los resultados de la búsqueda.">
<div class="header">
<mat-form-field>
<mat-label>{{ 'selectFilterLabel' | translate }}</mat-label>
<mat-label i18n="@@selectFilterLabel">Seleccione filtro</mat-label>
<mat-select (selectionChange)="loadSelectedFilter($event.value)">
<mat-option *ngFor="let savedFilter of savedFilterNames" [value]="savedFilter">
{{ savedFilter[0] }}
@ -15,121 +10,138 @@
</mat-select>
</mat-form-field>
</div>
<mat-divider class="divider"></mat-divider>
<div class="view-mode-buttons" joyrideStep="viewModeStep" text="Elige cómo quieres ver los resultados: en cuadrícula o en lista.">
<button mat-button (click)="changeViewMode('grid')" [class.active]="viewMode === 'grid'">
<mat-icon>grid_view</mat-icon> {{ 'gridViewButton' | translate }}
</button>
<button mat-button (click)="changeViewMode('list')" [class.active]="viewMode === 'list'">
<mat-icon>list</mat-icon> {{ 'listViewButton' | translate }}
</button>
<button mat-button (click)="toggleSelectAll()">
<mat-icon>checkbox</mat-icon> Seleccionar/Deseleccionar Todos</button>
</div>
<div class="main-content">
<div class="filters" joyrideStep="filtersStep" text="Aplica filtros específicos para encontrar los resultados exactos que necesitas.">
<div class="filters">
<mat-form-field>
<mat-label>{{ 'selectOptionLabel' | translate }}</mat-label>
<mat-label i18n="@@selectOptionLabel">Selecciona una opción</mat-label>
<mat-select [(value)]="selectedFilter1" (selectionChange)="applyFilter()">
<mat-option value="ou">{{ 'organizationalUnitsOption' | translate }}</mat-option>
<mat-option value="client">{{ 'clientsOption' | translate }}</mat-option>
<mat-option value="ou" i18n="@@organizationalUnitsOption">Unidades organizativas</mat-option>
<mat-option value="client" i18n="@@clientsOption">Clientes</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field class="example-full-width">
<mat-label>{{ 'nameLabel' | translate }}</mat-label>
<input matInput placeholder="{{ 'namePlaceholder' | translate }}" (input)="applyFilter()" [(ngModel)]="filterName">
<mat-label i18n="@@nameLabel">Nombre</mat-label>
<input matInput placeholder="Unidad organizativa" (input)="applyFilter()" [(ngModel)]="filterName"
i18n-placeholder="@@namePlaceholder">
</mat-form-field>
<div class="button-group">
<button mat-raised-button color="primary" (click)="saveFilters()" i18n="@@saveFiltersButton" joyrideStep="saveFiltersStep" text="Guarda tus filtros seleccionados para usarlos en el futuro.">{{ 'selectAllButton' | translate }}</button>
<button mat-raised-button color="accent" (click)="sendActions()" i18n="@@sendFiltersButton" [disabled]="selectedElements.length === 0" joyrideStep="sendActionStep" text="Envía una acción a los elementos seleccionados.">{{ 'saveFiltersButton' | translate }}</button>
<button mat-flat-button color="primary" [disabled]="selectedElements.length === 0" (click)="onPxeBootFile()" joyrideStep="addPxeStep" text="Añade un archivo PXE a los elementos seleccionados.">{{ 'addPxeButton' | translate }}</button>
<button mat-raised-button color="primary" [matMenuTriggerFor]="menu" [disabled]="selectedFilter1 === 'ou'">
Asistentes
</button>
<mat-menu #menu="matMenu">
<button mat-menu-item [disabled]="selectedElements.length > 1 || !selectedElements.length" (click)="onCommandSelect('partition')">Asistente de particionado</button>
<button mat-menu-item [disabled]="selectedElements.length > 1 || !selectedElements.length" (click)="onCommandSelect('create-image')">Crear una imagen</button>
<button mat-menu-item [disabled]="selectedElements.length > 1 || !selectedElements.length" (click)="onCommandSelect('deploy-image')">Desplegar una imagen</button>
</mat-menu>
</div>
</div>
<ng-container *ngIf="selectedFilter1 === 'ou'">
<div class="results" joyrideStep="resultsStep" text="Aquí verás los resultados de tu búsqueda filtrada.">
<mat-form-field [disabled]="selectedFilter1 === 'ou'">
<mat-label i18n="@@unitTypeLabel">Tipo de unidad</mat-label>
<mat-select [(value)]="selectedFilter2" (selectionChange)="applyFilter()">
<mat-option value="organizational-unit" i18n="@@organizationalUnitOption">Unidad organizativa</mat-option>
<mat-option value="classroom-group" i18n="@@classroomsGroupOption">Grupos de aulas</mat-option>
<mat-option value="classroom" i18n="@@classroomOption">Aulas</mat-option>
<mat-option value="client-group" i18n="@@clientGroupOption">Grupos de clientes</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field>
<mat-label i18n="@@floorLabel" class="temp_filter">Planta</mat-label>
<mat-select [(value)]="selectedFilter1">
<mat-option value="none" i18n="@@noneOption">Ninguno</mat-option>
<mat-option value="option1" i18n="@@option1">Planta 1</mat-option>
<mat-option value="option2" i18n="@@option2">Planta 2</mat-option>
<mat-option value="option3" i18n="@@option3">Planta 3</mat-option>
</mat-select>
</mat-form-field>
</ng-container>
<!-- FILTROS CLIENTES -->
<ng-container *ngIf="selectedFilter1 === 'client'">
<mat-form-field>
<mat-label i18n="@@selectAnotherOptionLabel" class="temp_filter">Sistema Operativo</mat-label>
<mat-select multiple [(value)]="selectedFilterOS">
<mat-option value="none" i18n="@@noneOption">Ninguno</mat-option>
<mat-option value="Windows 10 Education 1803 64 bits">Windows 10 Education 1803 64 bits</mat-option>
<mat-option value="Ubuntu 18.04.1 LTS 64 bits">Ubuntu 18.04.1 LTS 64 bits</mat-option>
<mat-option value="Ubuntu 16.04.4 LTS 64 bits">Ubuntu 16.04.4 LTS 64 bits</mat-option>
<mat-option value="DATA">RESTO DE OPCIONES TBI</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field>
<mat-label i18n="@@selectStateLabel" class="temp_filter">Estado</mat-label>
<mat-select multiple [(value)]="selectedFilterStatus">
<mat-option value="off" i18n="@@offOption">off</mat-option>
<mat-option value="initializing" i18n="@@initializingOption">initializing</mat-option>
<mat-option value="oglive" i18n="@@ogliveOption">oglive</mat-option>
<mat-option value="busy" i18n="@@busyOption">busy</mat-option>
<mat-option value="linux" i18n="@@linuxOption">linux</mat-option>
<mat-option value="linux_session" i18n="@@linuxSessionOption">linux_session</mat-option>
<mat-option value="macos" i18n="@@macosOption">macos</mat-option>
<mat-option value="windows" i18n="@@windowsOption">windows</mat-option>
<mat-option value="windows_session" i18n="@@windowsSessionOption">windows_session</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field class="example-full-width">
<mat-label class="temp_filter">IP</mat-label>
<input matInput placeholder="Dírección IP" (input)="applyFilter()" i18n [(ngModel)]="filterIP">
</mat-form-field>
<mat-form-field class="example-full-width">
<mat-label class="temp_filter">MAC</mat-label>
<input matInput placeholder="Dírección IP" (input)="applyFilter()" i18n [(ngModel)]="filterMAC">
</mat-form-field>
</ng-container>
<button mat-raised-button color="primary" (click)="toggleSelectAll()">Seleccionar/Deseleccionar Todos</button>
<button mat-raised-button color="primary" (click)="saveFilters()" i18n="@@saveFiltersButton">Guardar
Filtros</button>
<button mat-raised-button color="accent" (click)="sendActions()" i18n="@@sendFiltersButton"
[disabled]="selectedElements.length === 0">Enviar Acción</button>
<button mat-flat-button color="primary" [disabled]="selectedElements.length === 0"
(click)="onPxeBootFile()">Añadir fichero PXE</button>
</div>
<div class="results">
<ng-container *ngIf="filteredResults && filteredResults.length > 0; else noResults">
<ng-container *ngIf="viewMode === 'grid'">
<mat-grid-list cols="8" rowHeight="1:1" >
<mat-grid-tile *ngFor="let result of filteredResults">
<mat-card
class="result-card small-card"
[ngClass]="{
'card-og-live': result.status === 'og-live',
'card-busy': result.status === 'busy',
'card-windows': result.status === 'windows' || result.status === 'windows-session',
'card-linux': result.status === 'linux' || result.status === 'linux-session',
<mat-grid-list cols="6">
<mat-grid-tile *ngFor="let result of filteredResults">
<div class="result-container" (dblclick)="onDobleClick($event, result.uuid, result.type)" [ngClass]="{
'card-og-live': result.status === 'og-live',
'card-busy': result.status === 'busy',
'card-windows': result.status === 'windows' || result.status === 'windows-session',
'card-linux': result.status === 'linux' || result.status === 'linux-session',
'card-macos': result.status === 'macos',
'card-off': result.status === 'off'
}"
matTooltip="{{ result.status }}"
>
<div class="card-content-wrapper">
<mat-checkbox
[checked]="isSelected(result.name)"
(change)="onCheckboxChange($event, result.name, result['@id'])"
class="result-checkbox"
>
</mat-checkbox>
<div class="text-content">
<mat-card-title class="result-title">{{ result.name }}</mat-card-title>
<mat-card-content class="result-content">
<p class="result-type">{{ result.type !== 'client' ? result.type : '' }}</p>
<p class="result-ip" *ngIf="result.type === 'client'">{{ result.ip }}</p>
<p class="result-mac" *ngIf="result.type === 'client'">{{ result.mac }}</p>
<p class="result-status" *ngIf="result.type === 'client'">{{ result.status }}</p>
<p *ngIf="result.type !== 'client'" class="result-internal-units">
{{ 'internalUnits' | translate }}: {{ result.children.length }}
</p>
<p *ngIf="result.type !== 'client'" class="result-clients">
{{ 'clients' | translate }}: {{ result.clients.length }}
</p>
</mat-card-content>
</div>
</div>
</mat-card>
</mat-grid-tile>
</mat-grid-list>
</ng-container>
<ng-container *ngIf="viewMode === 'list'">
<div class="result-list" *ngFor="let result of filteredResults">
<mat-card class="result-card-list">
<mat-checkbox [checked]="isSelected(result.name)" (change)="onCheckboxChange($event, result.name, result['@id'])" class="result-checkbox"></mat-checkbox>
<mat-card-title class="result-title">{{ result.name }}</mat-card-title>
<mat-card-content class="result-content">
}" matTooltip="{{ result.status }}">
<input type="checkbox" [checked]="isSelected(result.name)"
(change)="onCheckboxChange($event, result.name, result['@id'])" class="result-checkbox" />
<h3 class="result-title">{{ result.name }}</h3>
<div class="result-content">
<p class="result-type">{{ result.type !== 'client' ? result.type : '' }}</p>
<p class="result-ip" *ngIf="result.type === 'client'">{{ result.ip }}</p>
<p class="result-mac" *ngIf="result.type === 'client'">{{ result.mac }}</p>
<p class="result-status" *ngIf="result.type === 'client'">{{ result.status }}</p>
</mat-card-content>
</mat-card>
</div>
</ng-container>
<p *ngIf="result.type !== 'client'" i18n="@@internalUnits" class="result-internal-units">
Unidades internas: {{ result.children.length }}
</p>
<p *ngIf="result.type !== 'client'" i18n="@@clients" class="result-clients">
Clientes: {{ result.clients.length }}
</p>
</div>
</div>
</mat-grid-tile>
</mat-grid-list>
<div class="paginator-container">
<mat-paginator [length]="length" [pageSize]="itemsPerPage" [pageIndex]="page" [pageSizeOptions]="pageSizeOptions" (page)="onPageChange($event)">
<mat-paginator [length]="length" [pageSize]="itemsPerPage" [pageIndex]="page"
[pageSizeOptions]="pageSizeOptions" (page)="onPageChange($event)">
</mat-paginator>
</div>
</ng-container>
<ng-template #noResults>
<p>{{ 'noResultsMessage' | translate }}</p>
<p i18n="@@noResultsMessage">No hay resultados para mostrar.</p>
</ng-template>
</div>
</div>
</div>
</div>

View File

@ -1,6 +1,22 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CreateImageComponent } from './create-image.component';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { ReactiveFormsModule, FormBuilder } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatTableModule } from '@angular/material/table';
import { MatTabsModule } from '@angular/material/tabs';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { of } from 'rxjs';
import { DataService } from '../../client-tab-view/data.service';
describe('CreateImageComponent', () => {
let component: CreateImageComponent;
@ -8,7 +24,47 @@ describe('CreateImageComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [CreateImageComponent]
imports: [
CreateImageComponent,
ReactiveFormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
MatTabsModule,
MatTableModule,
MatPaginatorModule,
BrowserAnimationsModule,
ToastrModule.forRoot(),
TranslateModule.forRoot()
],
providers: [
FormBuilder,
ToastrService,
DataService,
provideHttpClient(),
provideHttpClientTesting(),
{
provide: MatDialogRef,
useValue: {}
},
{
provide: MAT_DIALOG_DATA,
useValue: {}
},
{
provide: ActivatedRoute,
useValue: {
snapshot: {
paramMap: {
get: (key: string) => 'valorSimulado'
}
},
params: of({ id: 'valorSimulado' })
}
}
]
})
.compileComponents();

View File

@ -8,7 +8,7 @@
<div class="select-container">
<div class="option-container">
<mat-radio-group [(ngModel)]="selectedOption" aria-label="Selecciona una opcion">
<mat-radio-group [(ngModel)]="selectedOption" name="selectedOption" aria-label="Selecciona una opcion">
<mat-radio-button value="update-cache">Actualizar cache</mat-radio-button>
<mat-radio-button value="deploy-image">Deploy imagen</mat-radio-button>
</mat-radio-group>
@ -17,14 +17,14 @@
<div class="deploy-container">
<mat-form-field appearance="fill" class="full-width">
<mat-label>Seleccione imagen</mat-label>
<mat-select [(ngModel)]="selectedImage">
<mat-select [(ngModel)]="selectedImage" name="selectedImage">
<mat-option *ngFor="let image of images" [value]="image['@id']">{{ image.name }}</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field appearance="fill" class="full-width">
<mat-label>Seleccione método de deploy</mat-label>
<mat-select [(ngModel)]="selectedMethod">
<mat-select [(ngModel)]="selectedMethod" name="selectedMethod">
<mat-option *ngFor="let method of deployMethods" [value]="method">{{ method }}</mat-option>
</mat-select>
</mat-form-field>
@ -35,7 +35,7 @@
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef i18n="@@columnActions" style="text-align: start">Seleccionar partición</th>
<td mat-cell *matCellDef="let row">
<mat-radio-group [(ngModel)]="selectedPartition">
<mat-radio-group [(ngModel)]="selectedPartition" name="selectedPartition">
<mat-radio-button [value]="row">
</mat-radio-button>
</mat-radio-group>
@ -59,17 +59,17 @@
<div *ngIf="isMethod('multicast')" class="input-group">
<mat-form-field appearance="fill" class="input-field">
<mat-label>Puerto</mat-label>
<input matInput [(ngModel)]="mcastPort">
<input matInput [(ngModel)]="mcastPort" name="mcastPort">
</mat-form-field>
<mat-form-field appearance="fill" class="input-field">
<mat-label>Dirección</mat-label>
<input matInput [(ngModel)]="mcastIp">
<input matInput [(ngModel)]="mcastIp" name="mcastIp">
</mat-form-field>
<mat-form-field appearance="fill" class="input-field">
<mat-label i18n="@@mcastModeLabel">Modo Multicast</mat-label>
<mat-select [(ngModel)]="mcastMode">
<mat-select [(ngModel)]="mcastMode" name="mcastMode">
<mat-option *ngFor="let option of multicastModeOptions" [value]="option.value">
{{ option.name }}
</mat-option>
@ -78,24 +78,24 @@
<mat-form-field appearance="fill" class="input-field">
<mat-label>Velocidad</mat-label>
<input matInput [(ngModel)]="mcastSpeed">
<input matInput [(ngModel)]="mcastSpeed" name="mcastSpeed">
</mat-form-field>
<mat-form-field appearance="fill" class="input-field">
<mat-label>Máximo Clientes</mat-label>
<input matInput [(ngModel)]="mcastMaxClients">
<input matInput [(ngModel)]="mcastMaxClients" name="mcastMaxClients">
</mat-form-field>
<mat-form-field appearance="fill" class="input-field">
<mat-label>Tiempo Máximo de Espera</mat-label>
<input matInput [(ngModel)]="mcastMaxTime">
<input matInput [(ngModel)]="mcastMaxTime" name="mcastMaxTime">
</mat-form-field>
</div>
<div *ngIf="isMethod('torrent')" class="input-group">
<mat-form-field appearance="fill" class="input-field">
<mat-label i18n="@@p2pModeLabel">Modo P2P</mat-label>
<mat-select [(ngModel)]="p2pMode">
<mat-select [(ngModel)]="p2pMode" name="p2pMode">
<mat-option *ngFor="let option of p2pModeOptions" [value]="option.value">
{{ option.name }}
</mat-option>
@ -104,6 +104,6 @@
<mat-form-field appearance="fill" class="input-field">
<mat-label>Semilla</mat-label>
<input matInput [(ngModel)]="p2pTime">
<input matInput [(ngModel)]="p2pTime" name="p2pTime">
</mat-form-field>
</div>

View File

@ -1,6 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DeployImageComponent } from './deploy-image.component';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table';
import { MatDividerModule } from '@angular/material/divider';
import { MatRadioModule } from '@angular/material/radio'; // Importar MatRadioModule
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { DataService } from '../../client-tab-view/data.service';
import { provideRouter } from '@angular/router';
import { MatSelectModule } from '@angular/material/select';
describe('DeployImageComponent', () => {
let component: DeployImageComponent;
@ -8,7 +25,39 @@ describe('DeployImageComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [DeployImageComponent]
declarations: [DeployImageComponent],
imports: [
ReactiveFormsModule,
FormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
MatTableModule,
MatDividerModule,
MatRadioModule,
MatSelectModule,
BrowserAnimationsModule,
ToastrModule.forRoot(),
TranslateModule.forRoot()
],
providers: [
FormBuilder,
ToastrService,
DataService,
provideHttpClient(),
provideHttpClientTesting(),
provideRouter([]),
{
provide: MatDialogRef,
useValue: {}
},
{
provide: MAT_DIALOG_DATA,
useValue: {}
}
]
})
.compileComponents();

View File

@ -2,11 +2,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginComponent } from './login.component';
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
import { FormsModule } from '@angular/forms';
import { ToastrModule } from 'ngx-toastr'; // Importa el módulo de Toastr
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; // Importa el módulo de animaciones
import { MatFormFieldModule } from '@angular/material/form-field'; // Importa MatFormFieldModule
import { MatInputModule } from '@angular/material/input'; // Importa MatInputModule
import { MatIconModule } from '@angular/material/icon'; // Importa MatIconModule
import { ToastrModule } from 'ngx-toastr';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatIconModule } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
describe('LoginComponent', () => {
let component: LoginComponent;
@ -21,7 +22,8 @@ describe('LoginComponent', () => {
BrowserAnimationsModule,
MatFormFieldModule,
MatInputModule,
MatIconModule
MatIconModule,
TranslateModule.forRoot()
],
providers: [provideHttpClient(withInterceptorsFromDi())]
})

View File

@ -16,6 +16,8 @@ import { MatTableModule } from '@angular/material/table';
import { MatTooltipModule } from '@angular/material/tooltip';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ToastrModule } from 'ngx-toastr';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('OgbootStatusComponent', () => {
let component: OgbootStatusComponent;
let fixture: ComponentFixture<OgbootStatusComponent>;
@ -41,7 +43,9 @@ describe('OgbootStatusComponent', () => {
MatDialogModule,
ReactiveFormsModule,
MatSelectModule,
NgxChartsModule
NgxChartsModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
providers: [
{ provide: MatDialogRef, useValue: {} },

View File

@ -12,6 +12,8 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule, NgControl, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('PxeBootFilesComponent', () => {
let component: PxeBootFilesComponent;
@ -37,7 +39,9 @@ describe('PxeBootFilesComponent', () => {
FormsModule,
MatInputModule,
MatTableModule,
ReactiveFormsModule
ReactiveFormsModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
providers: [NgControl]
})

View File

@ -13,6 +13,8 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('PXEimagesComponent', () => {
let component: PXEimagesComponent;
@ -39,7 +41,10 @@ describe('PXEimagesComponent', () => {
BrowserAnimationsModule,
FormsModule,
MatInputModule,
MatTableModule, ],
MatTableModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
providers: [
{ provide: ToastrService, useValue: mockToastrService }
]

View File

@ -20,6 +20,7 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatListModule } from '@angular/material/list';
import { MatTabsModule } from '@angular/material/tabs';
import { TranslateModule } from '@ngx-translate/core';
describe('AddClientsToPxeComponent', () => {
let component: AddClientsToPxeComponent;
@ -47,7 +48,8 @@ describe('AddClientsToPxeComponent', () => {
MatSelectModule,
MatTabsModule,
MatAutocompleteModule,
MatListModule
MatListModule,
TranslateModule.forRoot()
],
providers: [
{ provide: MatDialogRef, useValue: {} },

View File

@ -28,7 +28,6 @@ export class AddClientsToPxeComponent {
) {}
ngOnInit(): void {
console.log('Selected subnet UUID:', this.data);
this.loading = true;
this.loadClients();

View File

@ -20,6 +20,7 @@ import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/materia
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatListModule } from '@angular/material/list';
import { MatTabsModule } from '@angular/material/tabs';
import { TranslateModule } from '@ngx-translate/core';
describe('ClientsComponent', () => {
let component: ClientsComponent;
@ -47,7 +48,8 @@ describe('ClientsComponent', () => {
MatSelectModule,
MatTabsModule,
MatAutocompleteModule,
MatListModule
MatListModule,
TranslateModule.forRoot()
],
providers: [
{ provide: MatDialogRef, useValue: {} },

View File

@ -21,6 +21,8 @@ import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('PxeComponent', () => {
let component: PxeComponent;
let fixture: ComponentFixture<PxeComponent>;
@ -45,7 +47,9 @@ describe('PxeComponent', () => {
MatSelect,
MatOption,
MatPaginator,
ToastrModule.forRoot()
ToastrModule.forRoot(),
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
providers: [
DatePipe,

View File

@ -14,6 +14,8 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('OgDhcpSubnetsComponent', () => {
let component: OgDhcpSubnetsComponent;
@ -45,7 +47,9 @@ describe('OgDhcpSubnetsComponent', () => {
BrowserAnimationsModule,
FormsModule,
MatInputModule,
MatTableModule,
MatTableModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
providers: [
{ provide: MatDialog, useValue: mockDialog },

View File

@ -18,6 +18,8 @@ import { MatTooltipModule } from '@angular/material/tooltip';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ToastrModule } from 'ngx-toastr';
import { NgxChartsModule } from '@swimlane/ngx-charts';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('StatusComponent', () => {
let component: StatusComponent;
@ -44,7 +46,9 @@ describe('StatusComponent', () => {
ReactiveFormsModule,
MatSelectModule,
MatDialogModule,
NgxChartsModule
NgxChartsModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
],
providers: [
{ provide: MatDialogRef, useValue: {} },

View File

@ -14,6 +14,8 @@ import { MatTableModule } from '@angular/material/table';
import { MatTooltipModule } from '@angular/material/tooltip';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ToastrModule } from 'ngx-toastr';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('OperativeSystemComponent', () => {
let component: OperativeSystemComponent;
@ -35,7 +37,9 @@ describe('OperativeSystemComponent', () => {
MatPaginatorModule,
MatTooltipModule,
FormsModule,
MatProgressSpinner
MatProgressSpinner,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
]
})
.compileComponents();

View File

@ -1,6 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CreateRepositoryComponent } from './create-repository.component';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { ReactiveFormsModule, FormBuilder } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { DataService } from '../../calendar/data.service';
describe('CreateRepositoryComponent', () => {
let component: CreateRepositoryComponent;
@ -8,9 +20,33 @@ describe('CreateRepositoryComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [CreateRepositoryComponent]
})
.compileComponents();
imports: [
ReactiveFormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
BrowserAnimationsModule,
ToastrModule.forRoot(),
TranslateModule.forRoot()
],
providers: [
FormBuilder,
ToastrService,
DataService,
provideHttpClient(),
provideHttpClientTesting(),
{
provide: MatDialogRef,
useValue: {}
},
{
provide: MAT_DIALOG_DATA,
useValue: {}
}
]
}).compileComponents();
fixture = TestBed.createComponent(CreateRepositoryComponent);
component = fixture.componentInstance;

View File

@ -1,6 +1,21 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MainRepositoryViewComponent } from './main-repository-view.component';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { ReactiveFormsModule, FormBuilder, FormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { DataService } from '../../calendar/data.service';
import { CommonModule } from '@angular/common';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { provideRouter } from '@angular/router';
describe('MainRepositoryViewComponent', () => {
let component: MainRepositoryViewComponent;
@ -8,10 +23,39 @@ describe('MainRepositoryViewComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [MainRepositoryViewComponent]
})
.compileComponents();
declarations: [MainRepositoryViewComponent],
imports: [
CommonModule,
ReactiveFormsModule,
FormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
BrowserAnimationsModule,
ToastrModule.forRoot(),
TranslateModule.forRoot()
],
providers: [
FormBuilder,
ToastrService,
DataService,
provideHttpClient(),
provideHttpClientTesting(),
provideRouter([]),
{
provide: MatDialogRef,
useValue: {}
},
{
provide: MAT_DIALOG_DATA,
useValue: {}
}
],
schemas: [NO_ERRORS_SCHEMA]
}).compileComponents();
fixture = TestBed.createComponent(MainRepositoryViewComponent);
component = fixture.componentInstance;
fixture.detectChanges();

View File

@ -1,6 +1,24 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { RepositoriesComponent } from './repositories.component';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { ReactiveFormsModule, FormsModule, FormBuilder } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatDividerModule } from '@angular/material/divider';
import { MatIconModule } from '@angular/material/icon';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateModule } from '@ngx-translate/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
import { DataService } from '../calendar/data.service';
import { JoyrideModule } from 'ngx-joyride';
import { CommonModule } from '@angular/common';
describe('RepositoriesComponent', () => {
let component: RepositoriesComponent;
@ -8,9 +26,41 @@ describe('RepositoriesComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [RepositoriesComponent]
})
.compileComponents();
declarations: [RepositoriesComponent],
imports: [
ReactiveFormsModule,
FormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatCheckboxModule,
MatButtonModule,
MatTableModule,
MatPaginatorModule,
MatDividerModule,
MatIconModule,
BrowserAnimationsModule,
ToastrModule.forRoot(),
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
CommonModule
],
providers: [
FormBuilder,
ToastrService,
DataService,
provideHttpClient(),
provideHttpClientTesting(),
{
provide: MatDialogRef,
useValue: {}
},
{
provide: MAT_DIALOG_DATA,
useValue: {}
}
]
}).compileComponents();
fixture = TestBed.createComponent(RepositoriesComponent);
component = fixture.componentInstance;

View File

@ -10,24 +10,32 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatProgressSpinner } from '@angular/material/progress-spinner';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSelectModule } from '@angular/material/select';
import { MatTableModule } from '@angular/material/table';
import { MatTooltipModule } from '@angular/material/tooltip';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { BrowserAnimationsModule, NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ToastrModule } from 'ngx-toastr';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('SoftwareProfileComponent', () => {
let component: SoftwareProfileComponent;
let fixture: ComponentFixture<SoftwareProfileComponent>;
beforeEach(async () => {
Object.defineProperty(window, 'getComputedStyle', {
value: () => ({
getPropertyValue: (prop: string) => '',
}),
});
await TestBed.configureTestingModule({
declarations: [SoftwareProfileComponent],
imports: [
HttpClientTestingModule,
ToastrModule.forRoot(),
BrowserAnimationsModule,
NoopAnimationsModule,
MatDividerModule,
MatFormFieldModule,
MatInputModule,
@ -37,10 +45,12 @@ describe('SoftwareProfileComponent', () => {
MatPaginatorModule,
MatTooltipModule,
FormsModule,
MatProgressSpinner,
MatProgressSpinnerModule,
MatOptionModule,
ReactiveFormsModule,
MatSelectModule
MatSelectModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
]
})
.compileComponents();

View File

@ -16,6 +16,8 @@ import { ToastrModule } from 'ngx-toastr';
import { MatOptionModule } from '@angular/material/core';
import { ReactiveFormsModule } from '@angular/forms';
import { MatSelectModule } from '@angular/material/select';
import { TranslateModule } from '@ngx-translate/core';
import { JoyrideModule } from 'ngx-joyride';
describe('SoftwareComponent', () => {
let component: SoftwareComponent;
@ -40,7 +42,9 @@ describe('SoftwareComponent', () => {
MatProgressSpinner,
MatOptionModule,
ReactiveFormsModule,
MatSelectModule
MatSelectModule,
TranslateModule.forRoot(),
JoyrideModule.forRoot(),
]
})
.compileComponents();

View File

@ -1,167 +1,167 @@
<mat-nav-list>
<mat-list-item disabled>
<span class="user-logged" matTooltip="Bienvenido, {{username}}" matTooltipShowDelay="1000">
<span i18n="@@welcomeUser">Bienvenido {{username}}</span>
<span class="user-logged" matTooltip="{{ 'TOOLTIP_WELCOME_USER' | translate }}" matTooltipShowDelay="1000">
<span>{{ 'welcomeUser' | translate:{username: username} }}</span>
</span>
</mat-list-item>
<mat-divider></mat-divider>
<mat-list-item routerLink="/groups" matTooltip="Gestionar grupos de usuarios" matTooltipShowDelay="1000">
<mat-list-item routerLink="/groups" matTooltip="{{ 'TOOLTIP_GROUPS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">apartment</mat-icon>
<span i18n="@@groups">Grupos</span>
<span>{{ 'groups' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item (click)="toggleCommandSub()" matTooltip="Ver y ejecutar acciones predefinidas" matTooltipShowDelay="1000">
<mat-list-item (click)="toggleCommandSub()" matTooltip="{{ 'TOOLTIP_ACTIONS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">playlist_play</mat-icon>
<span i18n="@@actions">Acciones</span>
<span>{{ 'actions' | translate }}</span>
</span>
</mat-list-item>
<!-- Submenu items for commands -->
<mat-nav-list *ngIf="showCommandSub" style="padding-left: 20px;">
<mat-list-item routerLink="/commands" matTooltip="Lista de comandos disponibles" matTooltipShowDelay="1000">
<mat-list-item routerLink="/commands" matTooltip="{{ 'TOOLTIP_COMMANDS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">chevron_right</mat-icon>
<span i18n="@@gallery">Comandos</span>
<span>{{ 'commands' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/commands-groups" matTooltip="Gestionar grupos de comandos" matTooltipShowDelay="1000">
<mat-list-item routerLink="/commands-groups" matTooltip="{{ 'TOOLTIP_COMMAND_GROUPS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">chevron_right</mat-icon>
<span i18n="@@gallery">Grupos</span>
<span>{{ 'commandGroups' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/commands-task" matTooltip="Ver y gestionar tareas programadas" matTooltipShowDelay="1000">
<mat-list-item routerLink="/commands-task" matTooltip="{{ 'TOOLTIP_TASKS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">chevron_right</mat-icon>
<span i18n="@@gallery">Tareas</span>
<span>{{ 'tasks' | translate }}</span>
</span>
</mat-list-item>
</mat-nav-list>
<mat-list-item (click)="toggleOgDhcpSub()" matTooltip="Configurar y administrar DHCP" matTooltipShowDelay="1000">
<mat-list-item (click)="toggleOgDhcpSub()" matTooltip="{{ 'TOOLTIP_DHCP' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">settings_ethernet</mat-icon>
<span i18n="@@images">DHCP</span>
<span>{{ 'dhcp' | translate }}</span>
</span>
</mat-list-item>
<!-- Submenu items ogdhcp -->
<!-- Submenu items for DHCP -->
<mat-nav-list *ngIf="showOgDhcpSub" style="padding-left: 20px;">
<mat-list-item routerLink="/ogdhcp-status" matTooltip="Estado actual del servicio DHCP" matTooltipShowDelay="1000">
<mat-list-item routerLink="/ogdhcp-status" matTooltip="{{ 'TOOLTIP_DHCP_STATUS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">analytics</mat-icon>
<span i18n="@@gallery">Estado</span>
<span>{{ 'status' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/subnets" matTooltip="Gestionar y crea subredes" matTooltipShowDelay="1000">
<mat-list-item routerLink="/subnets" matTooltip="{{ 'TOOLTIP_SUBNETS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">lan</mat-icon>
<span i18n="@@gallery">Subredes</span>
<span>{{ 'subnets' | translate }}</span>
</span>
</mat-list-item>
</mat-nav-list>
<mat-list-item (click)="toggleOgBootSub()" matTooltip="Configurar y administrar opciones de arranque" matTooltipShowDelay="1000">
<mat-list-item (click)="toggleOgBootSub()" matTooltip="{{ 'TOOLTIP_BOOT' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">desktop_windows</mat-icon>
<span i18n="@@images">Boot</span>
<span>{{ 'boot' | translate }}</span>
</span>
</mat-list-item>
<!-- Submenu items for ogBoot -->
<!-- Submenu items for Boot -->
<mat-nav-list *ngIf="showOgBootSub" style="padding-left: 20px;">
<mat-list-item routerLink="/ogboot-status" matTooltip="Estado del servicio de arranque" matTooltipShowDelay="1000">
<mat-list-item routerLink="/ogboot-status" matTooltip="{{ 'TOOLTIP_BOOT_STATUS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">analytics</mat-icon>
<span i18n="@@gallery">Estado</span>
<span>{{ 'status' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/pxe-images" matTooltip="Ver imágenes disponibles para arranque PXE" matTooltipShowDelay="1000">
<mat-list-item routerLink="/pxe-images" matTooltip="{{ 'TOOLTIP_PXE_IMAGES' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">album</mat-icon>
<span i18n="@@gallery">ogLive</span>
<span>{{ 'ogLive' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/pxe" matTooltip="Gestionar plantillas de arranque PXE" matTooltipShowDelay="1000">
<mat-list-item routerLink="/pxe" matTooltip="{{ 'TOOLTIP_PXE_TEMPLATES' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">assignment</mat-icon>
<span i18n="@@upload">Plantillas PXE</span>
<span>{{ 'pxeTemplates' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/pxe-boot-file" matTooltip="Configurar archivos de arranque PXE" matTooltipShowDelay="1000">
<mat-list-item routerLink="/pxe-boot-file" matTooltip="{{ 'TOOLTIP_PXE_BOOT_FILES' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">save</mat-icon>
<span i18n="@@upload">Arranque PXE</span>
<span>{{ 'pxeBootFiles' | translate }}</span>
</span>
</mat-list-item>
</mat-nav-list>
<mat-list-item routerLink="/calendars" matTooltip="Gestionar calendarios de remotePC" matTooltipShowDelay="1000">
<mat-list-item routerLink="/calendars" matTooltip="{{ 'TOOLTIP_CALENDARS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">calendar_month</mat-icon>
<span i18n="@@calendars">Calendarios</span>
<span>{{ 'calendars' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item (click)="toggleSoftwareSub()" matTooltip="Administrar configuraciones de software" matTooltipShowDelay="1000">
<mat-list-item (click)="toggleSoftwareSub()" matTooltip="{{ 'TOOLTIP_SOFTWARE' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">terminal</mat-icon>
<span i18n="@@images">Software</span>
<span>{{ 'software' | translate }}</span>
</span>
</mat-list-item>
<!-- Submenu items ogdhcp -->
<!-- Submenu items for Software -->
<mat-nav-list *ngIf="showSoftwareSub" style="padding-left: 20px;">
<mat-list-item routerLink="/software" matTooltip="Ver lista de software disponible" matTooltipShowDelay="1000">
<mat-list-item routerLink="/software" matTooltip="{{ 'TOOLTIP_SOFTWARE_LIST' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">list</mat-icon>
<span i18n="@@gallery">Listado</span>
<span>{{ 'softwareList' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/software-profiles" matTooltip="Gestionar perfiles de software" matTooltipShowDelay="1000">
<mat-list-item routerLink="/software-profiles" matTooltip="{{ 'TOOLTIP_SOFTWARE_PROFILES' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">folder_shared</mat-icon>
<span i18n="@@gallery">Perfiles</span>
<span>{{ 'softwareProfiles' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/operative-systems" matTooltip="Configurar sistemas operativos" matTooltipShowDelay="1000">
<mat-list-item routerLink="/operative-systems" matTooltip="{{ 'TOOLTIP_OPERATIVE_SYSTEMS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">terminal</mat-icon>
<span i18n="@@gallery">S. Operativos</span>
<span>{{ 'operativeSystems' | translate }}</span>
</span>
</mat-list-item>
</mat-nav-list>
<mat-list-item routerLink="/images" matTooltip="Gestionar imágenes del sistema" matTooltipShowDelay="1000">
<mat-list-item routerLink="/images" matTooltip="{{ 'TOOLTIP_IMAGES' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">photo</mat-icon>
<span i18n="@@images">Imágenes</span>
<span>{{ 'images' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item routerLink="/repositories" matTooltip="Ver y gestionar repositorios de software" matTooltipShowDelay="1000">
<mat-list-item routerLink="/repositories" matTooltip="{{ 'TOOLTIP_REPOSITORIES' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">warehouse</mat-icon>
<span i18n="@@repositories">Repositorios</span>
<span>{{ 'repositories' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item class="disabled" matTooltip="Gestión de menús (opción deshabilitada)" matTooltipShowDelay="1000">
<mat-list-item class="disabled" matTooltip="{{ 'TOOLTIP_MENUS' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">list</mat-icon>
<span i18n="@@menus">Menús</span>
<span>{{ 'menus' | translate }}</span>
</span>
</mat-list-item>
<mat-list-item class="disabled" matTooltip="Función de búsqueda (opción deshabilitada)" matTooltipShowDelay="1000">
<mat-list-item class="disabled" matTooltip="{{ 'TOOLTIP_SEARCH' | translate }}" matTooltipShowDelay="1000">
<span class="entry">
<mat-icon class="icon">search</mat-icon>
<span i18n="@@search">Buscar</span>
<span>{{ 'search' | translate }}</span>
</span>
</mat-list-item>
</mat-nav-list>

View File

@ -375,5 +375,48 @@
"selectUnitDescription": "Select the organizational unit to which the clients belong.",
"selectClassDescription": "Select the classroom to which the clients belong.",
"applyToAllDescription": "Select a template to apply to all clients.",
"saveButtonDescription": "Save the changes made."
"saveButtonDescription": "Save the changes made.",
"welcomeUser": "Welcome {{username}}",
"TOOLTIP_WELCOME_USER": "Welcome, {{username}}",
"groups": "Groups",
"TOOLTIP_GROUPS": "Manage user groups",
"actions": "Actions",
"TOOLTIP_ACTIONS": "View and execute predefined actions",
"commands": "Commands",
"TOOLTIP_COMMANDS": "List of available commands",
"commandGroups": "Groups",
"TOOLTIP_COMMAND_GROUPS": "Manage command groups",
"tasks": "Tasks",
"TOOLTIP_TASKS": "View and manage scheduled tasks",
"dhcp": "DHCP",
"TOOLTIP_DHCP": "Configure and manage DHCP",
"TOOLTIP_DHCP_STATUS": "Current status of the DHCP service",
"subnets": "Subnets",
"TOOLTIP_SUBNETS": "Manage and create subnets",
"boot": "Boot",
"TOOLTIP_BOOT": "Configure and manage boot options",
"ogLive": "ogLive",
"TOOLTIP_PXE_IMAGES": "View available PXE boot images",
"pxeTemplates": "PXE Templates",
"TOOLTIP_PXE_TEMPLATES": "Manage PXE boot templates",
"pxeBootFiles": "PXE Boot Files",
"TOOLTIP_PXE_BOOT_FILES": "Configure PXE boot files",
"calendars": "Calendars",
"TOOLTIP_CALENDARS": "Manage remotePC calendars",
"software": "Software",
"TOOLTIP_SOFTWARE": "Manage software configurations",
"softwareList": "List",
"TOOLTIP_SOFTWARE_LIST": "View list of available software",
"softwareProfiles": "Profiles",
"TOOLTIP_SOFTWARE_PROFILES": "Manage software profiles",
"operativeSystems": "Operating Systems",
"TOOLTIP_OPERATIVE_SYSTEMS": "Configure operating systems",
"images": "Images",
"TOOLTIP_IMAGES": "Manage system images",
"repositories": "Repositories",
"TOOLTIP_REPOSITORIES": "View and manage software repositories",
"menus": "Menus",
"TOOLTIP_MENUS": "Menu management (option disabled)",
"search": "Search",
"TOOLTIP_SEARCH": "Search function (option disabled)"
}

View File

@ -376,5 +376,48 @@
"selectUnitDescription": "Selecciona la unidad organizativa a la que pertenecen los clientes.",
"selectClassDescription": "Selecciona el aula a la que pertenecen los clientes.",
"applyToAllDescription": "Selecciona una plantilla para aplicar a todos los clientes.",
"saveButtonDescription": "Guarda los cambios realizados."
"saveButtonDescription": "Guarda los cambios realizados.",
"welcomeUser": "Bienvenido {{username}}",
"TOOLTIP_WELCOME_USER": "Bienvenido, {{username}}",
"groups": "Grupos",
"TOOLTIP_GROUPS": "Gestionar grupos de usuarios",
"actions": "Acciones",
"TOOLTIP_ACTIONS": "Ver y ejecutar acciones predefinidas",
"commands": "Comandos",
"TOOLTIP_COMMANDS": "Lista de comandos disponibles",
"commandGroups": "Grupos",
"TOOLTIP_COMMAND_GROUPS": "Gestionar grupos de comandos",
"tasks": "Tareas",
"TOOLTIP_TASKS": "Ver y gestionar tareas programadas",
"dhcp": "DHCP",
"TOOLTIP_DHCP": "Configurar y administrar DHCP",
"TOOLTIP_DHCP_STATUS": "Estado actual del servicio DHCP",
"subnets": "Subredes",
"TOOLTIP_SUBNETS": "Gestionar y crear subredes",
"boot": "Boot",
"TOOLTIP_BOOT": "Configurar y administrar opciones de arranque",
"ogLive": "ogLive",
"TOOLTIP_PXE_IMAGES": "Ver imágenes disponibles para arranque PXE",
"pxeTemplates": "Plantillas PXE",
"TOOLTIP_PXE_TEMPLATES": "Gestionar plantillas de arranque PXE",
"pxeBootFiles": "Arranque PXE",
"TOOLTIP_PXE_BOOT_FILES": "Configurar archivos de arranque PXE",
"calendars": "Calendarios",
"TOOLTIP_CALENDARS": "Gestionar calendarios de remotePC",
"software": "Software",
"TOOLTIP_SOFTWARE": "Administrar configuraciones de software",
"softwareList": "Listado",
"TOOLTIP_SOFTWARE_LIST": "Ver lista de software disponible",
"softwareProfiles": "Perfiles",
"TOOLTIP_SOFTWARE_PROFILES": "Gestionar perfiles de software",
"operativeSystems": "S. Operativos",
"TOOLTIP_OPERATIVE_SYSTEMS": "Configurar sistemas operativos",
"images": "Imágenes",
"TOOLTIP_IMAGES": "Gestionar imágenes del sistema",
"repositories": "Repositorios",
"TOOLTIP_REPOSITORIES": "Ver y gestionar repositorios de software",
"menus": "Menús",
"TOOLTIP_MENUS": "Gestión de menús (opción deshabilitada)",
"search": "Buscar",
"TOOLTIP_SEARCH": "Función de búsqueda (opción deshabilitada)"
}

View File

@ -1,46 +1,535 @@
<?xml version="1.0"?>
<testsuite name="Chrome Headless 130.0.0.0 (Linux x86_64)" package="" timestamp="2024-10-29T10:46:18" id="0" hostname="alvaro-Latitude-3420" tests="31" errors="0" failures="0" time="0.938">
<testsuite name="Chrome Headless 131.0.0.0 (Linux x86_64)" package="" timestamp="2024-11-19T13:35:34" id="0" hostname="alvaro-Latitude-3420" tests="38" errors="0" failures="32" time="0.486">
<properties>
<property name="browser.fullName" value="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/130.0.0.0 Safari/537.36"/>
<property name="browser.fullName" value="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/131.0.0.0 Safari/537.36"/>
</properties>
<testcase name="CreateSoftwareComponent should create" time="0.127" classname="CreateSoftwareComponent"/>
<testcase name="UsersComponent should create" time="0.039" classname="UsersComponent"/>
<testcase name="CommandsComponent should create" time="0.054" classname="CommandsComponent"/>
<testcase name="AppComponent should create the app" time="0.004" classname="AppComponent"/>
<testcase name="AddClientsToPxeComponent should create" time="0.031" classname="AddClientsToPxeComponent"/>
<testcase name="CreateCommandComponent should create" time="0.029" classname="CreateCommandComponent"/>
<testcase name="OgbootStatusComponent should create the component" time="0.03" classname="OgbootStatusComponent"/>
<testcase name="ServerInfoDialogComponent should create" time="0.016" classname="ServerInfoDialogComponent"/>
<testcase name="AdminComponent debería crear el componente" time="0.015" classname="AdminComponent"/>
<testcase name="AdminComponent el segundo botón debería tener el texto &quot;Roles&quot;" time="0.008" classname="AdminComponent"/>
<testcase name="AdminComponent el primer botón debería tener el texto &quot;Usuarios&quot;" time="0.006" classname="AdminComponent"/>
<testcase name="AdminComponent debería contener dos botones" time="0.005" classname="AdminComponent"/>
<testcase name="AdminComponent el segundo botón debería tener el routerLink correcto" time="0.007" classname="AdminComponent"/>
<testcase name="AdminComponent el primer botón debería tener el routerLink correcto" time="0.005" classname="AdminComponent"/>
<testcase name="DashboardComponent should create the component" time="0.004" classname="DashboardComponent"/>
<testcase name="PXEimagesComponent should create" time="0.071" classname="PXEimagesComponent"/>
<testcase name="CalendarComponent should create" time="0.033" classname="CalendarComponent"/>
<testcase name="OgDhcpSubnetsComponent should create" time="0.054" classname="OgDhcpSubnetsComponent"/>
<testcase name="OgdhcpComponent should create" time="0.005" classname="OgdhcpComponent"/>
<testcase name="StatusComponent should create" time="0.017" classname="StatusComponent"/>
<testcase name="CreateOperativeSystemComponent should create" time="0.015" classname="CreateOperativeSystemComponent"/>
<testcase name="LoginComponent should create" time="0.027" classname="LoginComponent"/>
<testcase name="SoftwareComponent should create" time="0.04" classname="SoftwareComponent"/>
<testcase name="OperativeSystemComponent should create" time="0.032" classname="OperativeSystemComponent"/>
<testcase name="CreateSoftwareProfileComponent should create" time="0.105" classname="CreateSoftwareProfileComponent"/>
<testcase name="SoftwareProfileComponent should create" time="0.031" classname="SoftwareProfileComponent"/>
<testcase name="ClientsComponent should create" time="0.014" classname="ClientsComponent"/>
<testcase name="PxeComponent should create the component" time="0.034" classname="PxeComponent"/>
<testcase name="PxeBootFilesComponent should create" time="0.036" classname="PxeBootFilesComponent"/>
<testcase name="RolesComponent should create" time="0.015" classname="RolesComponent"/>
<testcase name="CommandsTaskComponent should create" time="0.029" classname="CommandsTaskComponent"/>
<testcase name="CreateOperativeSystemComponent should create" time="0.071" classname="CreateOperativeSystemComponent"/>
<testcase name="AddClientsToPxeComponent should create" time="0.016" classname="AddClientsToPxeComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'AddClientsToPxeComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at AddClientsToPxeComponent_Template (ng:///AddClientsToPxeComponent.js:70:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="ClientsComponent should create" time="0.011" classname="ClientsComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'ClientsComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at ClientsComponent_Template (ng:///ClientsComponent.js:77:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="SoftwareComponent should create" time="0.019" classname="SoftwareComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.SoftwareComponent_Factory [as factory] (ng:///SoftwareComponent/ɵfac.js:6:52)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="OgDhcpSubnetsComponent should create" time="0.02" classname="OgDhcpSubnetsComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.OgDhcpSubnetsComponent_Factory [as factory] (ng:///OgDhcpSubnetsComponent/ɵfac.js:6:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="CreateCommandComponent should create" time="0.012" classname="CreateCommandComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'CreateCommandComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at CreateCommandComponent_Template (ng:///CreateCommandComponent.js:15:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="RepositoriesComponent should create" time="0.012" classname="RepositoriesComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[HttpClient -&gt; HttpClient]:
NullInjectorError: No provider for HttpClient!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'HttpClient', 'HttpClient' ] })
NullInjectorError: NullInjectorError: No provider for HttpClient!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.RepositoriesComponent_Factory [as factory] (ng:///RepositoriesComponent/ɵfac.js:5:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="PXEimagesComponent should create" time="0.024" classname="PXEimagesComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.PXEimagesComponent_Factory [as factory] (ng:///PXEimagesComponent/ɵfac.js:6:52)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="ExecuteCommandComponent should create" time="0.008" classname="ExecuteCommandComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[MatDialogRef -&gt; MatDialogRef]:
NullInjectorError: No provider for MatDialogRef!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'MatDialogRef', 'MatDialogRef' ] })
NullInjectorError: NullInjectorError: No provider for MatDialogRef!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.ExecuteCommandComponent_Factory [as factory] (ng:///ExecuteCommandComponent/ɵfac.js:4:51)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="OperativeSystemComponent should create" time="0.012" classname="OperativeSystemComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.OperativeSystemComponent_Factory [as factory] (ng:///OperativeSystemComponent/ɵfac.js:6:52)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="PxeBootFilesComponent should create" time="0.015" classname="PxeBootFilesComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.PxeBootFilesComponent_Factory [as factory] (ng:///PxeBootFilesComponent/ɵfac.js:6:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="ServerInfoDialogComponent should create" time="0.008" classname="ServerInfoDialogComponent"/>
<testcase name="EnvVarsComponent should create" time="0.005" classname="EnvVarsComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[HttpClient -&gt; HttpClient]:
NullInjectorError: No provider for HttpClient!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'HttpClient', 'HttpClient' ] })
NullInjectorError: NullInjectorError: No provider for HttpClient!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.EnvVarsComponent_Factory [as factory] (ng:///EnvVarsComponent/ɵfac.js:4:44)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="StatusComponent should create" time="0.013" classname="StatusComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.StatusComponent_Factory [as factory] (ng:///StatusComponent/ɵfac.js:5:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="SoftwareProfileComponent should create" time="0.011" classname="SoftwareProfileComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.SoftwareProfileComponent_Factory [as factory] (ng:///SoftwareProfileComponent/ɵfac.js:6:52)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="CalendarComponent should create" time="0.013" classname="CalendarComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.CalendarComponent_Factory [as factory] (ng:///CalendarComponent/ɵfac.js:6:52)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="AdminComponent el primer botón debería tener el routerLink correcto" time="0.008" classname="AdminComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'AdminComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at AdminComponent_Template (ng:///AdminComponent.js:13:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="AdminComponent el segundo botón debería tener el routerLink correcto" time="0.003" classname="AdminComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'AdminComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at AdminComponent_Template (ng:///AdminComponent.js:13:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="AdminComponent debería contener dos botones" time="0.002" classname="AdminComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'AdminComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at AdminComponent_Template (ng:///AdminComponent.js:13:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="AdminComponent debería crear el componente" time="0.002" classname="AdminComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'AdminComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at AdminComponent_Template (ng:///AdminComponent.js:13:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="AdminComponent el segundo botón debería tener el texto &quot;Roles&quot;" time="0.002" classname="AdminComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'AdminComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at AdminComponent_Template (ng:///AdminComponent.js:13:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="AdminComponent el primer botón debería tener el texto &quot;Usuarios&quot;" time="0.002" classname="AdminComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'AdminComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at AdminComponent_Template (ng:///AdminComponent.js:13:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="AppComponent should create the app" time="0.002" classname="AppComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[TranslateService -&gt; TranslateStore -&gt; TranslateStore]:
NullInjectorError: No provider for TranslateStore!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'TranslateService', 'TranslateStore', 'TranslateStore' ] })
NullInjectorError: NullInjectorError: No provider for TranslateStore!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at injectInjectorOnly (http://localhost:9876/_karma_webpack_/vendor.js:76056:36)
at Module.ɵɵinject (http://localhost:9876/_karma_webpack_/vendor.js:76062:59)
at Object.TranslateService_Factory [as factory] (http://localhost:9876/_karma_webpack_/vendor.js:163478:94)
at http://localhost:9876/_karma_webpack_/vendor.js:78093:35
at runInInjectorProfilerContext (http://localhost:9876/_karma_webpack_/vendor.js:75827:5)
at R3Injector.hydrate (http://localhost:9876/_karma_webpack_/vendor.js:78092:11)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77966:23)
</failure>
</testcase>
<testcase name="UsersComponent should create" time="0.008" classname="UsersComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'UsersComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at UsersComponent_Template (ng:///UsersComponent.js:133:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="PxeComponent should create the component" time="0.019" classname="PxeComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.PxeComponent_Factory [as factory] (ng:///PxeComponent/ɵfac.js:6:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="DeployImageComponent should create" time="0.017" classname="DeployImageComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[HttpClient -&gt; HttpClient]:
NullInjectorError: No provider for HttpClient!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'HttpClient', 'HttpClient' ] })
NullInjectorError: NullInjectorError: No provider for HttpClient!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.DeployImageComponent_Factory [as factory] (ng:///DeployImageComponent/ɵfac.js:4:48)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="OgdhcpComponent should create" time="0.003" classname="OgdhcpComponent"/>
<testcase name="CreateSoftwareProfileComponent should create" time="0.054" classname="CreateSoftwareProfileComponent"/>
<testcase name="OgbootStatusComponent should create the component" time="0.013" classname="OgbootStatusComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.OgbootStatusComponent_Factory [as factory] (ng:///OgbootStatusComponent/ɵfac.js:5:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="LoginComponent should create" time="0.009" classname="LoginComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[TranslateService -&gt; TranslateStore -&gt; TranslateStore]:
NullInjectorError: No provider for TranslateStore!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'TranslateService', 'TranslateStore', 'TranslateStore' ] })
NullInjectorError: NullInjectorError: No provider for TranslateStore!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at injectInjectorOnly (http://localhost:9876/_karma_webpack_/vendor.js:76056:36)
at Module.ɵɵinject (http://localhost:9876/_karma_webpack_/vendor.js:76062:59)
at Object.TranslateService_Factory [as factory] (http://localhost:9876/_karma_webpack_/vendor.js:163478:94)
at http://localhost:9876/_karma_webpack_/vendor.js:78093:35
at runInInjectorProfilerContext (http://localhost:9876/_karma_webpack_/vendor.js:75827:5)
at R3Injector.hydrate (http://localhost:9876/_karma_webpack_/vendor.js:78092:11)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77966:23)
</failure>
</testcase>
<testcase name="RolesComponent should create" time="0.009" classname="RolesComponent">
<failure type="">Error: NG0302: The pipe 'translate' could not be found in the 'RolesComponent' component. Verify that it is declared or imported in this module. Find more at https://angular.dev/errors/NG0302
error properties: Object({ code: -302 })
at getPipeDef (http://localhost:9876/_karma_webpack_/vendor.js:103465:11)
at ɵɵpipe (http://localhost:9876/_karma_webpack_/vendor.js:103408:15)
at RolesComponent_Template (ng:///RolesComponent.js:138:9)
at executeTemplate (http://localhost:9876/_karma_webpack_/vendor.js:86203:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87365:7)
at renderComponent (http://localhost:9876/_karma_webpack_/vendor.js:87311:3)
at renderChildComponents (http://localhost:9876/_karma_webpack_/vendor.js:87411:5)
at renderView (http://localhost:9876/_karma_webpack_/vendor.js:87393:7)
at ComponentFactory.create (http://localhost:9876/_karma_webpack_/vendor.js:91476:9)
at initComponent (http://localhost:9876/_karma_webpack_/vendor.js:116898:45)
</failure>
</testcase>
<testcase name="CreateSoftwareComponent should create" time="0.017" classname="CreateSoftwareComponent"/>
<testcase name="CommandsComponent should create" time="0.012" classname="CommandsComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.CommandsComponent_Factory [as factory] (ng:///CommandsComponent/ɵfac.js:6:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="CreateRepositoryComponent should create" time="0.005" classname="CreateRepositoryComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[HttpClient -&gt; HttpClient]:
NullInjectorError: No provider for HttpClient!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'HttpClient', 'HttpClient' ] })
NullInjectorError: NullInjectorError: No provider for HttpClient!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.CreateRepositoryComponent_Factory [as factory] (ng:///CreateRepositoryComponent/ɵfac.js:5:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="DashboardComponent should create the component" time="0.003" classname="DashboardComponent"/>
<testcase name="CommandsTaskComponent should create" time="0.011" classname="CommandsTaskComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[JoyrideService -&gt; JoyrideService]:
NullInjectorError: No provider for JoyrideService!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'JoyrideService', 'JoyrideService' ] })
NullInjectorError: NullInjectorError: No provider for JoyrideService!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.CommandsTaskComponent_Factory [as factory] (ng:///CommandsTaskComponent/ɵfac.js:6:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<testcase name="CreateImageComponent should create" time="0.001" classname="CreateImageComponent">
<failure type="">Error: Unexpected "CreateImageComponent" found in the "declarations" array of the "TestBed.configureTestingModule" call, "CreateImageComponent" is marked as standalone and can't be declared in any NgModule - did you intend to import it instead (by adding it to the "imports" array)?
at http://localhost:9876/_karma_webpack_/vendor.js:115668:15
at Array.forEach (&lt;anonymous&gt;)
at assertNoStandaloneComponents (http://localhost:9876/_karma_webpack_/vendor.js:115664:9)
at TestBedCompiler.configureTestingModule (http://localhost:9876/_karma_webpack_/vendor.js:115738:7)
at TestBedImpl.configureTestingModule (http://localhost:9876/_karma_webpack_/vendor.js:116819:19)
at TestBedImpl.configureTestingModule (http://localhost:9876/_karma_webpack_/vendor.js:116648:33)
at UserContext.&lt;anonymous&gt; (http://localhost:9876/_karma_webpack_/main.js:3164:70)
at Generator.next (&lt;anonymous&gt;)
at asyncGeneratorStep (http://localhost:9876/_karma_webpack_/vendor.js:203145:17)
at _next (http://localhost:9876/_karma_webpack_/vendor.js:203159:9)
</failure>
</testcase>
<testcase name="MainRepositoryViewComponent should create" time="0.014" classname="MainRepositoryViewComponent">
<failure type="">NullInjectorError: R3InjectorError(DynamicTestModule)[HttpClient -&gt; HttpClient]:
NullInjectorError: No provider for HttpClient!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'HttpClient', 'HttpClient' ] })
NullInjectorError: NullInjectorError: No provider for HttpClient!
at NullInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:76593:21)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at R3Injector.get (http://localhost:9876/_karma_webpack_/vendor.js:77975:27)
at ChainedInjector.get (http://localhost:9876/_karma_webpack_/vendor.js:80243:32)
at lookupTokenUsingModuleInjector (http://localhost:9876/_karma_webpack_/vendor.js:80586:31)
at getOrCreateInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80632:10)
at ɵɵdirectiveInject (http://localhost:9876/_karma_webpack_/vendor.js:85998:17)
at NodeInjectorFactory.MainRepositoryViewComponent_Factory [as factory] (ng:///MainRepositoryViewComponent/ɵfac.js:5:7)
at getNodeInjectable (http://localhost:9876/_karma_webpack_/vendor.js:80826:38)
at createRootComponent (http://localhost:9876/_karma_webpack_/vendor.js:91610:31)
</failure>
</testcase>
<system-out>
<![CDATA[Chrome Headless 130.0.0.0 (Linux x86_64) LOG: 'Selected subnet UUID:', Object{}
,Chrome Headless 130.0.0.0 (Linux x86_64) ERROR: 'Error fetching images', HttpErrorResponse{headers: HttpHeaders{normalizedNames: Map{}, lazyUpdate: null, headers: Map{}}, status: 0, statusText: 'Unknown Error', url: 'https://127.0.0.1:8443/og-lives?page=1&itemsPerPage=1000', ok: false, name: 'HttpErrorResponse', message: 'Http failure response for https://127.0.0.1:8443/og-lives?page=1&itemsPerPage=1000: 0 Unknown Error', error: ProgressEvent{isTrusted: true}}
,Chrome Headless 130.0.0.0 (Linux x86_64) ERROR: 'Error fetching og lives', HttpErrorResponse{headers: HttpHeaders{normalizedNames: Map{}, lazyUpdate: null, headers: Map{}}, status: 0, statusText: 'Unknown Error', url: 'https://127.0.0.1:8443/og-lives?page=1&itemsPerPage=1000', ok: false, name: 'HttpErrorResponse', message: 'Http failure response for https://127.0.0.1:8443/og-lives?page=1&itemsPerPage=1000: 0 Unknown Error', error: ProgressEvent{isTrusted: true}}
,Chrome Headless 130.0.0.0 (Linux x86_64) LOG: Object{}
,Chrome Headless 130.0.0.0 (Linux x86_64) LOG: Object{}
<![CDATA[
]]>
</system-out>
<system-err/>