import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ChangeDetectorRef, Component, DebugElement, Input } from '@angular/core';
import { OpIconComponent } from "core-app/shared/components/icon/icon.component";
import { GitActionsMenuDirective } from "core-app/features/plugins/linked/openproject-github_integration/git-actions-menu/git-actions-menu.directive";
import { TabPrsComponent } from "core-app/features/plugins/linked/openproject-github_integration/tab-prs/tab-prs.component";
import { HalResourceService } from "core-app/features/hal/services/hal-resource.service";
import { APIV3Service } from "core-app/core/apiv3/api-v3.service";
import { of } from "rxjs";
import { PullRequestComponent } from "core-app/features/plugins/linked/openproject-github_integration/pull-request/pull-request.component";
import { By } from "@angular/platform-browser";
import { I18nService } from "core-app/core/i18n/i18n.service";
@Component({
selector: 'op-date-time',
template: '
OpDateTimeComponent
'
})
class OpDateTimeComponent {
@Input()
dateTimeValue:any;
}
describe('TabPrsComponent', () => {
let component:TabPrsComponent;
let fixture:ComponentFixture;
let element:DebugElement;
let halResourceService: jasmine.SpyObj;
let changeDetectorRef: jasmine.SpyObj;
const I18nServiceStub = {
t: function(key:string) {
return 'test translation';
}
}
const APIV3Stub = {
work_packages: {
id: () => ({github_pull_requests: 'prpath'})
}
}
const pullRequests = {
elements: [
{
title: 'title 1',
githubUser: {
avatarUrl: 'githubUser 1 avatarUrl',
htmlUrl: 'githubUser 1 htmlUrl',
login: 'githubUser 1 login',
},
githubUpdatedAt: 'githubUser 1 githubUpdatedAt',
repository: 'githubUser 1 repository',
number: 'githubUser 1 number',
checkRuns: [
{
name: 'githubUser 1 checkRun',
outputTitle: 'githubUser 1 outputTitle',
conclusion: 'githubUser 1 conclusion',
status: 'githubUser 1 status',
detailsUrl: 'githubUser 1 detailsUrl',
}
],
},
{
title: 'title 2',
githubUser: {
avatarUrl: 'githubUser 2 avatarUrl',
htmlUrl: 'githubUser 2 htmlUrl',
login: 'githubUser 2 login',
},
githubUpdatedAt: 'githubUser 2 githubUpdatedAt',
repository: 'githubUser 2 repository',
number: 'githubUser 2 number',
checkRuns: [
{
name: 'githubUser 2 checkRun',
outputTitle: 'githubUser 2 outputTitle',
conclusion: 'githubUser 2 conclusion',
status: 'githubUser 2 status',
detailsUrl: 'githubUser 2 detailsUrl',
}
],
}
]
}
beforeEach(async () => {
const halResourceServiceSpy = jasmine.createSpyObj('HalResourceService', ['get']);
const changeDetectorSpy = jasmine.createSpyObj('ChangeDetectorRef', ['detectChanges']);
// @ts-ignore
halResourceServiceSpy.get.and.returnValue(of(pullRequests));
await TestBed
.configureTestingModule({
declarations: [
TabPrsComponent,
OpIconComponent,
GitActionsMenuDirective,
PullRequestComponent,
OpDateTimeComponent,
],
providers: [
{ provide: I18nService, useValue: I18nServiceStub },
{ provide: HalResourceService, useValue: halResourceServiceSpy },
{ provide: APIV3Service, useValue: APIV3Stub },
{ provide: ChangeDetectorRef, useValue: changeDetectorSpy },
],
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(TabPrsComponent);
component = fixture.componentInstance;
element = fixture.debugElement;
halResourceService = fixture.debugElement.injector.get(HalResourceService) as jasmine.SpyObj;
changeDetectorRef = fixture.debugElement.injector.get(ChangeDetectorRef) as jasmine.SpyObj;
// @ts-ignore
component.workPackage = { id: 'testId' };
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should display a PullRequestComponent per pull request', () => {
const pullRequests = fixture.debugElement.queryAll(By.css('github-pull-request'));
expect(pullRequests.length).toBe(2);
});
it('should display a message when there are no pull requests', () => {
component.pullRequests = [];
fixture.detectChanges();
const pullRequests = fixture.debugElement.queryAll(By.css('github-pull-request'));
const textMessage = fixture.debugElement.queryAll(By.css('p'));
expect(pullRequests.length).toBe(0);
expect(textMessage).toBeTruthy();
});
});