Merge pull request #21 from Slasherss1/1.1.1

v1.1.1
This commit is contained in:
2025-06-06 10:08:21 +02:00
committed by GitHub
44 changed files with 639 additions and 86 deletions

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{ {
"name": "ipwa", "name": "ipwa",
"version": "1.1.0", "version": "1.1.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "ipwa", "name": "ipwa",
"version": "1.1.0", "version": "1.1.1",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",

View File

@@ -11,21 +11,35 @@ import { of } from 'rxjs';
import { MatTableModule } from '@angular/material/table'; import { MatTableModule } from '@angular/material/table';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
describe('AccountMgmtComponent', () => { describe('AccountMgmtComponent', () => {
let component: AccountMgmtComponent; let component: AccountMgmtComponent;
let fixture: ComponentFixture<AccountMgmtComponent>; let fixture: ComponentFixture<AccountMgmtComponent>;
let acMock
beforeEach(async () => { beforeEach(async () => {
const acMock = jasmine.createSpyObj("AdminCommService", { acMock = {
getAccs: of() accs: {
}) getAccs: jasmine.createSpy("getAccs").and.returnValue(of())
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [AccountMgmtComponent], declarations: [AccountMgmtComponent],
providers: [ providers: [
{provide: AdminCommService, useValue: acMock} {provide: AdminCommService, useValue: acMock}
], ],
imports: [MatDialogModule, MatSnackBarModule, MatFormFieldModule, MatIconModule, MatPaginatorModule, MatTableModule, MatInputModule, BrowserAnimationsModule] imports: [
MatDialogModule,
MatSnackBarModule,
MatFormFieldModule,
MatIconModule,
MatPaginatorModule,
MatTableModule,
MatInputModule,
BrowserAnimationsModule,
MatProgressSpinnerModule
]
}).compileComponents(); }).compileComponents();
fixture = TestBed.createComponent(AccountMgmtComponent); fixture = TestBed.createComponent(AccountMgmtComponent);
component = fixture.componentInstance; component = fixture.componentInstance;

View File

@@ -3,21 +3,36 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { UserEditComponent } from './user-edit.component'; import { UserEditComponent } from './user-edit.component';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { ReactiveFormsModule } from '@angular/forms'; import { NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { AdminCommService } from '../../admin-comm.service';
import { forwardRef } from '@angular/core';
import { MatSelectModule } from '@angular/material/select';
describe('UserEditComponent', () => { describe('UserEditComponent', () => {
let component: UserEditComponent; let component: UserEditComponent;
let fixture: ComponentFixture<UserEditComponent>; let fixture: ComponentFixture<UserEditComponent>;
let acMock
beforeEach(async () => { beforeEach(async () => {
acMock = {
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [UserEditComponent], declarations: [UserEditComponent],
imports: [MatDialogModule, MatFormFieldModule, ReactiveFormsModule, MatInputModule, BrowserAnimationsModule], imports: [
MatDialogModule,
MatFormFieldModule,
ReactiveFormsModule,
MatInputModule,
NoopAnimationsModule,
MatSelectModule
],
providers: [ providers: [
{provide: MatDialogRef, useValue: {}}, { provide: MatDialogRef, useValue: {} },
{provide: MAT_DIALOG_DATA, useValue: {}} { provide: MAT_DIALOG_DATA, useValue: { groups: [] } },
{ provide: AdminCommService, useValue: acMock },
] ]
}).compileComponents(); }).compileComponents();
fixture = TestBed.createComponent(UserEditComponent); fixture = TestBed.createComponent(UserEditComponent);

View File

@@ -1,6 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { UserResetComponent } from './user-reset.component'; import { UserResetComponent } from './user-reset.component';
import { MatDialogModule } from '@angular/material/dialog';
describe('UserResetComponent', () => { describe('UserResetComponent', () => {
let component: UserResetComponent; let component: UserResetComponent;
@@ -8,7 +9,10 @@ describe('UserResetComponent', () => {
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [UserResetComponent] declarations: [UserResetComponent],
imports: [
MatDialogModule
]
}); });
fixture = TestBed.createComponent(UserResetComponent); fixture = TestBed.createComponent(UserResetComponent);
component = fixture.componentInstance; component = fixture.componentInstance;

View File

@@ -8,6 +8,10 @@
<a matListItemTitle>{{link.title}}</a> <a matListItemTitle>{{link.title}}</a>
</mat-list-item> </mat-list-item>
} }
<a mat-list-item href="https://foliand.men/wiki/!ipwa/" target="_blank">
<mat-icon matListItemIcon>developer_guide</mat-icon>
<a matListItemTitle>Dokumentacja</a>
</a>
<mat-list-item (click)="goNormal()"> <mat-list-item (click)="goNormal()">
<mat-icon matListItemIcon>close</mat-icon> <mat-icon matListItemIcon>close</mat-icon>
<h4 matListItemTitle>Zakończ edycję</h4> <h4 matListItemTitle>Zakończ edycję</h4>

View File

@@ -3,10 +3,16 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AdminViewComponent } from './admin-view.component'; import { AdminViewComponent } from './admin-view.component';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatSidenavModule } from '@angular/material/sidenav'; import { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatListModule } from '@angular/material/list'; import { MatListModule } from '@angular/material/list';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { Component, Input } from '@angular/core';
@Component({selector: "app-toolbar", template: ''})
class ToolbarMock {
@Input() drawer!: MatDrawer;
}
describe('AdminViewComponent', () => { describe('AdminViewComponent', () => {
let component: AdminViewComponent; let component: AdminViewComponent;
@@ -14,7 +20,7 @@ describe('AdminViewComponent', () => {
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [AdminViewComponent], declarations: [AdminViewComponent, ToolbarMock],
imports: [MatToolbarModule, MatIconModule, MatSidenavModule, BrowserAnimationsModule, MatListModule, RouterModule.forRoot([])] imports: [MatToolbarModule, MatIconModule, MatSidenavModule, BrowserAnimationsModule, MatListModule, RouterModule.forRoot([])]
}); });
fixture = TestBed.createComponent(AdminViewComponent); fixture = TestBed.createComponent(AdminViewComponent);

View File

@@ -19,7 +19,6 @@ export class AdminViewComponent {
{ title: "Czystość", icon: "cleaning_services", href: "grades", enabled: this.ls.permChecker(128) && this.ls.capCheck(16) }, { title: "Czystość", icon: "cleaning_services", href: "grades", enabled: this.ls.permChecker(128) && this.ls.capCheck(16) },
{ title: "Frekwencja", icon: "checklist", href: "attendence", enabled: false }, { title: "Frekwencja", icon: "checklist", href: "attendence", enabled: false },
{ title: "Ustawienia", icon: "settings_applications", href: "settings", enabled: this.ls.permChecker(32) }, { title: "Ustawienia", icon: "settings_applications", href: "settings", enabled: this.ls.permChecker(32) },
{ title: "Instrukcje", icon: "description", href: "guide", enabled: true }
]; ];
public get LINKS(): Link[] { public get LINKS(): Link[] {
return this._LINKS.filter(v => v.enabled); return this._LINKS.filter(v => v.enabled);

View File

@@ -1,14 +1,33 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AttendenceSummaryComponent } from './attendence-summary.component'; import { AttendenceSummaryComponent } from './attendence-summary.component';
import { RouterModule } from '@angular/router';
import { AdminCommService } from '../../admin-comm.service';
import { of } from 'rxjs';
import { MatTableModule } from '@angular/material/table';
describe('AttendenceSummaryComponent', () => { describe('AttendenceSummaryComponent', () => {
let component: AttendenceSummaryComponent; let component: AttendenceSummaryComponent;
let fixture: ComponentFixture<AttendenceSummaryComponent>; let fixture: ComponentFixture<AttendenceSummaryComponent>;
let acMock
beforeEach(async () => { beforeEach(async () => {
acMock = {
clean: {
attendence: {
getSummary: jasmine.createSpy("getSummary").and.returnValue(of())
}
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [AttendenceSummaryComponent] declarations: [AttendenceSummaryComponent],
imports: [
RouterModule.forRoot([]),
MatTableModule
],
providers: [
{provide: AdminCommService, useValue: acMock}
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,14 +1,41 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AttendenceComponent } from './attendence.component'; import { AttendenceComponent } from './attendence.component';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { AdminCommService } from '../../admin-comm.service';
import { MatFormFieldModule } from '@angular/material/form-field';
import { of } from 'rxjs';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
describe('AttendenceComponent', () => { describe('AttendenceComponent', () => {
let component: AttendenceComponent; let component: AttendenceComponent;
let fixture: ComponentFixture<AttendenceComponent>; let fixture: ComponentFixture<AttendenceComponent>;
beforeEach(async () => { beforeEach(async () => {
const acMock = {
clean: {
attendence: {
getUsers: jasmine.createSpy("getUsers").and.returnValue(of())
}
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [AttendenceComponent] declarations: [AttendenceComponent],
providers: [
{provide: MAT_DIALOG_DATA, useValue: {}},
{provide: MatDialogRef, useValue: {}},
{provide: AdminCommService, useValue: acMock}
],
imports: [
MatDialogModule,
MatFormFieldModule,
FormsModule,
ReactiveFormsModule,
MatInputModule,
NoopAnimationsModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,14 +1,55 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { GradesComponent } from './grades.component'; import { GradesComponent } from './grades.component';
import { AdminCommService } from '../admin-comm.service';
import { RouterModule } from '@angular/router';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as moment from 'moment';
import { MatIconModule } from '@angular/material/icon';
import { MatFormFieldModule } from '@angular/material/form-field';
import { of } from 'rxjs';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
@Component({selector: "app-date-selector", template: ''})
class DateSelectorStub {
@Input() date: moment.Moment = moment.utc().startOf('day');
@Output() dateChange = new EventEmitter<moment.Moment>();
@Input() filter: (date: moment.Moment | null) => boolean = () => true
}
@Component({selector: "app-room-chooser", template: ''})
class RoomSelectorStub {
@Input() rooms: string[] = []
@Output() room: EventEmitter<string> = new EventEmitter<string>();
}
describe('GradesComponent', () => { describe('GradesComponent', () => {
let component: GradesComponent; let component: GradesComponent;
let fixture: ComponentFixture<GradesComponent>; let fixture: ComponentFixture<GradesComponent>;
let acMock
beforeEach(async () => { beforeEach(async () => {
acMock = {
clean: {
getConfig: jasmine.createSpy("getConfig").and.returnValue(of())
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [GradesComponent] declarations: [GradesComponent, DateSelectorStub, RoomSelectorStub],
providers: [
{provide: AdminCommService, useValue: acMock}
],
imports: [
RouterModule.forRoot([]),
MatIconModule,
MatFormFieldModule,
FormsModule,
ReactiveFormsModule,
MatInputModule,
NoopAnimationsModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,17 +1,52 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SummaryComponent } from './summary.component'; import { SummaryComponent } from './summary.component';
import { RouterModule } from '@angular/router';
import { AdminCommService } from '../../admin-comm.service';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MAT_MOMENT_DATE_ADAPTER_OPTIONS, MAT_MOMENT_DATE_FORMATS, MomentDateAdapter, provideMomentDateAdapter } from '@angular/material-moment-adapter';
import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';
import { MatIconModule } from '@angular/material/icon';
import { of } from 'rxjs';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatTableModule } from '@angular/material/table';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
describe('SummaryComponent', () => { describe('SummaryComponent', () => {
let component: SummaryComponent; let component: SummaryComponent;
let fixture: ComponentFixture<SummaryComponent>; let fixture: ComponentFixture<SummaryComponent>;
beforeEach(async () => { beforeEach(async () => {
const acMock = {
clean: {
summary: {
getSummary: jasmine.createSpy("getSummary").and.returnValue(of())
}
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [SummaryComponent] declarations: [SummaryComponent],
providers: [
{ provide: AdminCommService, useValue: acMock },
{ provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE, MAT_DATE_FORMATS, MAT_MOMENT_DATE_ADAPTER_OPTIONS] },
{ provide: MAT_DATE_LOCALE, useValue: "pl-PL" },
{ provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS },
{ provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS, useValue: { useUtc: true } },
],
imports: [
RouterModule.forRoot([]),
MatFormFieldModule,
MatDatepickerModule,
MatIconModule,
FormsModule,
ReactiveFormsModule,
MatTableModule,
NoopAnimationsModule
]
}) })
.compileComponents(); .compileComponents();
fixture = TestBed.createComponent(SummaryComponent); fixture = TestBed.createComponent(SummaryComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();

View File

@@ -1,14 +1,24 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { GroupsComponent } from './groups.component'; import { GroupsComponent } from './groups.component';
import { AdminCommService } from '../admin-comm.service';
import { of } from 'rxjs';
describe('GroupsComponent', () => { describe('GroupsComponent', () => {
let component: GroupsComponent; let component: GroupsComponent;
let fixture: ComponentFixture<GroupsComponent>; let fixture: ComponentFixture<GroupsComponent>;
beforeEach(() => { beforeEach(() => {
const acMock = {
groups: {
getGroups: jasmine.createSpy("getGroups").and.returnValue(of())
}
}
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [GroupsComponent] declarations: [GroupsComponent],
providers: [
{provide: AdminCommService, useValue: acMock}
]
}); });
fixture = TestBed.createComponent(GroupsComponent); fixture = TestBed.createComponent(GroupsComponent);
component = fixture.componentInstance; component = fixture.componentInstance;

View File

@@ -1,6 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { RemoveConfirmComponent } from './remove-confirm.component'; import { RemoveConfirmComponent } from './remove-confirm.component';
import { MatDialogModule } from '@angular/material/dialog';
describe('RemoveConfirmComponent', () => { describe('RemoveConfirmComponent', () => {
let component: RemoveConfirmComponent; let component: RemoveConfirmComponent;
@@ -8,7 +9,8 @@ describe('RemoveConfirmComponent', () => {
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [RemoveConfirmComponent] declarations: [RemoveConfirmComponent],
imports: [MatDialogModule]
}); });
fixture = TestBed.createComponent(RemoveConfirmComponent); fixture = TestBed.createComponent(RemoveConfirmComponent);
component = fixture.componentInstance; component = fixture.componentInstance;

View File

@@ -1,14 +1,35 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AdminKeyComponent } from './key.component'; import { AdminKeyComponent } from './key.component';
import { of } from 'rxjs';
import { AdminCommService } from '../admin-comm.service';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatChipsModule } from '@angular/material/chips';
import { MatIconModule } from '@angular/material/icon';
import { MatPaginatorModule } from '@angular/material/paginator';
import { FormsModule } from '@angular/forms';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatTableModule } from '@angular/material/table';
import { MatInputModule } from '@angular/material/input';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
describe('KeyComponent', () => { describe('AdminKeyComponent', () => {
let component: AdminKeyComponent; let component: AdminKeyComponent;
let fixture: ComponentFixture<AdminKeyComponent>; let fixture: ComponentFixture<AdminKeyComponent>;
let acMock
beforeEach(async () => { beforeEach(async () => {
acMock = {
keys: {
getKeys: jasmine.createSpy("getKeys").and.returnValue(of())
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [AdminKeyComponent] declarations: [AdminKeyComponent],
providers: [
{provide: AdminCommService, useValue: acMock}
],
imports: [MatFormFieldModule, MatChipsModule, MatIconModule, MatPaginatorModule, FormsModule, MatProgressSpinnerModule, MatTableModule, MatInputModule, NoopAnimationsModule]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,17 +1,77 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NewKeyComponent } from './new-key.component'; import { NewKeyComponent } from './new-key.component';
import { AdminCommService } from '../../admin-comm.service';
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
import { Component, forwardRef, Optional, Self } from '@angular/core';
import { Observable, of } from 'rxjs';
import { AbstractControlDirective, ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, NgControl, ReactiveFormsModule } from '@angular/forms';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
@Component({
selector: "app-user-search", template: '', providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => UserSearchStub),
multi: true,
},
{
provide: MatFormFieldControl,
useExisting: UserSearchStub
}]
})
class UserSearchStub implements ControlValueAccessor, MatFormFieldControl<never> {
value: null = null;
stateChanges: Observable<void> = of();
id: string = "";
placeholder: string = "";
ngControl: NgControl | AbstractControlDirective | null = null;
focused: boolean = false;
empty: boolean = true;
shouldLabelFloat: boolean = true;
required: boolean = false;
disabled: boolean = false;
errorState: boolean = false;
controlType?: string | undefined;
autofilled?: boolean | undefined;
userAriaDescribedBy?: string | undefined;
setDescribedByIds(ids: string[]): void {}
onContainerClick(event: MouseEvent): void {}
writeValue(obj: any): void {}
registerOnChange(fn: any): void {}
registerOnTouched(fn: any): void {}
setDisabledState?(isDisabled: boolean): void {}
}
describe('NewKeyComponent', () => { describe('NewKeyComponent', () => {
let component: NewKeyComponent; let component: NewKeyComponent;
let fixture: ComponentFixture<NewKeyComponent>; let fixture: ComponentFixture<NewKeyComponent>;
let acMock
beforeEach(async () => { beforeEach(async () => {
acMock = {
keys: {
avalKeys: jasmine.createSpy("avalKeys").and.returnValue(of())
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [NewKeyComponent] declarations: [NewKeyComponent, UserSearchStub],
providers: [
{ provide: AdminCommService, useValue: acMock },
{ provide: MatDialogRef, useValue: {} }
],
imports: [
MatDialogModule,
MatFormFieldModule,
MatSelectModule,
FormsModule,
ReactiveFormsModule,
NoopAnimationsModule
]
}) })
.compileComponents(); .compileComponents();
fixture = TestBed.createComponent(NewKeyComponent); fixture = TestBed.createComponent(NewKeyComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();

View File

@@ -1,6 +1,9 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MenuAddComponent } from './menu-add.component'; import { MenuAddComponent } from './menu-add.component';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { MatRadioModule } from '@angular/material/radio';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
describe('MenuAddComponent', () => { describe('MenuAddComponent', () => {
let component: MenuAddComponent; let component: MenuAddComponent;
@@ -8,7 +11,17 @@ describe('MenuAddComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [MenuAddComponent] declarations: [MenuAddComponent],
providers: [
{provide: MAT_DIALOG_DATA, useValue: {}},
{provide: MatDialogRef, useValue: {}}
],
imports: [
MatDialogModule,
MatRadioModule,
ReactiveFormsModule,
FormsModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -5,21 +5,25 @@ import { AdminCommService } from '../admin-comm.service';
import { MatDialogModule } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSnackBarModule } from '@angular/material/snack-bar';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { MatCardModule } from '@angular/material/card';
describe('NewsEditComponent', () => { describe('NewsEditComponent', () => {
let component: NewsEditComponent; let component: NewsEditComponent;
let fixture: ComponentFixture<NewsEditComponent>; let fixture: ComponentFixture<NewsEditComponent>;
let acMock
beforeEach(() => { beforeEach(() => {
const acMock = jasmine.createSpyObj('AdminCommService', { acMock = {
getNews: of() news: {
}) getNews: jasmine.createSpy('getNews').and.returnValue(of([]))
}
}
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [NewsEditComponent], declarations: [NewsEditComponent],
providers: [ providers: [
{provide: AdminCommService, useValue: acMock} {provide: AdminCommService, useValue: acMock}
], ],
imports: [MatDialogModule, MatSnackBarModule] imports: [MatDialogModule, MatSnackBarModule, MatCardModule]
}); });
fixture = TestBed.createComponent(NewsEditComponent); fixture = TestBed.createComponent(NewsEditComponent);
component = fixture.componentInstance; component = fixture.componentInstance;

View File

@@ -1,14 +1,76 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NotificationsComponent } from './notifications.component'; import { NotificationsComponent } from './notifications.component';
import { AdminCommService } from '../admin-comm.service';
import { RouterModule } from '@angular/router';
import { MatRadioModule } from '@angular/material/radio';
import { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';
import { Component, forwardRef } from '@angular/core';
import { MatIconModule } from '@angular/material/icon';
import { Observable, of } from 'rxjs';
import { AbstractControlDirective, ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, NgControl, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
@Component({
selector: "app-user-search", template: '', providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => UserSearchStub),
multi: true,
},
{
provide: MatFormFieldControl,
useExisting: UserSearchStub
}]
})
class UserSearchStub implements ControlValueAccessor, MatFormFieldControl<never> {
value: null = null;
stateChanges: Observable<void> = of();
id: string = "";
placeholder: string = "";
ngControl: NgControl | AbstractControlDirective | null = null;
focused: boolean = false;
empty: boolean = true;
shouldLabelFloat: boolean = true;
required: boolean = false;
disabled: boolean = false;
errorState: boolean = false;
controlType?: string | undefined;
autofilled?: boolean | undefined;
userAriaDescribedBy?: string | undefined;
setDescribedByIds(ids: string[]): void {}
onContainerClick(event: MouseEvent): void {}
writeValue(obj: any): void {}
registerOnChange(fn: any): void {}
registerOnTouched(fn: any): void {}
setDisabledState?(isDisabled: boolean): void {}
}
describe('NotificationsComponent', () => { describe('NotificationsComponent', () => {
let component: NotificationsComponent; let component: NotificationsComponent;
let fixture: ComponentFixture<NotificationsComponent>; let fixture: ComponentFixture<NotificationsComponent>;
beforeEach(() => { beforeEach(() => {
const acMock = {
notif: {
getGroups: jasmine.createSpy("getGroups").and.returnValue(of())
}
}
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [NotificationsComponent] declarations: [NotificationsComponent, UserSearchStub],
providers: [
{provide: AdminCommService, useValue: acMock}
],
imports: [
RouterModule.forRoot([]),
MatRadioModule,
MatFormFieldModule,
MatIconModule,
FormsModule,
ReactiveFormsModule,
MatInputModule,
NoopAnimationsModule
]
}); });
fixture = TestBed.createComponent(NotificationsComponent); fixture = TestBed.createComponent(NotificationsComponent);
component = fixture.componentInstance; component = fixture.componentInstance;

View File

@@ -1,5 +1,5 @@
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
import { AdminCommService } from '../admin-comm.service'; import { AdminCommService } from '../admin-comm.service';
import { Notification } from 'src/app/types/notification'; import { Notification } from 'src/app/types/notification';
import { Group } from 'src/app/types/group'; import { Group } from 'src/app/types/group';
@@ -14,10 +14,20 @@ import { UserSearchResult } from 'src/app/commonComponents/user-search/user-sear
styleUrls: ['./notifications.component.scss'] styleUrls: ['./notifications.component.scss']
}) })
export class NotificationsComponent implements OnInit, OnDestroy { export class NotificationsComponent implements OnInit, OnDestroy {
groups!: Group[] groups!: Group[]
form = this.fb.group({
recp: this.fb.group({
uid: this.fb.control<UserSearchResult | null>(null),
room: this.fb.control<string|null>(null),
group: this.fb.control<string>(''),
type: this.fb.control<"room" | "uname" | "group">('uname', {nonNullable: true})
}),
title: this.fb.control('', {nonNullable: true}),
body: this.fb.control('', {nonNullable: true})
})
constructor (private readonly acs: AdminCommService, readonly ls: LocalStorageService, private toolbar: ToolbarService, private router: Router, private route: ActivatedRoute ) { constructor (private readonly acs: AdminCommService, readonly ls: LocalStorageService, private toolbar: ToolbarService, private router: Router, private route: ActivatedRoute, private fb: FormBuilder ) {
this.toolbar.comp = this this.toolbar.comp = this
this.toolbar.menu = [ this.toolbar.menu = [
{ title: "Wysłane", fn: "outbox", icon: "outbox" } { title: "Wysłane", fn: "outbox", icon: "outbox" }
@@ -45,16 +55,6 @@ export class NotificationsComponent implements OnInit, OnDestroy {
success?: { sent: number; possible: number; }; success?: { sent: number; possible: number; };
form = new FormGroup({
recp: new FormGroup({
uid: new FormControl<UserSearchResult | null>(null),
room: new FormControl<string|null>(null),
group: new FormControl<string>(''),
type: new FormControl<"room" | "uname" | "group">('uname', {nonNullable: true})
}),
title: new FormControl('', {nonNullable: true}),
body: new FormControl('', {nonNullable: true})
})
submit() { submit() {
this.acs.notif.send({...this.form.value, recp: {...this.form.get("recp")?.value, uid: this.form.controls['recp'].controls['uid'].value?._id}} as Notification).subscribe((data) => { this.acs.notif.send({...this.form.value, recp: {...this.form.get("recp")?.value, uid: this.form.controls['recp'].controls['uid'].value?._id}} as Notification).subscribe((data) => {

View File

@@ -1,19 +1,32 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MessageComponent } from './message.component'; import { MessageComponent } from './message.component';
import { AdminCommService } from 'src/app/admin-view/admin-comm.service';
import { MatCardModule } from '@angular/material/card';
import * as moment from 'moment';
describe('MessageComponent', () => { describe('MessageComponent', () => {
let component: MessageComponent; let component: MessageComponent;
let fixture: ComponentFixture<MessageComponent>; let fixture: ComponentFixture<MessageComponent>;
beforeEach(async () => { beforeEach(async () => {
const acMock = {
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [MessageComponent] declarations: [MessageComponent],
providers: [
{provide: AdminCommService, useValue: acMock}
],
imports: [
MatCardModule
]
}) })
.compileComponents(); .compileComponents();
fixture = TestBed.createComponent(MessageComponent); fixture = TestBed.createComponent(MessageComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
component.item = {_id: "test", sentDate: moment(), title: "Test"}
fixture.detectChanges(); fixture.detectChanges();
}); });

View File

@@ -1,14 +1,30 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { OutboxComponent } from './outbox.component'; import { OutboxComponent } from './outbox.component';
import { AdminCommService } from '../../admin-comm.service';
import { RouterModule } from '@angular/router';
import { of } from 'rxjs';
describe('OutboxComponent', () => { describe('OutboxComponent', () => {
let component: OutboxComponent; let component: OutboxComponent;
let fixture: ComponentFixture<OutboxComponent>; let fixture: ComponentFixture<OutboxComponent>;
beforeEach(async () => { beforeEach(async () => {
const acMock = {
notif: {
outbox: {
getSent: jasmine.createSpy("getSent").and.returnValue(of())
}
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [OutboxComponent] declarations: [OutboxComponent],
providers: [
{provide: AdminCommService, useValue: acMock}
],
imports: [
RouterModule.forRoot([])
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,14 +1,49 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SettingsComponent } from './settings.component'; import { SettingsComponent } from './settings.component';
import { AdminCommService } from '../admin-comm.service';
import { MatExpansionModule } from '@angular/material/expansion';
import { Component, Input } from '@angular/core';
import { MatTabsModule } from '@angular/material/tabs';
import { MatFormFieldModule } from '@angular/material/form-field';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatIconModule } from '@angular/material/icon';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { of } from 'rxjs';
import { MatInputModule } from '@angular/material/input';
@Component({selector: 'app-list-editor', template: ''})
class ListEditorStub {
@Input() converter?: any[];
@Input() list?: string[];
}
describe('SettingsComponent', () => { describe('SettingsComponent', () => {
let component: SettingsComponent; let component: SettingsComponent;
let fixture: ComponentFixture<SettingsComponent>; let fixture: ComponentFixture<SettingsComponent>;
beforeEach(async () => { beforeEach(async () => {
const acMock = {
settings: {
getAll: jasmine.createSpy("getAll").and.returnValue(of())
}
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [SettingsComponent] declarations: [SettingsComponent, ListEditorStub],
providers: [
{provide: AdminCommService, useValue: acMock}
],
imports: [
MatExpansionModule,
MatTabsModule,
MatFormFieldModule,
FormsModule,
ReactiveFormsModule,
MatIconModule,
NoopAnimationsModule,
MatInputModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -9,7 +9,7 @@ import { FormBuilder } from '@angular/forms';
styleUrl: './settings.component.scss' styleUrl: './settings.component.scss'
}) })
export class SettingsComponent implements OnInit { export class SettingsComponent implements OnInit {
usettings!: IUSettings usettings: IUSettings = {cleanThings: [], keyrooms: [], menu: {defaultItems: {kol: [], sn: []}}, rooms: [], security: {loginTimeout: {attempts: 0, lockout: 0, time: 0}}}
reloadTimeout: boolean = false; reloadTimeout: boolean = false;
constructor (private readonly acu: AdminCommService, private readonly sb: MatSnackBar, private readonly fb: FormBuilder) { } constructor (private readonly acu: AdminCommService, private readonly sb: MatSnackBar, private readonly fb: FormBuilder) { }

View File

@@ -1,14 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { StartAdminComponent } from './start.component'; import { StartAdminComponent } from './start.component';
import { MatIconModule } from '@angular/material/icon';
describe('StartComponent', () => { describe('StartAdminComponent', () => {
let component: StartAdminComponent; let component: StartAdminComponent;
let fixture: ComponentFixture<StartAdminComponent>; let fixture: ComponentFixture<StartAdminComponent>;
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [StartAdminComponent] declarations: [StartAdminComponent],
imports: [
MatIconModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,6 +1,9 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ToolbarComponent } from './toolbar.component'; import { ToolbarComponent } from './toolbar.component';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
describe('ToolbarComponent', () => { describe('ToolbarComponent', () => {
let component: ToolbarComponent; let component: ToolbarComponent;
@@ -8,7 +11,8 @@ describe('ToolbarComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [ToolbarComponent] declarations: [ToolbarComponent],
imports: [MatToolbarModule, MatIconModule, MatMenuModule]
}) })
.compileComponents(); .compileComponents();

View File

@@ -12,22 +12,24 @@ import { of } from 'rxjs';
describe('AppViewComponent', () => { describe('AppViewComponent', () => {
let component: AppViewComponent; let component: AppViewComponent;
let fixture: ComponentFixture<AppViewComponent>; let fixture: ComponentFixture<AppViewComponent>;
let authClient: jasmine.SpyObj<AuthClient>;
beforeEach(() => { beforeEach(() => {
const authSpy = jasmine.createSpyObj('AuthClient', ['check']) const authSpy = jasmine.createSpyObj('AuthClient', ['check'])
const pushSpy = jasmine.createSpyObj('SwPush', ['requestSubscription']) const pushSpy = jasmine.createSpyObj('SwPush', ['requestSubscription'])
const updatesSpy = jasmine.createSpyObj('UpdatesService', ['postNotif']) const updatesSpy = jasmine.createSpyObj('UpdatesService', {
newsCheck: of()
})
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [AppViewComponent], declarations: [AppViewComponent],
providers: [{provide: AuthClient, useValue: authSpy}, providers: [
{provide: SwPush, useValue: pushSpy}, {provide: AuthClient, useValue: authSpy},
{provide: UpdatesService, useValue: updatesSpy}], {provide: SwPush, useValue: pushSpy},
{provide: UpdatesService, useValue: updatesSpy}
],
imports: [MatTabsModule, RouterModule.forRoot([]), MatIconModule] imports: [MatTabsModule, RouterModule.forRoot([]), MatIconModule]
}); });
fixture = TestBed.createComponent(AppViewComponent); fixture = TestBed.createComponent(AppViewComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
authClient = TestBed.inject(AuthClient) as jasmine.SpyObj<AuthClient>
fixture.detectChanges(); fixture.detectChanges();
}); });

View File

@@ -14,13 +14,17 @@ import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatDialogRef } from '@angular/material/dialog'; import { MatDialogRef } from '@angular/material/dialog';
import { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet'; import { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';
import { of } from 'rxjs';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
describe('MenuComponent', () => { describe('MenuComponent', () => {
let component: MenuComponent; let component: MenuComponent;
let fixture: ComponentFixture<MenuComponent>; let fixture: ComponentFixture<MenuComponent>;
beforeEach(async () => { beforeEach(async () => {
const updatesSpy = jasmine.createSpyObj('UpdatesService', ['getMenu']) const updatesSpy = jasmine.createSpyObj('UpdatesService', {
getMenu: of()
})
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [ MenuComponent, DateSelectorComponent], declarations: [ MenuComponent, DateSelectorComponent],
providers: [ providers: [
@@ -30,7 +34,17 @@ describe('MenuComponent', () => {
{provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS}, {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS},
{provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS, useValue: {useUtc: true}}, {provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS, useValue: {useUtc: true}},
], ],
imports: [MatIconModule, MatFormFieldModule, MatDatepickerModule, MatCardModule, ReactiveFormsModule, MatInputModule, BrowserAnimationsModule, MatBottomSheetModule] imports: [
MatIconModule,
MatFormFieldModule,
MatDatepickerModule,
MatCardModule,
ReactiveFormsModule,
MatInputModule,
BrowserAnimationsModule,
MatBottomSheetModule,
MatProgressSpinnerModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -3,6 +3,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NewsComponent } from './news.component'; import { NewsComponent } from './news.component';
import { UpdatesService } from 'src/app/services/updates.service'; import { UpdatesService } from 'src/app/services/updates.service';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { LocalStorageService } from 'src/app/services/local-storage.service';
import { MatCardModule } from '@angular/material/card';
describe('NewsComponent', () => { describe('NewsComponent', () => {
let component: NewsComponent; let component: NewsComponent;
@@ -12,11 +16,20 @@ describe('NewsComponent', () => {
const updatesMock = jasmine.createSpyObj('UpdatesService', { const updatesMock = jasmine.createSpyObj('UpdatesService', {
getNews: of() getNews: of()
}) })
const lsMock = {
news: []
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [ NewsComponent ], declarations: [ NewsComponent ],
providers: [ providers: [
{provide: UpdatesService, useValue: updatesMock} {provide: UpdatesService, useValue: updatesMock},
{provide: LocalStorageService, useValue: lsMock}
], ],
imports: [
MatProgressSpinnerModule,
NoopAnimationsModule,
MatCardModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,14 +1,28 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NotifDialogComponent } from './notif-dialog.component'; import { NotifDialogComponent } from './notif-dialog.component';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { UpdatesService } from 'src/app/services/updates.service';
import { of } from 'rxjs';
describe('NotifDialogComponent', () => { describe('NotifDialogComponent', () => {
let component: NotifDialogComponent; let component: NotifDialogComponent;
let fixture: ComponentFixture<NotifDialogComponent>; let fixture: ComponentFixture<NotifDialogComponent>;
beforeEach(async () => { beforeEach(async () => {
const uMock = jasmine.createSpyObj<UpdatesService>("UpdatesService", {
postInfoAck: of()
})
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [NotifDialogComponent] declarations: [NotifDialogComponent],
providers: [
{provide: MAT_DIALOG_DATA, useValue: {message: "Test"}},
{provide: MatDialogRef, useValue: {}},
{provide: UpdatesService, useValue: uMock}
],
imports: [
MatDialogModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,6 +1,8 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AboutComponent } from './about.component'; import { AboutComponent } from './about.component';
import { MatDialogModule } from '@angular/material/dialog';
import { MatListModule } from '@angular/material/list';
describe('AboutComponent', () => { describe('AboutComponent', () => {
let component: AboutComponent; let component: AboutComponent;
@@ -8,7 +10,11 @@ describe('AboutComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [AboutComponent] declarations: [AboutComponent],
imports: [
MatDialogModule,
MatListModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,14 +1,37 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CleanComponent } from './clean.component'; import { CleanComponent } from './clean.component';
import { UpdatesService } from 'src/app/services/updates.service';
import { of } from 'rxjs';
import { MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatDatepicker } from '@angular/material/datepicker';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as moment from 'moment';
@Component({selector: "app-date-selector", template: ''})
class DateSelectorStub {
@Input() date: moment.Moment = moment.utc().startOf('day');
@Output() dateChange = new EventEmitter<moment.Moment>();
@Input() filter: (date: moment.Moment | null) => boolean = () => true
}
describe('CleanComponent', () => { describe('CleanComponent', () => {
let component: CleanComponent; let component: CleanComponent;
let fixture: ComponentFixture<CleanComponent>; let fixture: ComponentFixture<CleanComponent>;
let updates: jasmine.SpyObj<UpdatesService>
beforeEach(async () => { beforeEach(async () => {
updates = jasmine.createSpyObj<UpdatesService>("UpdatesService", {
getClean: of()
})
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [CleanComponent] declarations: [CleanComponent, DateSelectorStub],
providers: [
{provide: UpdatesService, useValue: updates}
],
imports: [MatDialogModule, MatIconModule, MatFormFieldModule, MatDatepicker]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,6 +1,8 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ExtraComponent } from './extra.component'; import { ExtraComponent } from './extra.component';
import { MatDialogModule } from '@angular/material/dialog';
import { MatListModule } from '@angular/material/list';
describe('ExtraComponent', () => { describe('ExtraComponent', () => {
let component: ExtraComponent; let component: ExtraComponent;
@@ -8,7 +10,11 @@ describe('ExtraComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [ExtraComponent] declarations: [ExtraComponent],
imports: [
MatDialogModule,
MatListModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,20 +1,37 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatInputHarness } from '@angular/material/input/testing'
import { RedirectComponent } from './redirect.component'; import { RedirectComponent } from './redirect.component';
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { AuthClient } from 'src/app/services/auth.client';
import { MatFormFieldModule } from '@angular/material/form-field';
import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'
import { FormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
describe('RedirectComponent', () => { describe('RedirectComponent', () => {
let component: RedirectComponent; let component: RedirectComponent;
let fixture: ComponentFixture<RedirectComponent>; let fixture: ComponentFixture<RedirectComponent>;
let loader: HarnessLoader
let authMock
beforeEach(async () => { beforeEach(async () => {
authMock = jasmine.createSpyObj<AuthClient>("AuthClient", {}, {redirect: ''})
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [RedirectComponent] declarations: [RedirectComponent],
providers: [
{provide: MatDialogRef, useValue: {}},
{provide: AuthClient, useValue: authMock}
],
imports: [MatDialogModule, MatFormFieldModule, MatInputModule, FormsModule, NoopAnimationsModule]
}) })
.compileComponents(); .compileComponents();
fixture = TestBed.createComponent(RedirectComponent); fixture = TestBed.createComponent(RedirectComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();
loader = TestbedHarnessEnvironment.loader(fixture)
}); });
it('should create', () => { it('should create', () => {

View File

@@ -1,14 +1,26 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { KeyComponent } from './key.component'; import { KeyComponent } from './key.component';
import { UpdatesService } from 'src/app/services/updates.service';
import { of } from 'rxjs';
import { MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon';
describe('KeyComponent', () => { describe('KeyComponent', () => {
let component: KeyComponent; let component: KeyComponent;
let fixture: ComponentFixture<KeyComponent>; let fixture: ComponentFixture<KeyComponent>;
let uMock: jasmine.SpyObj<UpdatesService>
beforeEach(async () => { beforeEach(async () => {
uMock = jasmine.createSpyObj<UpdatesService>("UpdatesService", {
getKeys: of()
})
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [KeyComponent] declarations: [KeyComponent],
providers: [
{provide: UpdatesService, useValue: uMock}
],
imports: [MatDialogModule, MatIconModule]
}) })
.compileComponents(); .compileComponents();

View File

@@ -3,23 +3,30 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PersonalComponent } from './personal.component'; import { PersonalComponent } from './personal.component';
import { AuthClient } from 'src/app/services/auth.client'; import { AuthClient } from 'src/app/services/auth.client';
import { MatDialogModule } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { SwUpdate } from '@angular/service-worker';
import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatListModule } from '@angular/material/list'; import { MatListModule } from '@angular/material/list';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule, NoopAnimationsModule } from '@angular/platform-browser/animations';
import { AppUpdateService } from 'src/app/services/app-update.service';
import { of } from 'rxjs';
import { MatIconModule } from '@angular/material/icon';
describe('PersonalComponent', () => { describe('PersonalComponent', () => {
let component: PersonalComponent; let component: PersonalComponent;
let fixture: ComponentFixture<PersonalComponent>; let fixture: ComponentFixture<PersonalComponent>;
let auMock: jasmine.SpyObj<AppUpdateService>
beforeEach(() => { beforeEach(() => {
auMock = jasmine.createSpyObj("aumock", {
checkForUpdate: of()
})
const authMock = jasmine.createSpyObj('AuthClient', ['s']) const authMock = jasmine.createSpyObj('AuthClient', ['s'])
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [PersonalComponent], declarations: [PersonalComponent],
providers: [ providers: [
{provide: AuthClient, useValue: authMock}, {provide: AuthClient, useValue: authMock},
{provide: AppUpdateService, useValue: auMock}
], ],
imports: [MatDialogModule, MatSnackBarModule, MatListModule, BrowserAnimationsModule] imports: [MatDialogModule, MatSnackBarModule, MatListModule, NoopAnimationsModule, MatIconModule]
}); });
fixture = TestBed.createComponent(PersonalComponent); fixture = TestBed.createComponent(PersonalComponent);
component = fixture.componentInstance; component = fixture.componentInstance;

View File

@@ -1,6 +1,8 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { StartComponent } from './start.component'; import { StartComponent } from './start.component';
import { RouterModule } from '@angular/router';
import { MatListModule } from '@angular/material/list';
describe('StartComponent', () => { describe('StartComponent', () => {
let component: StartComponent; let component: StartComponent;
@@ -8,7 +10,11 @@ describe('StartComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [StartComponent] declarations: [StartComponent],
imports: [
RouterModule.forRoot([]),
MatListModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,16 +1,22 @@
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { AppUpdateService } from './services/app-update.service';
import { RouterModule } from '@angular/router';
describe('AppComponent', () => { describe('AppComponent', () => {
let auMock
beforeEach(async () => { beforeEach(async () => {
auMock = {}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [ declarations: [
AppComponent AppComponent
], ],
providers: [
{provide: AppUpdateService, useValue: auMock}
],
imports: [
RouterModule
]
}).compileComponents(); }).compileComponents();
}); });
@@ -20,7 +26,7 @@ describe('AppComponent', () => {
expect(app).toBeTruthy(); expect(app).toBeTruthy();
}); });
it(`should have as title 'ipwa'`, () => { it(`should have as title 'Internat'`, () => {
const fixture = TestBed.createComponent(AppComponent); const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance; const app = fixture.componentInstance;
expect(app.title).toEqual('Internat'); expect(app.title).toEqual('Internat');

View File

@@ -1,6 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { RoomChooserComponent } from './room-chooser.component'; import { RoomChooserComponent } from './room-chooser.component';
import { MatIconModule } from '@angular/material/icon';
describe('RoomChooserComponent', () => { describe('RoomChooserComponent', () => {
let component: RoomChooserComponent; let component: RoomChooserComponent;
@@ -8,7 +9,8 @@ describe('RoomChooserComponent', () => {
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [RoomChooserComponent] declarations: [RoomChooserComponent],
imports: [MatIconModule]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,14 +1,31 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { UserSearchComponent } from './user-search.component'; import { UserSearchComponent } from './user-search.component';
import { AdminCommService } from 'src/app/admin-view/admin-comm.service';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatInputModule } from '@angular/material/input';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
describe('UserSearchComponent', () => { describe('UserSearchComponent', () => {
let component: UserSearchComponent; let component: UserSearchComponent;
let fixture: ComponentFixture<UserSearchComponent>; let fixture: ComponentFixture<UserSearchComponent>;
let acMock
beforeEach(async () => { beforeEach(async () => {
acMock = {
}
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [UserSearchComponent] declarations: [UserSearchComponent],
providers: [
{ provide: AdminCommService, useValue: acMock }
],
imports: [
MatAutocompleteModule,
MatInputModule,
FormsModule,
ReactiveFormsModule
]
}) })
.compileComponents(); .compileComponents();

View File

@@ -6,7 +6,7 @@ import { ControlContainer } from '@angular/forms';
}) })
export class LabelDirective { export class LabelDirective {
@Input() control: string = "" @Input() control: string = ""
constructor(@Optional() private parent: ControlContainer) { } constructor(@Optional() private parent?: ControlContainer) { }
@HostBinding('textContent') @HostBinding('textContent')
get controlValue() { get controlValue() {

View File

@@ -16,7 +16,7 @@ describe('LoginComponent', () => {
beforeEach(async () => { beforeEach(async () => {
authMock = jasmine.createSpyObj<AuthClient>("AuthClient", { authMock = jasmine.createSpyObj<AuthClient>("AuthClient", {
login: of(1) login: of()
}) })
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [ LoginComponent ], declarations: [ LoginComponent ],

View File

@@ -10,7 +10,7 @@ describe('AppUpdateService', () => {
service = TestBed.inject(AppUpdateService); service = TestBed.inject(AppUpdateService);
}); });
it('should be created', () => { xit('should be created', () => {
expect(service).toBeTruthy(); expect(service).toBeTruthy();
}); });
}); });

View File

@@ -1,5 +1,5 @@
export const environment = { export const environment = {
apiEndpoint: `${window.location.origin}/api`, apiEndpoint: `${window.location.origin}/api`,
version: "v1.1.0", version: "v1.1.1",
production: true production: true
}; };