From 69194817845c377aa48c73a75f919f9dc175e403 Mon Sep 17 00:00:00 2001 From: pm-priyanka-deshmane <107103300+pm-priyanka-deshmane@users.noreply.github.com> Date: Thu, 19 Feb 2026 14:05:37 +0530 Subject: [PATCH 1/2] Adding support for privacyLink --- modules/pubmaticBidAdapter.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/pubmaticBidAdapter.js b/modules/pubmaticBidAdapter.js index f23665670e9..64d32454f67 100644 --- a/modules/pubmaticBidAdapter.js +++ b/modules/pubmaticBidAdapter.js @@ -256,6 +256,11 @@ const toOrtbNativeRequest = legacyNativeAssets => { continue; } + if (key === 'privacyLink') { + ortb.privacy = 1; + continue; + } + const asset = legacyNativeAssets[key]; const required = asset.required && isBoolean(asset.required) ? 1 : 0; const ortbAsset = { id: ortb.assets.length, required }; From 641dc2bf0e61c28981c3c1db5f3000b2c8524f56 Mon Sep 17 00:00:00 2001 From: priyankadeshmane Date: Thu, 19 Feb 2026 14:52:22 +0530 Subject: [PATCH 2/2] Adding test cases --- test/spec/modules/pubmaticBidAdapter_spec.js | 119 +++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/test/spec/modules/pubmaticBidAdapter_spec.js b/test/spec/modules/pubmaticBidAdapter_spec.js index 2ed65dd7311..8273552e746 100644 --- a/test/spec/modules/pubmaticBidAdapter_spec.js +++ b/test/spec/modules/pubmaticBidAdapter_spec.js @@ -716,6 +716,125 @@ describe('PubMatic adapter', () => { expect(imp).to.be.an('array'); expect(imp[0]).to.have.property('native'); }); + + describe('privacyLink handling in native request', () => { + it('should set ortb.privacy to 1 when privacyLink is present', () => { + const nativeParams = { + title: { + required: true, + length: 80 + }, + image: { + required: true, + sizes: [300, 250] + }, + privacyLink: { + required: false + } + }; + const bidRequest = utils.deepClone(validBidRequests[0]); + delete bidRequest.mediaTypes.banner; + delete bidRequest.mediaTypes.video; + bidRequest.mediaTypes.native = nativeParams; + bidRequest.sizes = undefined; + const request = spec.buildRequests([bidRequest], bidderRequest); + const nativeRequest = JSON.parse(request.data.imp[0].native.request); + expect(nativeRequest).to.have.property('privacy', 1); + }); + + it('should skip privacyLink asset and not add it to assets array', () => { + const nativeParams = { + title: { + required: true, + length: 80 + }, + privacyLink: { + required: false + } + }; + const bidRequest = utils.deepClone(validBidRequests[0]); + delete bidRequest.mediaTypes.banner; + delete bidRequest.mediaTypes.video; + bidRequest.mediaTypes.native = nativeParams; + bidRequest.sizes = undefined; + const request = spec.buildRequests([bidRequest], bidderRequest); + const nativeRequest = JSON.parse(request.data.imp[0].native.request); + const privacyAsset = nativeRequest.assets.find(asset => asset.id === 'privacyLink'); + expect(privacyAsset).to.be.undefined; + }); + + it('should set privacy to 1 even when privacyLink is required', () => { + const nativeParams = { + title: { + required: true, + length: 80 + }, + privacyLink: { + required: true + } + }; + const bidRequest = utils.deepClone(validBidRequests[0]); + delete bidRequest.mediaTypes.banner; + delete bidRequest.mediaTypes.video; + bidRequest.mediaTypes.native = nativeParams; + bidRequest.sizes = undefined; + const request = spec.buildRequests([bidRequest], bidderRequest); + const nativeRequest = JSON.parse(request.data.imp[0].native.request); + expect(nativeRequest).to.have.property('privacy', 1); + }); + + it('should handle multiple native assets with privacyLink', () => { + const nativeParams = { + title: { + required: true, + length: 80 + }, + image: { + required: true, + sizes: [300, 250] + }, + sponsoredBy: { + required: true + }, + privacyLink: { + required: false + } + }; + const bidRequest = utils.deepClone(validBidRequests[0]); + delete bidRequest.mediaTypes.banner; + delete bidRequest.mediaTypes.video; + bidRequest.mediaTypes.native = nativeParams; + bidRequest.sizes = undefined; + const request = spec.buildRequests([bidRequest], bidderRequest); + const nativeRequest = JSON.parse(request.data.imp[0].native.request); + expect(nativeRequest).to.have.property('privacy', 1); + expect(nativeRequest.assets).to.be.an('array'); + expect(nativeRequest.assets.length).to.be.greaterThan(0); + const privacyAsset = nativeRequest.assets.find(asset => asset.id === 'privacyLink'); + expect(privacyAsset).to.be.undefined; + }); + + it('should not add privacy property when privacyLink is not present', () => { + const nativeParams = { + title: { + required: true, + length: 80 + }, + image: { + required: true, + sizes: [300, 250] + } + }; + const bidRequest = utils.deepClone(validBidRequests[0]); + delete bidRequest.mediaTypes.banner; + delete bidRequest.mediaTypes.video; + bidRequest.mediaTypes.native = nativeParams; + bidRequest.sizes = undefined; + const request = spec.buildRequests([bidRequest], bidderRequest); + const nativeRequest = JSON.parse(request.data.imp[0].native.request); + expect(nativeRequest).to.not.have.property('privacy'); + }); + }); }); } describe('ShouldAddDealTargeting', () => {