1+ import { BackwardCompatibilityService } from './backward-compatibility.service' ;
2+ import { ApiVersionEnum } from './api-version.constants' ;
3+
4+ describe ( 'BackwardCompatibilityService' , ( ) => {
5+ let service : BackwardCompatibilityService ;
6+
7+ beforeEach ( ( ) => {
8+ service = new BackwardCompatibilityService ( ) ;
9+ } ) ;
10+
11+ it ( 'should be defined' , ( ) => {
12+ expect ( service ) . toBeDefined ( ) ;
13+ } ) ;
14+
15+ describe ( 'transform' , ( ) => {
16+ it ( 'should return the same data if fromVersion equals toVersion' , ( ) => {
17+ const data = { id : 1 , name : 'Test' , email : 'test@example.com' } ;
18+
19+ const result = service . transform ( data , ApiVersionEnum . V2 , ApiVersionEnum . V2 , 'user' ) ;
20+
21+ expect ( result ) . toBe ( data ) ;
22+ } ) ;
23+
24+ describe ( 'V2 to V1 transformation' , ( ) => {
25+ it ( 'should transform user data from V2 to V1 format' , ( ) => {
26+ const v2UserData = {
27+ id : 1 ,
28+ name : 'John Doe' ,
29+ email : 'john@example.com' ,
30+ createdAt : '2026-01-01T00:00:00.000Z' ,
31+ updatedAt : '2026-01-02T00:00:00.000Z' ,
32+ trustScore : 85
33+ } ;
34+
35+ const result = service . transform ( v2UserData , ApiVersionEnum . V2 , ApiVersionEnum . V1 , 'user' ) ;
36+
37+ expect ( result ) . toEqual ( {
38+ id : 1 ,
39+ name : 'John Doe' ,
40+ email : 'john@example.com'
41+ } ) ;
42+ expect ( result ) . not . toHaveProperty ( 'createdAt' ) ;
43+ expect ( result ) . not . toHaveProperty ( 'updatedAt' ) ;
44+ expect ( result ) . not . toHaveProperty ( 'trustScore' ) ;
45+ } ) ;
46+
47+ it ( 'should transform property data from V2 to V1 format' , ( ) => {
48+ const v2PropertyData = {
49+ id : 1 ,
50+ address : '123 Main St' ,
51+ price : 500000 ,
52+ createdAt : '2026-01-01T00:00:00.000Z' ,
53+ verified : true
54+ } ;
55+
56+ const result = service . transform ( v2PropertyData , ApiVersionEnum . V2 , ApiVersionEnum . V1 , 'property' ) ;
57+
58+ expect ( result ) . toEqual ( {
59+ id : 1 ,
60+ address : '123 Main St' ,
61+ price : 500000
62+ } ) ;
63+ expect ( result ) . not . toHaveProperty ( 'createdAt' ) ;
64+ expect ( result ) . not . toHaveProperty ( 'verified' ) ;
65+ } ) ;
66+
67+ it ( 'should transform arrays of V2 data to V1' , ( ) => {
68+ const v2Users = [
69+ { id : 1 , name : 'John' , email : 'john@example.com' , createdAt : '2026-01-01' } ,
70+ { id : 2 , name : 'Jane' , email : 'jane@example.com' , createdAt : '2026-01-02' }
71+ ] ;
72+
73+ const result = service . transform ( v2Users , ApiVersionEnum . V2 , ApiVersionEnum . V1 , 'user' ) ;
74+
75+ expect ( result ) . toEqual ( [
76+ { id : 1 , name : 'John' , email : 'john@example.com' } ,
77+ { id : 2 , name : 'Jane' , email : 'jane@example.com' }
78+ ] ) ;
79+ } ) ;
80+ } ) ;
81+
82+ describe ( 'V1 to V2 transformation' , ( ) => {
83+ it ( 'should add V2 specific fields to user data when transforming from V1 to V2' , ( ) => {
84+ const v1UserData = {
85+ id : 1 ,
86+ name : 'John Doe' ,
87+ email : 'john@example.com'
88+ } ;
89+
90+ const result = service . transform ( v1UserData , ApiVersionEnum . V1 , ApiVersionEnum . V2 , 'user' ) ;
91+
92+ expect ( result ) . toHaveProperty ( 'id' , 1 ) ;
93+ expect ( result ) . toHaveProperty ( 'name' , 'John Doe' ) ;
94+ expect ( result ) . toHaveProperty ( 'email' , 'john@example.com' ) ;
95+ expect ( result ) . toHaveProperty ( 'createdAt' ) ;
96+ expect ( result ) . toHaveProperty ( 'updatedAt' ) ;
97+ } ) ;
98+ } ) ;
99+
100+ it ( 'should return original data if no transformer exists for the entity type' , ( ) => {
101+ const data = { id : 1 , someField : 'value' , anotherField : 'other' } ;
102+
103+ const result = service . transform ( data , ApiVersionEnum . V2 , ApiVersionEnum . V1 , 'unknown-entity' ) ;
104+
105+ expect ( result ) . toEqual ( data ) ;
106+ } ) ;
107+ } ) ;
108+
109+ describe ( 'register custom transformers' , ( ) => {
110+ it ( 'should register and use a custom V2 to V1 transformer' , ( ) => {
111+ const customTransformer = jest . fn ( ( data ) => ( { customField : data . originalField } ) ) ;
112+ service . registerV2ToV1Transformer ( 'custom-entity' , customTransformer ) ;
113+
114+ const data = { originalField : 'test' } ;
115+ const result = service . transform ( data , ApiVersionEnum . V2 , ApiVersionEnum . V1 , 'custom-entity' ) ;
116+
117+ expect ( customTransformer ) . toHaveBeenCalledWith ( data ) ;
118+ expect ( result ) . toEqual ( { customField : 'test' } ) ;
119+ } ) ;
120+
121+ it ( 'should register and use a custom V1 to V2 transformer' , ( ) => {
122+ const customTransformer = jest . fn ( ( data ) => ( { ...data , newField : 'added' } ) ) ;
123+ service . registerV1ToV2Transformer ( 'custom-entity' , customTransformer ) ;
124+
125+ const data = { originalField : 'test' } ;
126+ const result = service . transform ( data , ApiVersionEnum . V1 , ApiVersionEnum . V2 , 'custom-entity' ) ;
127+
128+ expect ( customTransformer ) . toHaveBeenCalledWith ( data ) ;
129+ expect ( result ) . toEqual ( { originalField : 'test' , newField : 'added' } ) ;
130+ } ) ;
131+ } ) ;
132+
133+ describe ( 'fieldExistsInVersion' , ( ) => {
134+ it ( 'should return true for fields that exist in the specified version' , ( ) => {
135+ expect ( service . fieldExistsInVersion ( 'id' , ApiVersionEnum . V1 , 'user' ) ) . toBe ( true ) ;
136+ expect ( service . fieldExistsInVersion ( 'name' , ApiVersionEnum . V2 , 'user' ) ) . toBe ( true ) ;
137+ expect ( service . fieldExistsInVersion ( 'createdAt' , ApiVersionEnum . V2 , 'user' ) ) . toBe ( true ) ;
138+ expect ( service . fieldExistsInVersion ( 'verified' , ApiVersionEnum . V2 , 'property' ) ) . toBe ( true ) ;
139+ } ) ;
140+
141+ it ( 'should return false for fields that do not exist in the specified version' , ( ) => {
142+ expect ( service . fieldExistsInVersion ( 'createdAt' , ApiVersionEnum . V1 , 'user' ) ) . toBe ( false ) ;
143+ expect ( service . fieldExistsInVersion ( 'trustScore' , ApiVersionEnum . V1 , 'user' ) ) . toBe ( false ) ;
144+ expect ( service . fieldExistsInVersion ( 'verified' , ApiVersionEnum . V1 , 'property' ) ) . toBe ( false ) ;
145+ } ) ;
146+
147+ it ( 'should return false for unknown entity types or fields' , ( ) => {
148+ expect ( service . fieldExistsInVersion ( 'anyField' , ApiVersionEnum . V1 , 'unknown-entity' ) ) . toBe ( false ) ;
149+ expect ( service . fieldExistsInVersion ( 'unknownField' , ApiVersionEnum . V1 , 'user' ) ) . toBe ( false ) ;
150+ } ) ;
151+ } ) ;
152+
153+ describe ( 'filterFieldsByVersion' , ( ) => {
154+ it ( 'should filter an object to only include fields available in the specified version' , ( ) => {
155+ const userData = {
156+ id : 1 ,
157+ name : 'John' ,
158+ email : 'john@example.com' ,
159+ createdAt : '2026-01-01' ,
160+ trustScore : 85
161+ } ;
162+
163+ const filteredForV1 = service . filterFieldsByVersion ( userData , ApiVersionEnum . V1 , 'user' ) ;
164+
165+ expect ( filteredForV1 ) . toEqual ( {
166+ id : 1 ,
167+ name : 'John' ,
168+ email : 'john@example.com'
169+ } ) ;
170+ expect ( filteredForV1 ) . not . toHaveProperty ( 'createdAt' ) ;
171+ expect ( filteredForV1 ) . not . toHaveProperty ( 'trustScore' ) ;
172+
173+ const filteredForV2 = service . filterFieldsByVersion ( userData , ApiVersionEnum . V2 , 'user' ) ;
174+ expect ( filteredForV2 ) . toEqual ( userData ) ;
175+ } ) ;
176+ } ) ;
177+ } ) ;
0 commit comments