Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ufal/downloading-restricted-bitstreams-not-working-properly #393

3 changes: 1 addition & 2 deletions src/app/bitstream-page/bitstream-page-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,8 @@ const EDIT_BITSTREAM_AUTHORIZATIONS_PATH = ':id/authorizations';
// component: BitstreamDownloadPageComponent,
resolve: {
bitstream: BitstreamPageResolver,
breadcrumb: I18nBreadcrumbResolver
breadcrumb: LegacyBitstreamUrlResolver
},
data: { breadcrumbKey: 'clarin.license.agreement' },
},
{
path: EDIT_BITSTREAM_PATH,
Expand Down
4 changes: 3 additions & 1 deletion src/app/bitstream-page/bitstream-page.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { ClarinBitstreamDownloadPageComponent } from './clarin-bitstream-downloa
import { ClarinLicenseAgreementPageComponent } from './clarin-license-agreement-page/clarin-license-agreement-page.component';
import { ClarinBitstreamTokenExpiredComponent } from './clarin-bitstream-token-expired/clarin-bitstream-token-expired.component';
import { BitstreamDownloadPageComponent } from './bitstream-download-page/bitstream-download-page.component';
import { ClarinZipDownloadPageComponent } from './clarin-zip-download-page/clarin-zip-download-page.component';

/**
* This module handles all components that are necessary for Bitstream related pages
Expand All @@ -30,7 +31,8 @@ import { BitstreamDownloadPageComponent } from './bitstream-download-page/bitstr
ClarinBitstreamDownloadPageComponent,
ClarinLicenseAgreementPageComponent,
ClarinBitstreamTokenExpiredComponent,
BitstreamDownloadPageComponent
BitstreamDownloadPageComponent,
ClarinZipDownloadPageComponent
]
})
export class BitstreamPageModule {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,103 @@
import { TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ClarinBitstreamDownloadPageComponent } from './clarin-bitstream-download-page.component';
import { AuthService } from '../../core/auth/auth.service';
import { FileService } from '../../core/shared/file.service';
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { HardRedirectService } from '../../core/services/hard-redirect.service';
import { RequestService } from '../../core/data/request.service';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service';
import { Bitstream } from '../../core/shared/bitstream.model';
import { of as observableOf } from 'rxjs';
import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils';
import { getMockRequestService } from '../../shared/mocks/request.service.mock';
import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub';
import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-build.service.mock';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { ActivatedRoute, Router } from '@angular/router';

describe('ClarinBitstreamDownloadPageComponent', () => {
// TODO uncomment and create tests
// let component: ClarinBitstreamDownloadPageComponent;
// let fixture: ComponentFixture<ClarinBitstreamDownloadPageComponent>;
let component: ClarinBitstreamDownloadPageComponent;
let fixture: ComponentFixture<ClarinBitstreamDownloadPageComponent>;

let authService: AuthService;
let fileService: FileService;
let authorizationService: AuthorizationDataService;
let hardRedirectService: HardRedirectService;
let activatedRoute;
let router;
let requestService: RequestService;
let halService: HALEndpointService;
let rdbService: RemoteDataBuildService;

let bitstream: Bitstream;

const url = 'fake-bitstream-url';

beforeEach(async () => {
authService = jasmine.createSpyObj('authService', {
isAuthenticated: observableOf(true),
setRedirectUrl: {}
});
authorizationService = jasmine.createSpyObj('authorizationSerivice', {
isAuthorized: observableOf(true)
});
fileService = jasmine.createSpyObj('fileService', {
retrieveFileDownloadLink: observableOf('content-url-with-headers')
});
hardRedirectService = jasmine.createSpyObj('fileService', {
redirect: {}
});
bitstream = Object.assign(new Bitstream(), {
uuid: 'bitstreamUuid',
_links: {
content: {href: 'bitstream-content-link'},
self: {href: 'bitstream-self-link'},
}
});
activatedRoute = {
data: observableOf({
bitstream: createSuccessfulRemoteDataObject(
bitstream
)
}),
snapshot: {
queryParams: new Map([
['redirectUrl', url],
])
}
};
router = jasmine.createSpyObj('router', ['navigateByUrl']);
requestService = getMockRequestService();
halService = Object.assign(new HALEndpointServiceStub(url));
rdbService = getMockRemoteDataBuildService();

await TestBed.configureTestingModule({
declarations: [ ClarinBitstreamDownloadPageComponent ]
declarations: [ ClarinBitstreamDownloadPageComponent ],
imports: [ CommonModule, TranslateModule.forRoot() ],
providers: [
{ provide: ActivatedRoute, useValue: activatedRoute },
{ provide: Router, useValue: router },
{ provide: AuthorizationDataService, useValue: authorizationService },
{ provide: AuthService, useValue: authService },
{ provide: HardRedirectService, useValue: hardRedirectService },
{ provide: RequestService, useValue: requestService },
{ provide: HALEndpointService, useValue: halService },
{ provide: RemoteDataBuildService, useValue: rdbService },
{ provide: FileService, useValue: fileService },
]
})
.compileComponents();
});

// TODO uncomment and create tests
// beforeEach(() => {
// fixture = TestBed.createComponent(ClarinBitstreamDownloadPageComponent);
// component = fixture.componentInstance;
// fixture.detectChanges();
// });
//
// it('should create', () => {
// expect(component).toBeTruthy();
// });
beforeEach(() => {
fixture = TestBed.createComponent(ClarinBitstreamDownloadPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -41,26 +41,30 @@ export class ClarinBitstreamDownloadPageComponent implements OnInit {
bitstream$: Observable<Bitstream>;
bitstreamRD$: Observable<RemoteData<Bitstream>>;
downloadStatus: BehaviorSubject<string> = new BehaviorSubject('');
zipDownloadLink: BehaviorSubject<string> = new BehaviorSubject('');
dtoken: string;

constructor(
private route: ActivatedRoute,
protected route: ActivatedRoute,
protected router: Router,
private auth: AuthService,
protected auth: AuthService,
protected authorizationService: AuthorizationDataService,
private hardRedirectService: HardRedirectService,
private requestService: RequestService,
protected hardRedirectService: HardRedirectService,
protected requestService: RequestService,
protected rdbService: RemoteDataBuildService,
protected halService: HALEndpointService,
private fileService: FileService,
protected fileService: FileService,
) { }

ngOnInit(): void {
// Get dtoken
this.dtoken = isUndefined(this.route.snapshot.queryParams.dtoken) ? null : this.route.snapshot.queryParams.dtoken;

this.bitstreamRD$ = this.route.data.pipe(
map((data) => data.bitstream));
if (isUndefined(this.bitstreamRD$)) {
this.bitstreamRD$ = this.route.data.pipe(
filter((data) => hasValue(data.bitstream)),
map((data) => data.bitstream));
}

this.bitstream$ = this.bitstreamRD$.pipe(
redirectOn4xx(this.router, this.auth),
Expand Down Expand Up @@ -109,8 +113,17 @@ export class ClarinBitstreamDownloadPageComponent implements OnInit {
} else {
fileLink = isNotNull(this.dtoken) ? fileLink + '?dtoken=' + this.dtoken : fileLink;
}
bitstreamURL = isNotNull(this.dtoken) ? bitstreamURL + '?dtoken=' + this.dtoken : bitstreamURL ;
bitstreamURL = isNotNull(this.dtoken) ? bitstreamURL + '?dtoken=' + this.dtoken : bitstreamURL;
}
if (isNotEmpty(this.zipDownloadLink.getValue())) {
const authToken = fileLink.substring(fileLink.indexOf('authentication-token'));
const currentZipDownloadLink = this.zipDownloadLink.getValue();
const separator = currentZipDownloadLink.includes('?') ? '&' : '?';
fileLink = currentZipDownloadLink + separator + authToken;
bitstreamURL = this.zipDownloadLink.getValue();
}
// fileLink = 'http://localhost:8080/server/api/core/bitstreams/d9a41f84-a470-495a-8821-20e0a18e9276/content';
// bitstreamURL = 'http://localhost:8080/server/api/core/bitstreams/d9a41f84-a470-495a-8821-20e0a18e9276/content';
if ((isAuthorized || isAuthorizedByClarin) && isLoggedIn && isNotEmpty(fileLink)) {
this.downloadStatus.next(RequestEntryState.Success);
this.hardRedirectService.redirect(fileLink);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { ClarinZipDownloadPageComponent } from './clarin-zip-download-page.component';
import { TranslateModule } from '@ngx-translate/core';
import { ActivatedRoute, Router } from '@angular/router';
import { AuthService } from '../../core/auth/auth.service';
import { FileService } from '../../core/shared/file.service';
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { HardRedirectService } from '../../core/services/hard-redirect.service';
import { Bitstream } from '../../core/shared/bitstream.model';
import { of as observableOf } from 'rxjs';
import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils';
import { CommonModule } from '@angular/common';
import { RequestService } from '../../core/data/request.service';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
import { BitstreamFormatDataService } from '../../core/data/bitstream-format-data.service';
import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service';
import { BitstreamDataService } from '../../core/data/bitstream-data.service';
import { getMockRequestService } from '../../shared/mocks/request.service.mock';
import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub';
import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-build.service.mock';
import { ObjectCacheService } from '../../core/cache/object-cache.service';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub';

describe('ClarinZipDownloadPageComponent', () => {
let component: ClarinZipDownloadPageComponent;
let fixture: ComponentFixture<ClarinZipDownloadPageComponent>;

let authService: AuthService;
let fileService: FileService;
let authorizationService: AuthorizationDataService;
let hardRedirectService: HardRedirectService;
let activatedRoute;
let router;
let requestService: RequestService;
let halService: HALEndpointService;
let rdbService: RemoteDataBuildService;
let bitstreamService: BitstreamDataService;
let bitstreamFormatService: BitstreamFormatDataService;
let objectCache: ObjectCacheService;
let notificationService: NotificationsServiceStub;

let bitstream: Bitstream;

const url = 'fake-bitstream-url';
const bitstreamFormatHref = 'rest-api/bitstreamformats';

beforeEach(async () => {
authService = jasmine.createSpyObj('authService', {
isAuthenticated: observableOf(true),
setRedirectUrl: {}
});
authorizationService = jasmine.createSpyObj('authorizationSerivice', {
isAuthorized: observableOf(true)
});

fileService = jasmine.createSpyObj('fileService', {
retrieveFileDownloadLink: observableOf('content-url-with-headers')
});

hardRedirectService = jasmine.createSpyObj('fileService', {
redirect: {}
});
bitstream = Object.assign(new Bitstream(), {
uuid: 'bitstreamUuid',
_links: {
content: {href: 'bitstream-content-link'},
self: {href: 'bitstream-self-link'},
}
});

activatedRoute = {
data: observableOf({
bitstream: createSuccessfulRemoteDataObject(
bitstream
)
})
};

router = jasmine.createSpyObj('router', ['navigateByUrl']);

requestService = getMockRequestService();
halService = Object.assign(new HALEndpointServiceStub(url));
rdbService = getMockRemoteDataBuildService();
objectCache = jasmine.createSpyObj('objectCache', {
remove: jasmine.createSpy('remove')
});
bitstreamFormatService = jasmine.createSpyObj('bistreamFormatService', {
getBrowseEndpoint: observableOf(bitstreamFormatHref)
});

bitstreamService = new BitstreamDataService(requestService, rdbService, objectCache, halService, null, bitstreamFormatService, null, null);
notificationService = new NotificationsServiceStub();

await TestBed.configureTestingModule({
declarations: [ ClarinZipDownloadPageComponent ],
imports: [CommonModule, TranslateModule.forRoot()],
providers: [
{ provide: ActivatedRoute, useValue: activatedRoute },
{ provide: Router, useValue: router },
{ provide: AuthorizationDataService, useValue: authorizationService },
{ provide: AuthService, useValue: authService },
{ provide: FileService, useValue: fileService },
{ provide: HardRedirectService, useValue: hardRedirectService },
{ provide: NotificationsService, useValue: notificationService },
{ provide: RequestService, useValue: requestService },
{ provide: HALEndpointService, useValue: halService },
{ provide: RemoteDataBuildService, useValue: rdbService },
{ provide: BitstreamDataService, useValue: bitstreamService },
{ provide: BitstreamFormatDataService, useValue: bitstreamFormatService },
{ provide: ObjectCacheService, useValue: objectCache },
]
})
.compileComponents();
});

beforeEach(() => {
fixture = TestBed.createComponent(ClarinZipDownloadPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Loading
Loading