Merge pull request #13907 from ivangonzalezacuna/fix/user-settings-guest-mode

Fix '.set()' quest mode in user settings
This commit is contained in:
Patrik Oldsberg
2022-09-29 13:45:31 +02:00
committed by GitHub
3 changed files with 54 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-user-settings': patch
---
Prevent `.set()` to execute a request to the StorageClient if the user is `guest`
@@ -38,6 +38,10 @@ describe('Persistent Storage API', () => {
const mockIdentityApi: Partial<IdentityApi> = {
getCredentials: async () => ({ token: 'a-token' }),
};
const mockIdentityApiFallback: Partial<IdentityApi> = {
// This API recreates the guest mode, where the WebStorage is used as fallback
getCredentials: async () => ({}),
};
const createPersistentStorage = (
args?: Partial<{
@@ -56,6 +60,23 @@ describe('Persistent Storage API', () => {
});
};
const createPersistentStorageFallback = (
args?: Partial<{
fetchApi: FetchApi;
discoveryApi: DiscoveryApi;
errorApi: ErrorApi;
namespace?: string;
}>,
): StorageApi => {
return UserSettingsStorage.create({
errorApi: mockErrorApi,
fetchApi: new MockFetchApi(),
discoveryApi: mockDiscoveryApi,
identityApi: mockIdentityApiFallback as IdentityApi,
...args,
});
};
afterEach(() => {
jest.resetAllMocks();
});
@@ -124,6 +145,33 @@ describe('Persistent Storage API', () => {
await storage.set('my-key', dummyValue);
});
it('should fallback set when user not logged in', async () => {
const storage = createPersistentStorageFallback();
const selectedKeyNextHandler = jest.fn();
const dummyValue = 'my-value';
await new Promise<void>(resolve => {
storage.observe$<typeof dummyValue>('my-key').subscribe({
next: snapshot => {
selectedKeyNextHandler(snapshot);
if (snapshot.presence === 'present') {
resolve();
}
},
});
storage.set('my-key', dummyValue);
});
expect(selectedKeyNextHandler).toHaveBeenCalledTimes(1);
expect(selectedKeyNextHandler).toHaveBeenCalledWith({
key: 'my-key',
value: dummyValue,
presence: 'present',
});
});
it('should subscribe to key changes when setting a new value', async () => {
const storage = createPersistentStorage();
@@ -118,6 +118,7 @@ export class UserSettingsStorage implements StorageApi {
if (!(await this.isSignedIn())) {
await this.fallback.set(key, data);
this.notifyChanges({ key, presence: 'present', value: data });
return;
}
const fetchUrl = await this.getFetchUrl(key);