Skip to content

Commit

Permalink
StackAdapt Audiences destination (#2390)
Browse files Browse the repository at this point in the history
* Feature(IDE-2251): creates authentication header and sample gql caller

* nit

* Feature(IDE-2258): Perform and perform batch functions for Segment audience destination

* Pass audience ID and audience name as specific fields

* Use global domain variable

* Feature(IDE-2305): Implement onDelete handler

* Change external provider to segmentio

* Feature(IDE-2338): Force profile fields to camelCase

* Feature(IDE-2356): Handle alias events

* Make previous_id camelCase

* Feature(IDE-2335): Dynamic field for advertiser ID that loads options from our API (#7)

* Feature(IDE-2335): Dynamic field for Audience ID that loads audience list from our API

* Correct audience to advertiser

* Feature(IDE-2546): Profile and audience mappings (#9)

* Feature(IDE-2546): Profile and audience mappings

* Update audience mapping destination keys

* Change marketing status name

* Alias userId to external_id

* Prepare for submission to Segment.io

* Use prod URL

* Address feedback from PR

* Update request due to change to backend API

* Separate audience and profile handling actions

* Cleanup

---------

Co-authored-by: Ricky Zhong <[email protected]>
Co-authored-by: Ricky Weijie Zhong <[email protected]>
  • Loading branch information
3 people authored Sep 17, 2024
1 parent f775e54 commit acd3145
Show file tree
Hide file tree
Showing 14 changed files with 1,558 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Testing snapshot for actions-stackadapt-audiences destination: forwardAudienceEvent action - all fields 1`] = `
Object {
"query": "mutation {
upsertProfiles(
input: {
advertiserId: 84GW[vK%wv2xv@UF5iy,
externalProvider: \\"segmentio\\",
syncId: \\"7bcb527cec5517b1155595cd74dc96b6db6ed1d0c54b91ebe04297f3524bd775\\",
profiles: \\"[{\\\\\\"userId\\\\\\":\\\\\\"84GW[vK%wv2xv@UF5iy\\\\\\",\\\\\\"audienceId\\\\\\":\\\\\\"84GW[vK%wv2xv@UF5iy\\\\\\",\\\\\\"audienceName\\\\\\":\\\\\\"84GW[vK%wv2xv@UF5iy\\\\\\",\\\\\\"action\\\\\\":\\\\\\"exit\\\\\\"}]\\"
}
) {
userErrors {
message
}
}
upsertProfileMapping(
input: {
advertiserId: 84GW[vK%wv2xv@UF5iy,
mappingSchema: \\"[{\\\\\\"incoming_key\\\\\\":\\\\\\"userId\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"external_id\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\",\\\\\\"is_pii\\\\\\":false}]\\",
mappableType: \\"segmentio\\",
}
) {
userErrors {
message
}
}
upsertExternalAudienceMapping(
input: {
advertiserId: 84GW[vK%wv2xv@UF5iy,
mappingSchema: \\"[{\\\\\\"incoming_key\\\\\\":\\\\\\"audienceId\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"external_id\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\"},{\\\\\\"incoming_key\\\\\\":\\\\\\"audienceName\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"name\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\"}]\\",
mappableType: \\"segmentio\\"
}
) {
userErrors {
message
}
}
}",
}
`;
exports[`Testing snapshot for actions-stackadapt-audiences destination: forwardAudienceEvent action - required fields 1`] = `
Object {
"query": "mutation {
upsertProfiles(
input: {
advertiserId: 84GW[vK%wv2xv@UF5iy,
externalProvider: \\"segmentio\\",
syncId: \\"7bcb527cec5517b1155595cd74dc96b6db6ed1d0c54b91ebe04297f3524bd775\\",
profiles: \\"[{\\\\\\"userId\\\\\\":\\\\\\"84GW[vK%wv2xv@UF5iy\\\\\\",\\\\\\"audienceId\\\\\\":\\\\\\"84GW[vK%wv2xv@UF5iy\\\\\\",\\\\\\"audienceName\\\\\\":\\\\\\"84GW[vK%wv2xv@UF5iy\\\\\\",\\\\\\"action\\\\\\":\\\\\\"exit\\\\\\"}]\\"
}
) {
userErrors {
message
}
}
upsertProfileMapping(
input: {
advertiserId: 84GW[vK%wv2xv@UF5iy,
mappingSchema: \\"[{\\\\\\"incoming_key\\\\\\":\\\\\\"userId\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"external_id\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\",\\\\\\"is_pii\\\\\\":false}]\\",
mappableType: \\"segmentio\\",
}
) {
userErrors {
message
}
}
upsertExternalAudienceMapping(
input: {
advertiserId: 84GW[vK%wv2xv@UF5iy,
mappingSchema: \\"[{\\\\\\"incoming_key\\\\\\":\\\\\\"audienceId\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"external_id\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\"},{\\\\\\"incoming_key\\\\\\":\\\\\\"audienceName\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"name\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\"}]\\",
mappableType: \\"segmentio\\"
}
) {
userErrors {
message
}
}
}",
}
`;
exports[`Testing snapshot for actions-stackadapt-audiences destination: forwardProfile action - all fields 1`] = `
Object {
"query": "mutation {
upsertProfiles(
input: {
advertiserId: PsAwlRv%,
externalProvider: \\"segmentio\\",
syncId: \\"1187e62a973b77faa5387b91939d70295b25063e3439b583b997efa92d9c8e78\\",
profiles: \\"[{\\\\\\"email\\\\\\":\\\\\\"zobbufpop@usliz.mh\\\\\\",\\\\\\"firstName\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"lastName\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"phone\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"city\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"country\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"state\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"postalCode\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"userId\\\\\\":\\\\\\"PsAwlRv%\\\\\\",\\\\\\"birthDay\\\\\\":null,\\\\\\"birthMonth\\\\\\":null}]\\"
}
) {
userErrors {
message
}
}
upsertProfileMapping(
input: {
advertiserId: PsAwlRv%,
mappingSchema: \\"[{\\\\\\"incoming_key\\\\\\":\\\\\\"userId\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"external_id\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\",\\\\\\"is_pii\\\\\\":false}]\\",
mappableType: \\"segmentio\\",
}
) {
userErrors {
message
}
}
}",
}
`;
exports[`Testing snapshot for actions-stackadapt-audiences destination: forwardProfile action - required fields 1`] = `
Object {
"query": "mutation {
upsertProfiles(
input: {
advertiserId: PsAwlRv%,
externalProvider: \\"segmentio\\",
syncId: \\"4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945\\",
profiles: \\"[]\\"
}
) {
userErrors {
message
}
}
upsertProfileMapping(
input: {
advertiserId: PsAwlRv%,
mappingSchema: \\"[{\\\\\\"incoming_key\\\\\\":\\\\\\"userId\\\\\\",\\\\\\"destination_key\\\\\\":\\\\\\"external_id\\\\\\",\\\\\\"data_type\\\\\\":\\\\\\"string\\\\\\",\\\\\\"is_pii\\\\\\":false}]\\",
mappableType: \\"segmentio\\",
}
) {
userErrors {
message
}
}
}",
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { createTestEvent, createTestIntegration } from '@segment/actions-core'
import { generateTestData } from '../../../lib/test-data'
import destination from '../index'
import nock from 'nock'

const testDestination = createTestIntegration(destination)
const destinationSlug = 'actions-stackadapt-audiences'

describe(`Testing snapshot for ${destinationSlug} destination:`, () => {
for (const actionSlug in destination.actions) {
it(`${actionSlug} action - required fields`, async () => {
const seedName = `${destinationSlug}#${actionSlug}`
const action = destination.actions[actionSlug]
const [eventData, settingsData] = generateTestData(seedName, destination, action, true)

nock(/.*/).persist().get(/.*/).reply(200)
nock(/.*/).persist().post(/.*/).reply(200)
nock(/.*/).persist().put(/.*/).reply(200)

const event = createTestEvent({
properties: eventData
})

const responses = await testDestination.testAction(actionSlug, {
event: event,
mapping: event.properties,
settings: settingsData,
auth: undefined
})

const request = responses[0].request
const rawBody = await request.text()

try {
const json = JSON.parse(rawBody)
expect(json).toMatchSnapshot()
return
} catch (err) {
expect(rawBody).toMatchSnapshot()
}

expect(request.headers).toMatchSnapshot()
})

it(`${actionSlug} action - all fields`, async () => {
const seedName = `${destinationSlug}#${actionSlug}`
const action = destination.actions[actionSlug]
const [eventData, settingsData] = generateTestData(seedName, destination, action, false)

nock(/.*/).persist().get(/.*/).reply(200)
nock(/.*/).persist().post(/.*/).reply(200)
nock(/.*/).persist().put(/.*/).reply(200)

const event = createTestEvent({
properties: eventData
})

const responses = await testDestination.testAction(actionSlug, {
event: event,
mapping: event.properties,
settings: settingsData,
auth: undefined
})

const request = responses[0].request
const rawBody = await request.text()

try {
const json = JSON.parse(rawBody)
expect(json).toMatchSnapshot()
return
} catch (err) {
expect(rawBody).toMatchSnapshot()
}
})
}
})
Loading

0 comments on commit acd3145

Please sign in to comment.