Skip to content

Commit 73b2bd1

Browse files
committed
fix(user-data): add datatype to IUserData abstract class & tests
1 parent 04ba804 commit 73b2bd1

File tree

2 files changed

+128
-29
lines changed

2 files changed

+128
-29
lines changed

packages/compass-user-data/src/user-data.spec.ts

Lines changed: 104 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -715,11 +715,26 @@ describe('AtlasUserData', function () {
715715

716716
context('AtlasUserData.updateAttributes', function () {
717717
it('updates data successfully', async function () {
718-
const putResponse = { name: 'Updated Name', hasDarkMode: false };
719-
authenticatedFetchStub.resolves(mockResponse(putResponse));
720-
getResourceUrlStub.resolves(
721-
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj/test-id'
722-
);
718+
const getResponse = {
719+
data: JSON.stringify({ name: 'Original Name', hasDarkMode: true }),
720+
};
721+
const putResponse = {};
722+
723+
authenticatedFetchStub
724+
.onFirstCall()
725+
.resolves(mockResponse(getResponse))
726+
.onSecondCall()
727+
.resolves(mockResponse(putResponse));
728+
729+
getResourceUrlStub
730+
.onFirstCall()
731+
.resolves(
732+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj'
733+
)
734+
.onSecondCall()
735+
.resolves(
736+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj/test-id'
737+
);
723738

724739
const userData = getAtlasUserData();
725740
const result = await userData.updateAttributes('test-id', {
@@ -729,20 +744,42 @@ describe('AtlasUserData', function () {
729744

730745
expect(result).equals(true);
731746

732-
expect(authenticatedFetchStub).to.have.been.calledOnce;
733-
const [url, options] = authenticatedFetchStub.firstCall.args;
734-
expect(url).to.equal(
747+
expect(authenticatedFetchStub).to.have.been.calledTwice;
748+
749+
const [getUrl, getOptions] = authenticatedFetchStub.firstCall.args;
750+
expect(getUrl).to.equal(
751+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj'
752+
);
753+
expect(getOptions.method).to.equal('GET');
754+
755+
const [putUrl, putOptions] = authenticatedFetchStub.secondCall.args;
756+
expect(putUrl).to.equal(
735757
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj/test-id'
736758
);
737-
expect(options.method).to.equal('PUT');
738-
expect(options.headers['Content-Type']).to.equal('application/json');
759+
expect(putOptions.method).to.equal('PUT');
760+
expect(putOptions.headers['Content-Type']).to.equal('application/json');
739761
});
740762

741763
it('returns false when response is not ok', async function () {
742-
authenticatedFetchStub.resolves(mockResponse({}, false, 400));
743-
getResourceUrlStub.resolves(
744-
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj'
745-
);
764+
const getResponse = {
765+
data: JSON.stringify({ name: 'Original Name', hasDarkMode: true }),
766+
};
767+
768+
authenticatedFetchStub
769+
.onFirstCall()
770+
.resolves(mockResponse(getResponse))
771+
.onSecondCall()
772+
.resolves(mockResponse({}, false, 400));
773+
774+
getResourceUrlStub
775+
.onFirstCall()
776+
.resolves(
777+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj'
778+
)
779+
.onSecondCall()
780+
.resolves(
781+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj/test-id'
782+
);
746783

747784
const userData = getAtlasUserData();
748785

@@ -753,11 +790,26 @@ describe('AtlasUserData', function () {
753790
});
754791

755792
it('uses custom serializer for request body', async function () {
756-
const putResponse = { name: 'Updated' };
757-
authenticatedFetchStub.resolves(mockResponse(putResponse));
758-
getResourceUrlStub.resolves(
759-
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj'
760-
);
793+
const getResponse = {
794+
data: JSON.stringify({ name: 'Original Name', hasDarkMode: true }),
795+
};
796+
const putResponse = {};
797+
798+
authenticatedFetchStub
799+
.onFirstCall()
800+
.resolves(mockResponse(getResponse))
801+
.onSecondCall()
802+
.resolves(mockResponse(putResponse));
803+
804+
getResourceUrlStub
805+
.onFirstCall()
806+
.resolves(
807+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj'
808+
)
809+
.onSecondCall()
810+
.resolves(
811+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/test-org/test-proj/test-id'
812+
);
761813

762814
const userData = new AtlasUserData(
763815
getTestSchema(),
@@ -773,8 +825,10 @@ describe('AtlasUserData', function () {
773825

774826
await userData.updateAttributes('test-id', { name: 'Updated' });
775827

776-
const [, options] = authenticatedFetchStub.firstCall.args;
777-
expect(options.body as string).to.equal('custom:{"name":"Updated"}');
828+
const [, putOptions] = authenticatedFetchStub.secondCall.args;
829+
expect(putOptions.body as string).to.equal(
830+
'custom:{"name":"Updated","hasDarkMode":true,"hasWebSupport":false}'
831+
);
778832
});
779833
});
780834

@@ -826,17 +880,39 @@ describe('AtlasUserData', function () {
826880
});
827881

828882
it('constructs URL correctly for update operation', async function () {
829-
const putResponse = { data: { name: 'Updated' } };
830-
authenticatedFetchStub.resolves(mockResponse(putResponse));
831-
getResourceUrlStub.resolves(
832-
'cluster-connection.cloud.mongodb.com/FavoriteQueries/org123/proj456/item789'
833-
);
883+
const getResponse = {
884+
data: JSON.stringify({ name: 'Original', hasDarkMode: true }),
885+
};
886+
const putResponse = {};
887+
888+
authenticatedFetchStub
889+
.onFirstCall()
890+
.resolves(mockResponse(getResponse))
891+
.onSecondCall()
892+
.resolves(mockResponse(putResponse));
893+
894+
getResourceUrlStub
895+
.onFirstCall()
896+
.resolves(
897+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/org123/proj456'
898+
)
899+
.onSecondCall()
900+
.resolves(
901+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/org123/proj456/item789'
902+
);
834903

835904
const userData = getAtlasUserData({}, 'org123', 'proj456');
836905
await userData.updateAttributes('item789', { name: 'Updated' });
837906

838-
const [url] = authenticatedFetchStub.firstCall.args;
839-
expect(url).to.equal(
907+
expect(authenticatedFetchStub).to.have.been.calledTwice;
908+
909+
const [getUrl] = authenticatedFetchStub.firstCall.args;
910+
expect(getUrl).to.equal(
911+
'cluster-connection.cloud.mongodb.com/FavoriteQueries/org123/proj456'
912+
);
913+
914+
const [putUrl] = authenticatedFetchStub.secondCall.args;
915+
expect(putUrl).to.equal(
840916
'cluster-connection.cloud.mongodb.com/FavoriteQueries/org123/proj456/item789'
841917
);
842918
});

packages/compass-user-data/src/user-data.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,29 @@ export class AtlasUserData<T extends z.Schema> extends IUserData<T> {
481481
data: Partial<z.input<T>>
482482
): Promise<boolean> {
483483
try {
484+
// TODO: change this depending on whether or not updateAttributes can provide all current data
485+
const getResponse = await this.authenticatedFetch(
486+
await this.getResourceUrl(
487+
`${this.dataType}/${this.orgId}/${this.projectId}/${id}`
488+
),
489+
{
490+
method: 'GET',
491+
}
492+
);
493+
if (!getResponse.ok) {
494+
throw new Error(
495+
`Failed to fetch data: ${getResponse.status} ${getResponse.statusText}`
496+
);
497+
}
498+
const prevData = await getResponse.json();
499+
const validPrevData = this.validator.parse(
500+
this.deserialize(prevData.data as string)
501+
);
502+
const newData: z.input<T> = {
503+
...validPrevData,
504+
...data,
505+
};
506+
484507
const response = await this.authenticatedFetch(
485508
await this.getResourceUrl(
486509
`${this.dataType}/${this.orgId}/${this.projectId}/${id}`
@@ -490,7 +513,7 @@ export class AtlasUserData<T extends z.Schema> extends IUserData<T> {
490513
headers: {
491514
'Content-Type': 'application/json',
492515
},
493-
body: this.serialize(data),
516+
body: this.serialize(newData),
494517
}
495518
);
496519
if (!response.ok) {

0 commit comments

Comments
 (0)