@adobe/spacecat-shared-tier-client 1.3.2 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/package.json +1 -1
- package/src/tier-client.js +16 -0
- package/test/tier-client.test.js +59 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [@adobe/spacecat-shared-tier-client-v1.3.3](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-tier-client-v1.3.2...@adobe/spacecat-shared-tier-client-v1.3.3) (2025-11-27)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* support for revoke paid entitlement ([#1180](https://github.com/adobe/spacecat-shared/issues/1180)) ([f584c60](https://github.com/adobe/spacecat-shared/commit/f584c600937bb117f60cc6d5cab0dba5dda30d84))
|
|
7
|
+
|
|
1
8
|
# [@adobe/spacecat-shared-tier-client-v1.3.2](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-tier-client-v1.3.1...@adobe/spacecat-shared-tier-client-v1.3.2) (2025-11-25)
|
|
2
9
|
|
|
3
10
|
|
package/package.json
CHANGED
package/src/tier-client.js
CHANGED
|
@@ -294,6 +294,22 @@ class TierClient {
|
|
|
294
294
|
* @returns {Promise<object>} HTTP response object.
|
|
295
295
|
*/
|
|
296
296
|
async revokeEntitlement() {
|
|
297
|
+
const existing = await this.checkValidEntitlement();
|
|
298
|
+
if (existing.entitlement) {
|
|
299
|
+
if (existing.entitlement.getTier() === EntitlementModel.TIERS.PAID) {
|
|
300
|
+
throw new Error('Paid entitlement cannot be revoked');
|
|
301
|
+
}
|
|
302
|
+
await existing.entitlement.remove();
|
|
303
|
+
} else {
|
|
304
|
+
throw new Error('Entitlement not found');
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Revokes PAID/FREE entitlement for the current organization.
|
|
310
|
+
* @returns {Promise<object>} HTTP response object.
|
|
311
|
+
*/
|
|
312
|
+
async revokePaidEntitlement() {
|
|
297
313
|
const existing = await this.checkValidEntitlement();
|
|
298
314
|
if (existing.entitlement) {
|
|
299
315
|
await existing.entitlement.remove();
|
package/test/tier-client.test.js
CHANGED
|
@@ -568,6 +568,21 @@ describe('TierClient', () => {
|
|
|
568
568
|
expect(mockEntitlementWithRemove.remove.calledOnce).to.be.true;
|
|
569
569
|
});
|
|
570
570
|
|
|
571
|
+
it('should throw error when entitlement is PAID tier', async () => {
|
|
572
|
+
const mockPaidEntitlement = {
|
|
573
|
+
...mockEntitlement,
|
|
574
|
+
getTier: () => 'PAID',
|
|
575
|
+
remove: sandbox.stub().resolves(),
|
|
576
|
+
};
|
|
577
|
+
|
|
578
|
+
mockDataAccess.Entitlement
|
|
579
|
+
.findByOrganizationIdAndProductCode.resolves(mockPaidEntitlement);
|
|
580
|
+
mockDataAccess.SiteEnrollment.allBySiteId.resolves([]);
|
|
581
|
+
|
|
582
|
+
await expect(tierClient.revokeEntitlement()).to.be.rejectedWith('Paid entitlement cannot be revoked');
|
|
583
|
+
expect(mockPaidEntitlement.remove).to.not.have.been.called;
|
|
584
|
+
});
|
|
585
|
+
|
|
571
586
|
it('should throw error when entitlement does not exist', async () => {
|
|
572
587
|
mockDataAccess.Entitlement.findByOrganizationIdAndProductCode.resolves(null);
|
|
573
588
|
mockDataAccess.SiteEnrollment.allBySiteId.resolves([]);
|
|
@@ -618,6 +633,50 @@ describe('TierClient', () => {
|
|
|
618
633
|
});
|
|
619
634
|
});
|
|
620
635
|
|
|
636
|
+
describe('revokePaidEntitlement', () => {
|
|
637
|
+
it('should successfully revoke entitlement regardless of tier', async () => {
|
|
638
|
+
const mockPaidEntitlement = {
|
|
639
|
+
...mockEntitlement,
|
|
640
|
+
getTier: () => 'PAID',
|
|
641
|
+
remove: sandbox.stub().resolves(),
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
mockDataAccess.Entitlement.findByOrganizationIdAndProductCode.resolves(mockPaidEntitlement);
|
|
645
|
+
mockDataAccess.SiteEnrollment.allBySiteId.resolves([]);
|
|
646
|
+
|
|
647
|
+
await tierClient.revokePaidEntitlement();
|
|
648
|
+
|
|
649
|
+
expect(mockPaidEntitlement.remove.calledOnce).to.be.true;
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
it('should throw error when entitlement does not exist', async () => {
|
|
653
|
+
mockDataAccess.Entitlement.findByOrganizationIdAndProductCode.resolves(null);
|
|
654
|
+
mockDataAccess.SiteEnrollment.allBySiteId.resolves([]);
|
|
655
|
+
|
|
656
|
+
await expect(tierClient.revokePaidEntitlement()).to.be.rejectedWith('Entitlement not found');
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
it('should handle database errors during entitlement removal', async () => {
|
|
660
|
+
const mockEntitlementWithRemoveError = {
|
|
661
|
+
...mockEntitlement,
|
|
662
|
+
remove: sandbox.stub().rejects(new Error('Database error')),
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
mockDataAccess.Entitlement
|
|
666
|
+
.findByOrganizationIdAndProductCode.resolves(mockEntitlementWithRemoveError);
|
|
667
|
+
mockDataAccess.SiteEnrollment.allBySiteId.resolves([]);
|
|
668
|
+
|
|
669
|
+
await expect(tierClient.revokePaidEntitlement()).to.be.rejectedWith('Database error');
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
it('should propagate errors when checking valid entitlement', async () => {
|
|
673
|
+
mockDataAccess.Entitlement
|
|
674
|
+
.findByOrganizationIdAndProductCode
|
|
675
|
+
.rejects(new Error('Database error'));
|
|
676
|
+
|
|
677
|
+
await expect(tierClient.revokePaidEntitlement()).to.be.rejectedWith('Database error');
|
|
678
|
+
});
|
|
679
|
+
});
|
|
621
680
|
describe('getAllEnrollment', () => {
|
|
622
681
|
beforeEach(() => {
|
|
623
682
|
mockDataAccess.SiteEnrollment.allByEntitlementId = sandbox.stub();
|