@adobe/spacecat-shared-tier-client 1.3.2 → 1.3.4

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 CHANGED
@@ -1,3 +1,17 @@
1
+ # [@adobe/spacecat-shared-tier-client-v1.3.4](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-tier-client-v1.3.3...@adobe/spacecat-shared-tier-client-v1.3.4) (2025-11-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * update to node 24 ([#1179](https://github.com/adobe/spacecat-shared/issues/1179)) ([0e60c0a](https://github.com/adobe/spacecat-shared/commit/0e60c0ab791b47662d07822f7c93009a8f7048fd))
7
+
8
+ # [@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)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * support for revoke paid entitlement ([#1180](https://github.com/adobe/spacecat-shared/issues/1180)) ([f584c60](https://github.com/adobe/spacecat-shared/commit/f584c600937bb117f60cc6d5cab0dba5dda30d84))
14
+
1
15
  # [@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
16
 
3
17
 
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@adobe/spacecat-shared-tier-client",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "description": "Shared modules of the Spacecat Services - Tier Client",
5
5
  "type": "module",
6
6
  "engines": {
7
- "node": ">=22.0.0 <23.0.0",
7
+ "node": ">=22.0.0 <25.0.0",
8
8
  "npm": ">=10.9.0 <12.0.0"
9
9
  },
10
10
  "main": "src/index.js",
@@ -35,8 +35,8 @@
35
35
  "access": "public"
36
36
  },
37
37
  "dependencies": {
38
- "@adobe/spacecat-shared-utils": "1.66.0",
39
- "@adobe/spacecat-shared-data-access": "^2.61.3"
38
+ "@adobe/spacecat-shared-utils": "1.81.0",
39
+ "@adobe/spacecat-shared-data-access": "2.88.3"
40
40
  },
41
41
  "devDependencies": {
42
42
  "c8": "10.1.3",
@@ -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();
@@ -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();