-Subproject commit a0e97a512e5e56f69035853d1510ae5efdde4d64
+Subproject commit 6d555b93a94e959095008ce51b4dacd986998eec
+export interface User
+{
+ id: string,
+ shard: number
+}
+
export interface Chatroom
{
id: string,
})
export class ChatroomService {
- private http = inject(HttpClient);
- private backendUri: string;
+ private readonly http = inject(HttpClient);
+ private readonly backendUri: string;
private chatroom?: Chatroom;
import { ReactiveFormsModule } from '@angular/forms';
import { UserComponent } from './index';
import { APP_PROPS } from '../app.tokens';
+import { provideHttpClientTesting } from '@angular/common/http/testing';
+import { provideHttpClient } from '@angular/common/http';
describe('UserComponent', () => {
let component: UserComponent;
UserComponent,
],
providers: [
+ provideHttpClient(),
+ provideHttpClientTesting(),
{ provide: APP_PROPS, useValue: {} },
],
})
updateName(): void {
let input = this.usernameForm.getRawValue();
if (input !== null) {
- this.userService.setUser(input.trim());
+ this.userService.setUserName(input.trim());
this.router.navigate(['chatrooms'])
}
}
--- /dev/null
+import { Matchers, Pact, SpecificationVersion } from '@pact-foundation/pact';
+import { TestBed } from '@angular/core/testing';
+import { provideHttpClient } from '@angular/common/http';
+import { lastValueFrom } from 'rxjs';
+import { ChatroomService } from './chatroom.service';
+import { Chatroom } from './chatroom.model';
+import { APP_PROPS } from '../app.tokens';
+import { User } from '../chatroom';
+import { UserService } from './user.service';
+
+
+describe('Pact between the UserService and the backend', () => {
+
+ const provider = new Pact({
+ consumer: 'UserService',
+ provider: 'ChatBackendController',
+ spec: SpecificationVersion.SPECIFICATION_VERSION_V4,
+ dir: 'pacts',
+ logLevel: 'debug',
+ });
+
+
+ const EXAMPLE_USER: User = {
+ id: "5c73531c-6fc4-426c-adcb-afc5c140a0f7",
+ shard: 2
+ };
+
+
+ it('POST /user/create', async () => {
+
+ await provider
+ .addInteraction()
+ .given('there are 10 shards')
+ .given('the server is responsible for shard 2')
+ .uponReceiving('a request to create a user')
+ .withRequest('POST', '/user/create', (builder) => {
+ builder.headers({
+ Accept: Matchers.like('application/json'),
+ });
+ })
+ .willRespondWith(200, (builder) => {
+ builder.headers({ 'Content-Type': 'application/json' });
+ builder.jsonBody(EXAMPLE_USER);
+ })
+ .executeTest(async (mockserver) => {
+ await TestBed.configureTestingModule({
+ providers: [
+ UserService,
+ {provide: APP_PROPS, useValue: {backendUri: mockserver.url + '/'}},
+ provideHttpClient(),
+ ]
+ });
+
+ const service = TestBed.inject(UserService);
+ const user = await service.createUser();
+
+ expect(user).toEqual(EXAMPLE_USER);
+ expect(service.getUser()).toEqual(EXAMPLE_USER);
+ });
+ });
+});
import { TestBed } from '@angular/core/testing';
import { UserService } from './index';
+import { provideHttpClient } from '@angular/common/http';
+import { provideHttpClientTesting } from '@angular/common/http/testing';
+import { APP_PROPS } from '../app.tokens';
describe('UserService', () => {
let service: UserService;
beforeEach(() => {
- TestBed.configureTestingModule({});
+ TestBed.configureTestingModule({
+ providers: [
+ provideHttpClient(),
+ provideHttpClientTesting(),
+ { provide: APP_PROPS, useValue: {} },
+ ],
+ });
service = TestBed.inject(UserService);
});
-import { Injectable } from '@angular/core';
+import { inject, Injectable } from '@angular/core';
import { Router } from "@angular/router";
+import { HttpClient } from '@angular/common/http';
+import { APP_PROPS } from '../app.tokens';
+import { User } from '../chatroom';
+import { firstValueFrom, Observable, tap } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserService {
+ private readonly router = inject(Router);
+
+ private readonly http = inject(HttpClient);
+ private readonly backendUri: string;
+
private unknown: boolean = true;
+ private user: User|undefined = undefined;
private name = '';
- constructor(private router: Router) { }
+
+ constructor() {
+ const props = inject(APP_PROPS);
+ this.backendUri = props.backendUri;
+ }
assertUserisKnown(callback: Function): void {
if(this.unknown) {
}
}
- setUser(name: string): void {
+ async createUser(): Promise<User> {
+ return await firstValueFrom(
+ this
+ .http
+ .post<User>(this.backendUri + 'user/create', undefined)
+ .pipe(tap((user: User) => {
+ console.log('created a new user: ' + user);
+ this.user = user;
+ })));
+ }
+
+ getUser(): User|undefined {
+ return this.user;
+ }
+
+ setUserName(name: string): void {
console.log("New user: " + name);
this.name = name;
this.unknown = false;
}
- getUser(): string {
+ getUserName(): string {
return this.name;
}
}