Skip to content

Commit 3cc92a0

Browse files
authored
[ENG-8505] Next phase to adding the Google File Picker (#292)
* chore(misc): Fixed a test failure, updated jest.config.ts and changed to standAlone` * chore(compodocs): Disabled the pre-commit as it is useless for now * chore(jest): actions are now testable * chore(jest): enabled configure-addon.commponent.tst to be testable * chore(testing): updated the osf.testing.module for translation * chore(mocks): added global testing mocks and a new osftestingstoremodule * chore(tests): Added tests to continue the process * feat(code): added the condition for google drive * feat(google-file-picker): Added the initial google file picker component
1 parent 9d12372 commit 3cc92a0

25 files changed

Lines changed: 648 additions & 83 deletions

.husky/pre-commit

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ npx lint-staged || {
33
exit 1
44
}
55

6-
npm run docs:coverage || {
7-
printf "\n\nERROR: Documentation Coverage thresholds are not met."
8-
printf "\n\nIn the future this will block your ability to commit locally until it is resolved."
9-
printf "\n\nThe same pipeline runs via GitHub actions."
10-
printf "\n\nYou are seeing this error because code was added without documentation."
6+
# npm run docs:coverage || {
7+
# printf "\n\nERROR: Documentation Coverage thresholds are not met."
8+
# printf "\n\nIn the future this will block your ability to commit locally until it is resolved."
9+
# printf "\n\nThe same pipeline runs via GitHub actions."
10+
# printf "\n\nYou are seeing this error because code was added without documentation."
1111
# exit 1
12-
}
12+
# }

jest.config.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ module.exports = {
3030
'src/app/**/*.{ts,js}',
3131
'!src/app/app.config.ts',
3232
'!src/app/**/*.routes.{ts.js}',
33-
'!src/app/**/*.actions.{ts.js}',
3433
'!src/app/**/*.models.{ts.js}',
3534
'!src/app/**/*.model.{ts.js}',
3635
'!src/app/**/*.route.{ts,js}',
@@ -72,10 +71,13 @@ module.exports = {
7271
'<rootDir>/src/app/app.config.ts',
7372
'<rootDir>/src/app/app.routes.ts',
7473
'<rootDir>/src/app/features/registry/',
74+
'<rootDir>/src/app/features/project/addons/components/configure-configure-addon/',
75+
'<rootDir>/src/app/features/project/addons/components/connect-configured-addon/',
76+
'<rootDir>/src/app/features/project/addons/components/disconnect-addon-modal/',
77+
'<rootDir>/src/app/features/project/addons/components/confirm-account-connection-modal/',
7578
'<rootDir>/src/app/features/files/',
7679
'<rootDir>/src/app/features/my-projects/',
7780
'<rootDir>/src/app/features/preprints/',
78-
'<rootDir>/src/app/features/project/addons/',
7981
'<rootDir>/src/app/features/project/analytics/',
8082
'<rootDir>/src/app/features/project/contributors/',
8183
'<rootDir>/src/app/features/project/files/',

src/app/features/files/components/file-keywords/file-keywords.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
22

33
import { FileKeywordsComponent } from './file-keywords.component';
44

5-
import { OSFTestingModule } from '@testing/osf.testing.module';
5+
import { OSFTestingStoreModule } from '@testing/osf.testing.module';
66

77
describe('FileKeywordsComponent', () => {
88
let component: FileKeywordsComponent;
99
let fixture: ComponentFixture<FileKeywordsComponent>;
1010

1111
beforeEach(async () => {
1212
await TestBed.configureTestingModule({
13-
imports: [FileKeywordsComponent, OSFTestingModule],
13+
imports: [FileKeywordsComponent, OSFTestingStoreModule],
1414
}).compileComponents();
1515

1616
fixture = TestBed.createComponent(FileKeywordsComponent);

src/app/features/files/components/file-metadata/file-metadata.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
22

33
import { FileMetadataComponent } from './file-metadata.component';
44

5-
import { OSFTestingModule } from '@testing/osf.testing.module';
5+
import { OSFTestingStoreModule } from '@testing/osf.testing.module';
66

77
describe('FileMetadataComponent', () => {
88
let component: FileMetadataComponent;
99
let fixture: ComponentFixture<FileMetadataComponent>;
1010

1111
beforeEach(async () => {
1212
await TestBed.configureTestingModule({
13-
imports: [FileMetadataComponent, OSFTestingModule],
13+
imports: [FileMetadataComponent, OSFTestingStoreModule],
1414
}).compileComponents();
1515

1616
fixture = TestBed.createComponent(FileMetadataComponent);

src/app/features/files/components/file-resource-metadata/file-resource-metadata.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
22

33
import { FileResourceMetadataComponent } from './file-resource-metadata.component';
44

5-
import { OSFTestingModule } from '@testing/osf.testing.module';
5+
import { OSFTestingStoreModule } from '@testing/osf.testing.module';
66

77
describe('FileResourceMetadataComponent', () => {
88
let component: FileResourceMetadataComponent;
99
let fixture: ComponentFixture<FileResourceMetadataComponent>;
1010

1111
beforeEach(async () => {
1212
await TestBed.configureTestingModule({
13-
imports: [FileResourceMetadataComponent, OSFTestingModule],
13+
imports: [FileResourceMetadataComponent, OSFTestingStoreModule],
1414
}).compileComponents();
1515

1616
fixture = TestBed.createComponent(FileResourceMetadataComponent);

src/app/features/files/components/file-revisions/file-revisions.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
22

33
import { FileRevisionsComponent } from './file-revisions.component';
44

5-
import { OSFTestingModule } from '@testing/osf.testing.module';
5+
import { OSFTestingStoreModule } from '@testing/osf.testing.module';
66

77
describe('FileRevisionsComponent', () => {
88
let component: FileRevisionsComponent;
99
let fixture: ComponentFixture<FileRevisionsComponent>;
1010

1111
beforeEach(async () => {
1212
await TestBed.configureTestingModule({
13-
imports: [FileRevisionsComponent, OSFTestingModule],
13+
imports: [FileRevisionsComponent, OSFTestingStoreModule],
1414
}).compileComponents();
1515

1616
fixture = TestBed.createComponent(FileRevisionsComponent);

src/app/features/files/pages/file-detail/file-detail.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ import { SubHeaderComponent } from '@shared/components';
66

77
import { FileDetailComponent } from './file-detail.component';
88

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

1111
describe('FileDetailComponent', () => {
1212
let component: FileDetailComponent;
1313
let fixture: ComponentFixture<FileDetailComponent>;
1414

1515
beforeEach(async () => {
1616
await TestBed.configureTestingModule({
17-
imports: [FileDetailComponent, MockComponent(SubHeaderComponent), OSFTestingModule],
17+
imports: [FileDetailComponent, MockComponent(SubHeaderComponent), OSFTestingStoreModule],
1818
providers: [],
1919
}).compileComponents();
2020

src/app/features/project/addons/addons.component.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
import { provideStore } from '@ngxs/store';
2+
3+
import { signal } from '@angular/core';
14
import { ComponentFixture, TestBed } from '@angular/core/testing';
25

6+
import { UserSelectors, UserState } from '@core/store/user';
7+
import { AddonsState } from '@osf/shared/stores';
8+
39
import { AddonsComponent } from './addons.component';
410

511
import { OSFTestingModule } from '@testing/osf.testing.module';
@@ -11,6 +17,15 @@ describe('AddonsComponent', () => {
1117
beforeEach(async () => {
1218
await TestBed.configureTestingModule({
1319
imports: [AddonsComponent, OSFTestingModule],
20+
providers: [
21+
provideStore([UserState, AddonsState]),
22+
{
23+
provide: UserSelectors,
24+
useValue: {
25+
getCurrentUser: () => signal({ id: 'mock-user' }),
26+
},
27+
},
28+
],
1429
}).compileComponents();
1530

1631
fixture = TestBed.createComponent(AddonsComponent);

src/app/features/project/addons/components/configure-addon/configure-addon.component.html

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,8 @@ <h2 class="align-self-center">
6363
(keydown.enter)="toggleEditMode()"
6464
></p-button>
6565
</div>
66-
<!-- @if (storageAddon()) {
67-
<p class="text-lg">
68-
{{ storageAddon()?.wbKey }}
69-
</p>
70-
} @else { -->
7166
<osf-folder-selector
67+
[isGoogleFilePicker]="isGoogleDrive()"
7268
[accountName]="addon()?.displayName || ''"
7369
[operationInvocationResult]="operationInvocation()?.operationResult || []"
7470
[accountNameControl]="accountNameControl"
@@ -77,7 +73,6 @@ <h2 class="align-self-center">
7773
(save)="handleUpdateAddonConfiguration()"
7874
(cancelSelection)="toggleEditMode()"
7975
/>
80-
<!-- } -->
8176
</section>
8277
}
8378
</section>
Lines changed: 163 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,176 @@
1-
import { ComponentFixture, TestBed } from '@angular/core/testing';
1+
import { provideStore } from '@ngxs/store';
2+
3+
import { of } from 'rxjs';
4+
5+
import { HttpTestingController } from '@angular/common/http/testing';
6+
import { ComponentFixture, inject, TestBed } from '@angular/core/testing';
7+
import { ActivatedRoute, Router } from '@angular/router';
8+
9+
import { AddonsState } from '@osf/shared/stores';
210

311
import { ConfigureAddonComponent } from './configure-addon.component';
412

13+
import { getConfiguredAddonsData } from '@testing/data/addons/addons.configured.data';
14+
import { getAddonsOperationInvocation } from '@testing/data/addons/addons.operation-invocation.data';
15+
import { ToastServiceMock } from '@testing/mocks/toast.service.mock';
516
import { OSFTestingModule } from '@testing/osf.testing.module';
617

7-
describe('ConfigureAddonComponent', () => {
18+
describe('Component: Configure Addon', () => {
819
let component: ConfigureAddonComponent;
920
let fixture: ComponentFixture<ConfigureAddonComponent>;
1021

11-
beforeEach(async () => {
12-
await TestBed.configureTestingModule({
13-
imports: [ConfigureAddonComponent, OSFTestingModule],
14-
}).compileComponents();
22+
const mockActivatedRoute = {
23+
parent: {
24+
parent: {
25+
snapshot: {
26+
params: {
27+
id: 'mocked-id',
28+
},
29+
},
30+
},
31+
},
32+
snapshot: {
33+
paramMap: new Map(),
34+
queryParamMap: new Map(),
35+
data: {},
36+
},
37+
paramMap: of(new Map()),
38+
queryParamMap: of(new Map()),
39+
// ... if you use `route.root`, add a dummy root too
40+
root: {},
41+
};
42+
43+
describe('addon present', () => {
44+
beforeEach(async () => {
45+
const mockRouter = {
46+
url: '/project/abc123/addons/configure', // mock the actual URL used in your component
47+
navigate: jest.fn(),
48+
getCurrentNavigation: jest.fn().mockReturnValue({
49+
extras: {
50+
state: {
51+
addon: getConfiguredAddonsData(0),
52+
},
53+
},
54+
}),
55+
} as unknown as Router;
56+
57+
await TestBed.configureTestingModule({
58+
imports: [OSFTestingModule, ConfigureAddonComponent],
59+
providers: [
60+
provideStore([AddonsState]),
61+
ToastServiceMock,
62+
{ provide: Router, useValue: mockRouter },
63+
{
64+
provide: ActivatedRoute,
65+
useValue: mockActivatedRoute,
66+
},
67+
],
68+
}).compileComponents();
69+
70+
fixture = TestBed.createComponent(ConfigureAddonComponent);
71+
component = fixture.componentInstance;
72+
fixture.detectChanges();
73+
});
74+
75+
it('should validate the constuctor values', () => {
76+
expect(component.storageAddon()).toBeUndefined();
77+
expect(component.addon()).toEqual(
78+
Object({
79+
attributes: {
80+
connected_capabilities: ['ACCESS', 'UPDATE'],
81+
connected_operation_names: ['list_child_items', 'list_root_items', 'get_item_info'],
82+
current_user_is_owner: true,
83+
display_name: 'Google Drive',
84+
external_service_name: 'googledrive',
85+
root_folder: '0AIl0aR4C9JAFUk9PVA',
86+
},
87+
id: '756579dc-3a24-4849-8866-698a60846ac3',
88+
links: expect.any(Object),
89+
relationships: expect.any(Object),
90+
type: 'configured-storage-addons',
91+
})
92+
);
1593

16-
fixture = TestBed.createComponent(ConfigureAddonComponent);
17-
component = fixture.componentInstance;
18-
fixture.detectChanges();
94+
expect(component.baseUrl()).toBe('/project/abc123');
95+
expect(component.resourceUri()).toBe('https://staging4.osf.io/mocked-id');
96+
expect(component.addonTypeString()).toBe('storage');
97+
expect(component.selectedRootFolderId()).toBeUndefined();
98+
expect(component.accountNameControl.value).toBeUndefined();
99+
expect(component.isGoogleDrive()).toBeFalsy();
100+
});
101+
102+
it('should valid onInit - action called', inject([HttpTestingController], (httpMock: HttpTestingController) => {
103+
const request = httpMock.expectOne('https://addons.staging4.osf.io/v1/addon-operation-invocations/');
104+
expect(request.request.method).toBe('POST');
105+
request.flush(getAddonsOperationInvocation());
106+
107+
expect(component.operationInvocation()).toEqual(
108+
Object({
109+
id: '022c80d6-06b5-452d-9932-19bb135cd5c2',
110+
invocationStatus: 'SUCCESS',
111+
itemCount: 0,
112+
operationKwargs: {
113+
itemId: '0AIl0aR4C9JAFUk9PVA',
114+
itemType: undefined,
115+
},
116+
operationName: 'get_item_info',
117+
operationResult: [
118+
{
119+
canBeRoot: true,
120+
itemId: '0AIl0aR4C9JAFUk9PVA',
121+
itemName: 'My Drive',
122+
itemType: 'FOLDER',
123+
mayContainRootCandidates: true,
124+
},
125+
],
126+
type: 'addon-operation-invocations',
127+
})
128+
);
129+
expect(httpMock.verify).toBeTruthy();
130+
}));
19131
});
20132

21-
it('should create', () => {
22-
expect(component).toBeTruthy();
133+
describe('addon not-present', () => {
134+
beforeEach(async () => {
135+
const mockRouter = {
136+
url: '/project/abc123/addons/configure', // mock the actual URL used in your component
137+
navigate: jest.fn(),
138+
getCurrentNavigation: jest.fn().mockReturnValue({
139+
extras: {
140+
state: {
141+
addon: null,
142+
},
143+
},
144+
}),
145+
} as unknown as Router;
146+
147+
await TestBed.configureTestingModule({
148+
imports: [OSFTestingModule, ConfigureAddonComponent],
149+
providers: [
150+
provideStore([AddonsState]),
151+
ToastServiceMock,
152+
{ provide: Router, useValue: mockRouter },
153+
{
154+
provide: ActivatedRoute,
155+
useValue: mockActivatedRoute,
156+
},
157+
],
158+
}).compileComponents();
159+
160+
fixture = TestBed.createComponent(ConfigureAddonComponent);
161+
component = fixture.componentInstance;
162+
fixture.detectChanges();
163+
});
164+
165+
it('should validate user is redirected', () => {
166+
const spy = jest.spyOn(component['router'], 'navigate');
167+
expect(spy).toHaveBeenCalledWith(['/project/abc123/addons']);
168+
});
169+
170+
it('should valid onInit - action not called', inject([HttpTestingController], (httpMock: HttpTestingController) => {
171+
httpMock.expectNone('https://addons.staging4.osf.io/v1/addon-operation-invocations/');
172+
173+
expect(httpMock.verify).toBeTruthy();
174+
}));
23175
});
24176
});

0 commit comments

Comments
 (0)