Skip to content

Commit ecfb271

Browse files
committed
chore(datacite-tracker): added tests for file downloads tracking
1 parent 0306906 commit ecfb271

File tree

6 files changed

+172
-20
lines changed

6 files changed

+172
-20
lines changed

jest.config.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ module.exports = {
6868
'<rootDir>/src/app/features/project/addons/components/confirm-account-connection-modal/',
6969
'<rootDir>/src/app/features/files/components',
7070
'<rootDir>/src/app/features/files/pages/community-metadata',
71-
'<rootDir>/src/app/features/files/pages/file-detail',
7271
'<rootDir>/src/app/features/my-projects/',
7372
'<rootDir>/src/app/features/project/analytics/',
7473
'<rootDir>/src/app/features/project/contributors/',
Lines changed: 96 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,114 @@
1-
import { MockComponent } from 'ng-mocks';
1+
// Dependencies
2+
import { Store } from '@ngxs/store';
23

3-
import { ComponentFixture, TestBed } from '@angular/core/testing';
4+
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
5+
import { MockProvider } from 'ng-mocks';
6+
7+
import { ButtonGroupModule } from 'primeng/buttongroup';
8+
import { DialogService } from 'primeng/dynamicdialog';
9+
import { Message } from 'primeng/message';
10+
import { TagModule } from 'primeng/tag';
411

5-
import { SubHeaderComponent } from '@shared/components';
12+
import { of } from 'rxjs';
13+
14+
import { DestroyRef } from '@angular/core';
15+
import { ComponentFixture, TestBed } from '@angular/core/testing';
16+
import { FormsModule } from '@angular/forms';
17+
import { ActivatedRoute, Router, RouterLink } from '@angular/router';
618

7-
import { FileDetailComponent } from './file-detail.component';
19+
import { FileDetailComponent } from '@osf/features/files/pages/file-detail/file-detail.component';
20+
import {
21+
LinkedResourcesComponent,
22+
OverviewComponentsComponent,
23+
OverviewToolbarComponent,
24+
OverviewWikiComponent,
25+
RecentActivityComponent,
26+
} from '@osf/features/project/overview/components';
27+
import {
28+
LoadingSpinnerComponent,
29+
ResourceMetadataComponent,
30+
SubHeaderComponent,
31+
ViewOnlyLinkMessageComponent,
32+
} from '@shared/components';
33+
import { MOCK_STORE } from '@shared/mocks';
34+
import { CustomConfirmationService } from '@shared/services/custom-confirmation.service';
35+
import { DataciteService } from '@shared/services/datacite/datacite.service';
36+
import { ToastService } from '@shared/services/toast.service';
837

9-
import { OSFTestingStoreModule } from '@testing/osf.testing.module';
38+
import { OSFTestingModule } from '@testing/osf.testing.module';
1039

1140
describe('FileDetailComponent', () => {
12-
let component: FileDetailComponent;
1341
let fixture: ComponentFixture<FileDetailComponent>;
42+
let component: FileDetailComponent;
43+
let dataciteService: jest.Mocked<DataciteService>;
1444

1545
beforeEach(async () => {
46+
window.open = jest.fn();
47+
dataciteService = {
48+
logIdentifiableView: jest.fn().mockReturnValue(of(void 0)),
49+
logIdentifiableDownload: jest.fn().mockReturnValue(of(void 0)),
50+
} as unknown as jest.Mocked<DataciteService>;
51+
52+
const mockRoute: Partial<ActivatedRoute> = {
53+
params: of({ providerId: 'osf', preprintId: 'p1' }),
54+
queryParams: of({ providerId: 'osf', preprintId: 'p1' }),
55+
};
56+
(MOCK_STORE.selectSignal as jest.Mock).mockImplementation((selector) => {
57+
switch (selector) {
58+
default:
59+
return () => [];
60+
}
61+
});
62+
1663
await TestBed.configureTestingModule({
17-
imports: [FileDetailComponent, MockComponent(SubHeaderComponent), OSFTestingStoreModule],
18-
providers: [],
64+
imports: [
65+
FileDetailComponent,
66+
OSFTestingModule,
67+
ButtonGroupModule,
68+
TagModule,
69+
SubHeaderComponent,
70+
FormsModule,
71+
LoadingSpinnerComponent,
72+
OverviewWikiComponent,
73+
OverviewComponentsComponent,
74+
LinkedResourcesComponent,
75+
RecentActivityComponent,
76+
OverviewToolbarComponent,
77+
ResourceMetadataComponent,
78+
TranslatePipe,
79+
Message,
80+
RouterLink,
81+
ViewOnlyLinkMessageComponent,
82+
],
83+
providers: [
84+
TranslatePipe,
85+
{ provide: ActivatedRoute, useValue: mockRoute },
86+
{ provide: Store, useValue: MOCK_STORE },
87+
{ provide: DataciteService, useValue: dataciteService },
88+
Router,
89+
DestroyRef,
90+
MockProvider(ToastService),
91+
MockProvider(CustomConfirmationService),
92+
DialogService,
93+
TranslateService,
94+
],
1995
}).compileComponents();
20-
2196
fixture = TestBed.createComponent(FileDetailComponent);
2297
component = fixture.componentInstance;
2398
fixture.detectChanges();
2499
});
25100

26-
it('should create', () => {
27-
expect(component).toBeTruthy();
101+
afterEach(() => {
102+
jest.clearAllMocks();
103+
});
104+
105+
it('should call dataciteService.logIdentifiableDownload when downloadFile is triggered', () => {
106+
const link = '123';
107+
component.downloadFile(link);
108+
expect(dataciteService.logIdentifiableDownload).toHaveBeenCalledWith(component.fileMetadata$);
109+
});
110+
111+
it('should call dataciteService.logIdentifiableView on start ', () => {
112+
expect(dataciteService.logIdentifiableView).toHaveBeenCalledWith(component.fileMetadata$);
28113
});
29114
});

src/app/features/files/pages/files/files.component.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { Dialog } from 'primeng/dialog';
88
import { DialogService } from 'primeng/dynamicdialog';
99
import { TableModule } from 'primeng/table';
1010

11+
import { of } from 'rxjs';
12+
1113
import { signal } from '@angular/core';
1214
import { ComponentFixture, TestBed } from '@angular/core/testing';
1315
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@@ -24,6 +26,7 @@ import {
2426
import { GoogleFilePickerComponent } from '@osf/shared/components/addons/folder-selector/google-file-picker/google-file-picker.component';
2527
import { OsfFile } from '@osf/shared/models';
2628
import { CustomConfirmationService, FilesService } from '@osf/shared/services';
29+
import { DataciteService } from '@shared/services/datacite/datacite.service';
2730

2831
import { FilesSelectors } from '../../store';
2932

@@ -40,8 +43,15 @@ describe('Component: Files', () => {
4043
let fixture: ComponentFixture<FilesComponent>;
4144
const currentFolderSignal = signal(getNodeFilesMappedData(0));
4245

46+
let dataciteService: jest.Mocked<DataciteService>;
47+
4348
beforeEach(async () => {
4449
jest.clearAllMocks();
50+
window.open = jest.fn();
51+
dataciteService = {
52+
logFileView: jest.fn().mockReturnValue(of(void 0)),
53+
logFileDownload: jest.fn().mockReturnValue(of(void 0)),
54+
} as unknown as jest.Mocked<DataciteService>;
4555
await TestBed.configureTestingModule({
4656
imports: [
4757
OSFTestingModule,
@@ -63,7 +73,7 @@ describe('Component: Files', () => {
6373
FilesService,
6474
MockProvider(ActivatedRoute),
6575
MockProvider(CustomConfirmationService),
66-
76+
{ provide: DataciteService, useValue: dataciteService },
6777
DialogService,
6878
provideMockStore({
6979
signals: [
@@ -183,4 +193,12 @@ describe('Component: Files', () => {
183193
expect(dispatchSpy).not.toHaveBeenCalled();
184194
});
185195
});
196+
197+
describe('Download file', () => {
198+
it('', () => {
199+
component.resourceId.set('123');
200+
component.downloadFolder();
201+
expect(dataciteService.logFileDownload).toHaveBeenCalledWith('123', 'nodes');
202+
});
203+
});
186204
});

src/app/features/files/pages/files/files.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,9 @@ export class FilesComponent {
341341
const isRootFolder = !this.currentFolder()?.relationships?.parentFolderLink;
342342
const provider = this.currentRootFolder()?.folder?.provider ?? 'osfstorage';
343343
const resourcePath = this.urlMap.get(this.resourceType()) ?? 'nodes';
344-
this.dataciteService.logFileDownload(resourceId, resourcePath).subscribe();
345344

346345
if (resourceId && folderId) {
346+
this.dataciteService.logFileDownload(resourceId, resourcePath).subscribe();
347347
if (isRootFolder) {
348348
const link = this.filesService.getFolderDownloadLink(resourceId, provider, '', true);
349349
window.open(link, '_blank')?.focus();

src/app/features/preprints/components/preprint-details/share-and-downlaod/share-and-download.component.spec.ts

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,85 @@ import { Store } from '@ngxs/store';
22

33
import { MockProvider } from 'ng-mocks';
44

5+
import { of } from 'rxjs';
6+
57
import { ComponentFixture, TestBed } from '@angular/core/testing';
68

9+
import { ProviderReviewsWorkflow } from '@osf/features/preprints/enums';
10+
import { PreprintProviderDetails } from '@osf/features/preprints/models';
711
import { PreprintSelectors } from '@osf/features/preprints/store/preprint';
12+
import { ReviewPermissions } from '@osf/shared/enums';
813
import { MOCK_STORE } from '@shared/mocks';
14+
import { DataciteService } from '@shared/services/datacite/datacite.service';
915

1016
import { ShareAndDownloadComponent } from './share-and-download.component';
1117

12-
describe.skip('ShareAndDownloadComponent', () => {
18+
import { OSFTestingModule } from '@testing/osf.testing.module';
19+
20+
export const mockPreprintProvider: PreprintProviderDetails = {
21+
id: 'osf-preprints',
22+
name: 'OSF Preprints',
23+
descriptionHtml: '<p>Open preprints for all disciplines</p>',
24+
advisoryBoardHtml: '<p>Advisory board content here</p>',
25+
examplePreprintId: '12345',
26+
domain: 'osf.io',
27+
footerLinksHtml: '<a href="/about">About</a>',
28+
preprintWord: 'preprint',
29+
allowSubmissions: true,
30+
assertionsEnabled: false,
31+
reviewsWorkflow: ProviderReviewsWorkflow.PreModeration,
32+
permissions: [ReviewPermissions.ViewSubmissions],
33+
brand: {
34+
id: 'brand-1',
35+
name: 'OSF Brand',
36+
heroLogoImageUrl: 'https://osf.io/assets/hero-logo.png',
37+
heroBackgroundImageUrl: 'https://osf.io/assets/hero-bg.png',
38+
topNavLogoImageUrl: 'https://osf.io/assets/nav-logo.png',
39+
primaryColor: '#0056b3',
40+
secondaryColor: '#ff9900',
41+
backgroundColor: '#ffffff',
42+
},
43+
iri: 'https://osf.io/preprints/',
44+
faviconUrl: 'https://osf.io/favicon.ico',
45+
squareColorNoTransparentImageUrl: 'https://osf.io/image.png',
46+
facebookAppId: '1234567890',
47+
reviewsCommentsPrivate: null,
48+
reviewsCommentsAnonymous: null,
49+
lastFetched: Date.now(),
50+
};
51+
describe('ShareAndDownloadComponent', () => {
1352
let component: ShareAndDownloadComponent;
1453
let fixture: ComponentFixture<ShareAndDownloadComponent>;
54+
let dataciteService: jest.Mocked<DataciteService>;
1555

1656
beforeEach(async () => {
57+
dataciteService = {
58+
logIdentifiableView: jest.fn().mockReturnValue(of(void 0)),
59+
logIdentifiableDownload: jest.fn().mockReturnValue(of(void 0)),
60+
} as unknown as jest.Mocked<DataciteService>;
1761
(MOCK_STORE.selectSignal as jest.Mock).mockImplementation((selector) => {
1862
if (selector === PreprintSelectors.getPreprint) return () => null;
1963
if (selector === PreprintSelectors.isPreprintLoading) return () => false;
2064
return () => null;
2165
});
2266

2367
await TestBed.configureTestingModule({
24-
imports: [ShareAndDownloadComponent],
25-
providers: [MockProvider(Store, MOCK_STORE)],
68+
imports: [ShareAndDownloadComponent, OSFTestingModule],
69+
providers: [MockProvider(Store, MOCK_STORE), { provide: DataciteService, useValue: dataciteService }],
2670
}).compileComponents();
2771

2872
fixture = TestBed.createComponent(ShareAndDownloadComponent);
2973
component = fixture.componentInstance;
74+
fixture.componentRef.setInput('preprintProvider', mockPreprintProvider);
3075
fixture.detectChanges();
3176
});
3277

33-
it('should create', () => {
34-
expect(component).toBeTruthy();
78+
it('should call dataciteService.logIdentifiableDownload when logDownload is triggered', () => {
79+
component.logDownload();
80+
expect(dataciteService.logIdentifiableDownload).toHaveBeenCalledWith(component.preprint$);
81+
});
82+
83+
it('should call dataciteService.logIdentifiableView on start ', () => {
84+
expect(dataciteService.logIdentifiableView).toHaveBeenCalledWith(component.preprint$);
3585
});
3686
});

src/app/features/preprints/components/preprint-details/share-and-downlaod/share-and-download.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export class ShareAndDownloadComponent {
4949
return this.socialShareService.createDownloadUrl(preprint.id);
5050
});
5151

52-
protected logDownload() {
52+
logDownload() {
5353
this.dataciteService.logIdentifiableDownload(this.preprint$).subscribe();
5454
}
5555

0 commit comments

Comments
 (0)