diff --git a/K6/api/building-blocks/authentication/resource-registry/index.js b/K6/api/building-blocks/authentication/resource-registry/index.js index 0e9bd559..8c1fda98 100644 --- a/K6/api/building-blocks/authentication/resource-registry/index.js +++ b/K6/api/building-blocks/authentication/resource-registry/index.js @@ -1 +1,2 @@ export { GetUpdatedResources } from "./get-updated-resources.js"; +export { PostResourceAndPolicy, PostPolicy, PostResource } from "./post-resource-and-policy.js"; diff --git a/K6/api/building-blocks/authentication/resource-registry/post-resource-and-policy.js b/K6/api/building-blocks/authentication/resource-registry/post-resource-and-policy.js new file mode 100644 index 00000000..4536e13b --- /dev/null +++ b/K6/api/building-blocks/authentication/resource-registry/post-resource-and-policy.js @@ -0,0 +1,84 @@ +import { check } from "k6"; +import { ResourceRegistryApiClient } from "../../../../clients/authentication/index.js"; + +/** + * + * @param {ResourceRegistryApiClient} resourceRegistryClient A client to interact with the Resource Registry API + * @param {string} resourceId - resource id + * @param {string} org - organization number + * @param {string} orgCode - organization code + * @returns {Object} Parsed JSON response + */ +export function PostResourceAndPolicy(resourceRegistryClient, resourceId, org, orgCode) { + const res = resourceRegistryClient.PostResource(resourceId, org, orgCode); + let succeed = true; + let succeedPolicy = false; + + succeed = check(res, { + "GetUpdatedResources - status code is 201": (r) => r.status === 201, + }); + + if (succeed) { + const resPolicy = resourceRegistryClient.PostPolicy(resourceId); + succeedPolicy = check(resPolicy, { + "PostPolicy - status code is 201": (r) => r.status === 201, + }); + if (!succeedPolicy) { + console.log("Post policy response status:", resPolicy.status); + console.log("Post policy response body:", resPolicy.body); + } + } else { + console.log("Post resource esponse status:", res.status); + } + + return [succeed, succeedPolicy]; +} + +/** + * + * @param {ResourceRegistryApiClient} resourceRegistryClient A client to interact with the Resource Registry API + * @param {string} resourceId - resource id + * @param {string} org - organization number + * @param {string} orgCode - organization code + * @returns {Object} Parsed JSON response + */ +export function PostResource(resourceRegistryClient, resourceId, org, orgCode) { + const res = resourceRegistryClient.PostResource(resourceId, org, orgCode); + + const succeed = check(res, { + "GetUpdatedResources - status code is 201": (r) => r.status === 201, + }); + + if (!succeed) { + console.log("Post resource response status:", res.status); + console.warn("Post resource response body"); + } + + return res; +} + +/** + * + * @param {ResourceRegistryApiClient} resourceRegistryClient A client to interact with the Resource Registry API + * @param {string} resourceId - resource id + * @param {string} org - organization number + * @param {string} orgCode - organization code + * @returns {Object} Parsed JSON response + */ +export function PostPolicy(resourceRegistryClient, resourceId, policyDefinition = null) { + const res = resourceRegistryClient.PostPolicy(resourceId, policyDefinition); + + const succeed = check(res, { + "GetUpdatedResources - status code is 201": (r) => r.status === 201, + }); + + if (!succeed) { + console.log("Post policy response status:", res.status); + console.warn("Post policy response body:", res.body); + } + + return res; +} + + + diff --git a/K6/api/building-blocks/dialogporten/serviceowner/create-dialog.js b/K6/api/building-blocks/dialogporten/serviceowner/create-dialog.js index 225aaa97..531b8e8d 100644 --- a/K6/api/building-blocks/dialogporten/serviceowner/create-dialog.js +++ b/K6/api/building-blocks/dialogporten/serviceowner/create-dialog.js @@ -12,6 +12,8 @@ export function CreateDialog( serviceOwner, label = null, noTransmissionsActivities = false, + title = null, + otherResource = null, ) { const res = serviceOwnerApiClient.PostDialog( endUser, @@ -19,6 +21,8 @@ export function CreateDialog( serviceOwner, label, noTransmissionsActivities, + title, + otherResource, ); const success = check(res, { diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/create-policy-example.js b/K6/api/building-blocks/testdata-generation/resource-registry/create-policy-example.js new file mode 100644 index 00000000..6cf2e6dd --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/create-policy-example.js @@ -0,0 +1,35 @@ +/* +* Example script to create a policy in the Resource Registry for testing purposes. +* No resource is created in this script, it is assumed that the resource already exists. +* A predefined policy XML is used for the creation, but can be modified as needed. +* See policy-builder.js for building custom policies. +* Run: k6 run create-policy.js +* Set environment variables: +* ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") +* BASE_URL - the base URL of the Resource Registry API +* Example: +* ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run create-policy.js +* TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must also be set in the environment for token generation +*/ +import { ResourceRegistryApiClient } from "../../../../clients/authentication/index.js"; +import { EnterpriseTokenGenerator } from "../../../../common-imports.js"; +import { buildPolicy, getDefaultPolicyXml } from "./templates/policy-builder.js"; + +let resourceRegistryApiClient = undefined; + +export default function () { + if (resourceRegistryApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "altinn:resourceregistry/resource.write altinn:resourceregistryresource.read altinn:resourceregistry/resource.admin"); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + resourceRegistryApiClient = new ResourceRegistryApiClient(__ENV.BASE_URL, tokenGenerator); + } + + const resourceName = "k6-resource-example"; + + const policy = getDefaultPolicyXml(resourceName); //buildPolicy(policyDefinition, resourceName); + const policyResp = resourceRegistryApiClient.PostPolicy(resourceName, policy); + +} diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/create-resource-example.js b/K6/api/building-blocks/testdata-generation/resource-registry/create-resource-example.js new file mode 100644 index 00000000..d8e789f2 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/create-resource-example.js @@ -0,0 +1,49 @@ +/* + * Example script to create a resource + * Run: k6 run create-resource-example.js + * Set environment variables: + * ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") + * BASE_URL - the base URL of the resource registry API + * Example: + * ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run create-access-package-resource.js + * Also the TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must be set in the environment for token generation +*/ + +import { ResourceRegistryApiClient } from "../../../../clients/authentication/index.js"; +import { EnterpriseTokenGenerator } from "../../../../common-imports.js"; +import { getResourceBody } from "./templates/resource-templates.js"; +import { getDefaultPolicyXml } from "./templates/policy-builder.js"; + +let resourceRegistryApiClient = undefined; + +export default function () { + // OrgNo for ttd is 991825827 except in yt01 where it is 713431400. + let orgNo = "991825827"; + if (__ENV.ENVIRONMENT === "yt01") { + orgNo = "713431400"; + } + const orgCode = "ttd"; + + if (resourceRegistryApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "altinn:resourceregistry/resource.write altinn:resourceregistryresource.read altinn:resourceregistry/resource.admin"); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + resourceRegistryApiClient = new ResourceRegistryApiClient(__ENV.BASE_URL, tokenGenerator); + } + + const resourceId = "k6-resource-example"; + const resourceBody = getResourceBody("default", resourceId, orgNo, orgCode); + + const resourceResp = resourceRegistryApiClient.PostResource(resourceBody); + if (resourceResp.status === 201) { + console.log(`Resource created: ${resourceId}`); + const policyXml = getDefaultPolicyXml(resourceId); + const policyResp = resourceRegistryApiClient.PostPolicy(resourceId, policyXml); + if (policyResp.status === 201) { + console.log(`Policy created for resource: ${resourceId}`); + } + } +} + diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-access-package-priv-resource.js b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-access-package-priv-resource.js new file mode 100644 index 00000000..6c65d507 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-access-package-priv-resource.js @@ -0,0 +1,60 @@ +/* +* Script to create access package resources with PRIV in policy file in addition to access package +* Run: k6 run create-access-package-priv-resource.js +* Set environment variables: +* ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") +* BASE_URL - the base URL of the resource registry API +* Example: +* ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run create-access-package-priv-resource.js +* TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must also be set in the environment for token generation +*/ +import { ResourceRegistryApiClient, AccessPackagesApiClient } from "../../../../../clients/authentication/index.js"; +import { EnterpriseTokenGenerator } from "../../../../../common-imports.js"; +import { getResourceBody } from "../templates/resource-templates.js"; +import { getAccessPackageWithPrivPolicyXml } from "../templates/policy-builder.js"; + +let resourceRegistryApiClient = undefined; +let accessPackagesApiClient = undefined; + +export default function () { + // OrgNo for ttd is 991825827 except in yt01 where it is 713431400. + let orgNo = "991825827"; + if (__ENV.ENVIRONMENT === "yt01") { + orgNo = "713431400"; + } + const orgCode = "ttd"; + + if (resourceRegistryApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "altinn:resourceregistry/resource.write altinn:resourceregistryresource.read altinn:resourceregistry/resource.admin"); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + resourceRegistryApiClient = new ResourceRegistryApiClient(__ENV.BASE_URL, tokenGenerator); + } + + // Get all access packages + accessPackagesApiClient = new AccessPackagesApiClient(__ENV.BASE_URL); + const searchOpt = { typeName: "person" }; + const accessPackageResp = accessPackagesApiClient.Search(searchOpt); + const resp = JSON.parse(accessPackageResp.body); + + // Create resource and policy for each access package + for (const item of resp) { + const accessPackage = item.object.urn.split(":").pop(); + const resourceId = `k6-test-${accessPackage}-with-priv`; + const resourceBody = getResourceBody("access-package-with-priv", resourceId, orgNo, orgCode, accessPackage); + + const resourceResp = resourceRegistryApiClient.PostResource(resourceBody); + if (resourceResp.status === 201) { + console.log(`Resource created: ${resourceId}`); + const policyXml = getAccessPackageWithPrivPolicyXml(resourceId, accessPackage); + const policyResp = resourceRegistryApiClient.PostPolicy(resourceId, policyXml); + if (policyResp.status === 201) { + console.log(`Policy created for resource: ${resourceId}`); + } + } else { + console.log(`Failed to create resource: ${resourceId}. Status: ${resourceResp.status}`); + } + } +} diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-access-package-resource.js b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-access-package-resource.js new file mode 100644 index 00000000..ce87f229 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-access-package-resource.js @@ -0,0 +1,60 @@ +/* + * Script to create resources and policies for access packages in the resource registry. + * Run: k6 run create-access-package-resource.js + * Set environment variables: + * ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") + * BASE_URL - the base URL of the resource registry API + * Example: + * ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run create-access-package-resource.js + * Also the TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must be set in the environment for token generation +*/ + +import { ResourceRegistryApiClient, AccessPackagesApiClient } from "../../../../../clients/authentication/index.js"; +import { EnterpriseTokenGenerator } from "../../../../../common-imports.js"; +import { getResourceBody } from "../templates/resource-templates.js"; +import { getAccessPackagePolicyXml } from "../templates/policy-builder.js"; + +let resourceRegistryApiClient = undefined; +let accessPackagesApiClient = undefined; + +export default function () { + // OrgNo for ttd is 991825827 except in yt01 where it is 713431400. + let orgNo = "991825827"; + if (__ENV.ENVIRONMENT === "yt01") { + orgNo = "713431400"; + } + const orgCode = "ttd"; + + if (resourceRegistryApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "altinn:resourceregistry/resource.write altinn:resourceregistryresource.read altinn:resourceregistry/resource.admin"); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + resourceRegistryApiClient = new ResourceRegistryApiClient(__ENV.BASE_URL, tokenGenerator); + } + + accessPackagesApiClient = new AccessPackagesApiClient(__ENV.BASE_URL); + const searchOpt = { typeName: "person" }; + const accessPackageResp = accessPackagesApiClient.Search(searchOpt); + + const resp = JSON.parse(accessPackageResp.body); + for (const item of resp) { + const accessPackage = item.object.urn.split(":").pop(); + const resourceId = `k6-test-${accessPackage}`; + const resourceBody = getResourceBody("access-package", resourceId, orgNo, orgCode, accessPackage); + + const resourceResp = resourceRegistryApiClient.PostResource(resourceBody); + if (resourceResp.status === 201) { + console.log(`Resource created: ${resourceId}`); + const policyXml = getAccessPackagePolicyXml(resourceId, accessPackage); + const policyResp = resourceRegistryApiClient.PostPolicy(resourceId, policyXml); + if (policyResp.status === 201) { + console.log(`Policy created for resource: ${resourceId}`); + } + } + break; + } + +} + diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-dialogs.js b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-dialogs.js new file mode 100644 index 00000000..afd74bc9 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/create-dialogs.js @@ -0,0 +1,254 @@ +/* +* STILL UNDER DEVELOPMENT +* Script to create dialogs in Dialogporten for various resources using K6 performance testing tool. +* Run: k6 run create-dialogs.js +* Set environment variables: +* ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") +* BASE_URL - the base URL of the Dialogporten Service Owner API +* Example: +* ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run create-dialogs.js +* TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must also be set in the environment for token generation +*/ +import http from "k6/http"; +import { EnterpriseTokenGenerator } from "../../../../../common-imports.js"; +import { CreateDialog } from "../../../dialogporten/serviceowner/index.js"; +import { ServiceOwnerApiClient } from "../../../../../clients/dialogporten/serviceowner/index.js"; + +import { getItemFromList, getOptions, parseCsvData } from "../../../../../helpers.js"; + +const resources = [ + "k6-test-innbygger-stotte-tilskudd", + "k6-test-innbygger-forsikring", + "k6-test-innbygger-avlastning-stotte", + "k6-test-innbygger-design-varemerke", + "k6-test-innbygger-kultur", + "k6-test-innbygger-pleie-omsorg", + "k6-test-innbygger-toll-avgift", + "k6-test-innbygger-bolig-eiendom", + "k6-test-innbygger-byggesoknad", + "k6-test-innbygger-pensjon", + "k6-test-innbygger-sertifisering", + "k6-test-innbygger-vapen", + "k6-test-innbygger-arbeidsliv", + "k6-test-innbygger-straffesak", + "k6-test-innbygger-frivillighet", + "k6-test-innbygger-tilgangsstyring-privatperson", + "k6-test-innbygger-bank-finans", + "k6-test-innbygger-utdanning", + "k6-test-innbygger-soknader-sertifisering", + "k6-test-innbygger-kjoretoy", + "k6-test-innbygger-forerkort", + "k6-test-innbygger-skatteforhold-privatpersoner", + "k6-test-innbygger-samliv", + "k6-test-innbygger-barn-foreldre", + "k6-test-innbygger-permisjon-oppsigelse", + "k6-test-innbygger-barnehage-sfo-skole", + "k6-test-innbygger-fritidsaktiviteter-friluftsliv", + "k6-test-innbygger-idrett", + "k6-test-innbygger-behandling", + "k6-test-innbygger-loyve", + "k6-test-innbygger-patent", + "k6-test-innbygger-sykefravaer", + "k6-test-innbygger-attester", + "k6-test-innbygger-helsetjenester", + "k6-test-vergemal-tingretten-begjaere-uskifte", + "k6-test-vergemal-inkassoselskap-inkassoavtaler", + "k6-test-vergemal-ovrige-inngaelse-husleiekontrakter", + "k6-test-vergemal-skatteetaten-melde-flytting", + "k6-test-vergemal-nav-hjelpemidler", + "k6-test-vergemal-skatteetaten-endre-postadresse", + "k6-test-vergemal-skatteetaten-skatt", + "k6-test-vergemal-kartverket-avtaler-rettigheter", + "k6-test-vergemal-kartverket-sletting", + "k6-test-vergemal-namsmannen-gjeldsordning", + "k6-test-vergemal-kredittvurderingsselskap-kredittsperre", + "k6-test-vergemal-husbanken-bostotte", + "k6-test-vergemal-ovrige-salg-losore-storre-verdi", + "k6-test-vergemal-kommune-bygg-eiendom", + "k6-test-vergemal-namsmannen-tvangsfullbyrdelse", + "k6-test-vergemal-helfo-refusjon-privatpersoner", + "k6-test-vergemal-helfo-fastlege", + "k6-test-vergemal-husbanken-startlan", + "k6-test-vergemal-nav-pensjon", + "k6-test-vergemal-ovrige-avslutning-husleiekontrakter", + "k6-test-vergemal-kommune-skole-utdanning", + "k6-test-vergemal-kartverket-arv-privat-skifte-uskifte", + "k6-test-vergemal-kommune-sosiale-tjenester", + "k6-test-vergemal-tingretten-privat-skifte-dodsbo", + "k6-test-vergemal-skatteetaten-innkreving", + "k6-test-vergemal-kommune-helse-omsorg", + "k6-test-vergemal-forsikringsselskap-forvalte-forsikringsavtaler", + "k6-test-vergemal-bank-ta-opp-lan-kreditter", + "k6-test-vergemal-kartverket-salg-fast-eiendom-borettslagsandel", + "k6-test-vergemal-statsforvalter-soke-om-samtykke-disposisjon", + "k6-test-vergemal-bank-representasjon-dagligbank", + "k6-test-vergemal-kommune-skatt-avgift", + "k6-test-vergemal-nav-familie", + "k6-test-vergemal-tingretten-begjaere-skifte-uskiftebo", + "k6-test-vergemal-kartverket-endring-eiendom", + "k6-test-vergemal-kartverket-laneopptak", + "k6-test-vergemal-nav-sosiale-tjenester", + "k6-test-vergemal-kartverket-kjop-eiendom", + "k6-test-vergemal-ovrige-kjop-leie-varer-tjenester", + "k6-test-vergemal-pasientreiser-refusjon-pasientreiser", + "k6-test-vergemal-statens-innkrevingssentral-gjeldsordning-betalingsavtaler", + "k6-test-vergemal-nav-arbeid", +]; + +const users = [ + "22857299381", + "29924399935", + "54869300376", + "22878698650", + "31928874918", + "41830575322", + "26889599226", + "09827898373", + "26874598916", + "05868796989", + "61875500782", + "27837396412", + "15865599576", + "05891799685", + "04885798794", + "08820249535", + "03878998862", + "59843000198", + "29881648693", + "16861899717", + "07897899552", + "25872848536", + "14898197930", + "27915098059", + "21879998945", + "17874798320", + "24864399386", + "07866699199", + "31900598311", + "17921598211", + "28811299458", + "06822149098", + "27861948698", + "41829100558", + "21853049465", + "67877403103", + "66836100752", + "27837297619", + "45878401100", + "01912048841", + "42890375027", + "05833647484", + "18841746895", + "27855695796", + "57867000374", + "08824496022", + "19869399402", + "44909100280", + "18857399699", + "03916094824", + "15841948073", + "07868299252", + "01862248038", + "30874899204", + "11845797570", + "12911249497", + "01815495566", + "12884599782", + "02906398012", + "09839798137", + "12914794836", + "19873249075", + "20843349650", + "19826497397", + "69868800399", + "23858598850", + "31878799901", + "02854397799", + "21853749653", + "18915999383", + "15814599598", + "26829397667", + "20895396533", + "15869798212", + "16918496339", + "14886596589", + "10928798297", + "23887797536", + "08819097136", + "27836595713", + "30850249888", + "05921299194", + "07861899009", + "18826997342", + "22851949759", + "11919297567", + "30904398353", + "12860048998", + "11866097552", + "46876601125", + "68835500938", + "50835000556", + "19881449555", + "19829298204", + "24870849172", + "08810548380", + "54837100731", + "26884698331", + "04855698884", + "48907602519", +]; + +//const orgNo = "713431400"; //"991825827"; // +let orgNo = "991825827"; +if (__ENV.ENVIRONMENT === "yt01") { + orgNo = "713431400"; +} +let serviceOwnerApiClient = undefined; +const label = "create-dialog"; + +export function setup() { + const res = http.get(`https://raw.githubusercontent.com/Altinn/altinn-platform-validation-tests/refs/heads/main/K6/testdata/authentication/data-${__ENV.ENVIRONMENT}-all-customers.csv`); + return parseCsvData(res.body); +} + +/** +* Function to set up and return clients to interact with the Service Owner Dialog API +* +* @returns {Array} An array containing the AuthorizedPartiesClient instance +*/ +export function getClients() { + if (serviceOwnerApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "digdir:dialogporten.serviceprovider"); + tokenOpts.set("org", "ttd"); + tokenOpts.set("orgNo", orgNo); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + serviceOwnerApiClient = new ServiceOwnerApiClient(__ENV.BASE_URL, tokenGenerator); + } + return [serviceOwnerApiClient]; +} + +export default function () { + const [serviceOwnerApiClient] = getClients(); + const ssn = getItemFromList(users); + const resource = getItemFromList(resources); + const otherResource = getOtherResource(resource); + console.log(`Creating dialog for ssn: ${ssn} and resource: ${resource}`); + CreateDialog( + serviceOwnerApiClient, + ssn, + resource, + orgNo, + label, + false, + `Dialog for ressurs ${resource}`, + otherResource + ); +} + +function getOtherResource(resource) { + const otherResources = resources.filter(r => r !== resource); + return getItemFromList(otherResources); +} diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/flip-policy.js b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/flip-policy.js new file mode 100644 index 00000000..84a60d60 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/flip-policy.js @@ -0,0 +1,58 @@ +/* + * Script to create resources and policies for access packages in the resource registry. + * Run: k6 run create-access-package-resource.js + * Set environment variables: + * ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") + * BASE_URL - the base URL of the resource registry API + * Example: + * ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run create-access-package-resource.js + * Also the TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must be set in the environment for token generation +*/ + +import { ResourceRegistryApiClient, AccessPackagesApiClient } from "../../../../../clients/authentication/index.js"; +import { EnterpriseTokenGenerator } from "../../../../../common-imports.js"; +import { getResourceBody } from "../templates/resource-templates.js"; +import { getAccessPackagePolicyXml, getDefaultPolicyXml } from "../templates/policy-builder.js"; + +let resourceRegistryApiClient = undefined; +let accessPackagesApiClient = undefined; + +export default function () { + // OrgNo for ttd is 991825827 except in yt01 where it is 713431400. + let orgNo = "991825827"; + if (__ENV.ENVIRONMENT === "yt01") { + orgNo = "713431400"; + } + + if (resourceRegistryApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "altinn:resourceregistry/resource.write altinn:resourceregistryresource.read altinn:resourceregistry/resource.admin"); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + resourceRegistryApiClient = new ResourceRegistryApiClient(__ENV.BASE_URL, tokenGenerator); + } + + accessPackagesApiClient = new AccessPackagesApiClient(__ENV.BASE_URL); + const searchOpt = { typeName: "person" }; + const accessPackageResp = accessPackagesApiClient.Search(searchOpt); + + const resp = JSON.parse(accessPackageResp.body); + for (const item of resp) { + const accessPackage = item.object.urn.split(":").pop(); + const resourceId = `k6-test-${accessPackage}`; + console.log(`Processing resource: ${resourceId}`); + const policy = getDefaultPolicyXml(resourceId); //buildPolicy(policyDefinition, resourceName); + const policyResp1 = resourceRegistryApiClient.PostPolicy(resourceId, policy); + if (policyResp1.status === 201) { + console.log(`Wrong policy created for resource: ${resourceId}`); + } + const policyXml = getAccessPackagePolicyXml(resourceId, accessPackage); + const policyResp2 = resourceRegistryApiClient.PostPolicy(resourceId, policyXml); + if (policyResp2.status === 201) { + console.log(`Policy created for resource: ${resourceId}`); + } + } + +} + diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/patch-resource.js b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/patch-resource.js new file mode 100644 index 00000000..e354bd84 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/e2e-test-2026-02-11/patch-resource.js @@ -0,0 +1,67 @@ +/* +* An example script that demonstrates how to patch a resource in the Resource Registry API using k6. +* It retrieves an existing resource, applies specified changes, and updates the resource. +* Run: k6 run patch-resource.js +* Set environment variables: +* ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") +* BASE_URL - the base URL of the Resource Registry API +* Example: +* ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run patch-resource.js +* TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must also be set in the environment for token generation +*/ +import { ResourceRegistryApiClient } from "../../../../../clients/authentication/index.js"; +import { AccessPackagesApiClient } from "../../../../../clients/authentication/index.js"; +import { EnterpriseTokenGenerator } from "../../../../../common-imports.js"; +import { applyPatch } from "../templates/patch-json.js"; + +let resourceRegistryApiClient = undefined; + +export default function () { + if (resourceRegistryApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "altinn:resourceregistry/resource.write altinn:resourceregistryresource.read altinn:resourceregistry/resource.admin"); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + resourceRegistryApiClient = new ResourceRegistryApiClient(__ENV.BASE_URL, tokenGenerator); + } + const orgCode = "ttd"; + + const accessPackagesApiClient = new AccessPackagesApiClient(__ENV.BASE_URL); + const searchOpt = { typeName: "person" }; + const accessPackageResp = accessPackagesApiClient.Search(searchOpt); + + const resp = JSON.parse(accessPackageResp.body); + const withPrivText = ""; + for (const item of resp) { + const accessPackage = item.object.urn.split(":").pop(); + const resourceId = `k6-test-${accessPackage}`; + + const resourceResp = resourceRegistryApiClient.GetResource(resourceId); + const resource = JSON.parse(resourceResp.body); + + const patch = { + set: { + title: { + en: `Testing resource for ${orgCode}`, + nb: `Testressurs for ${orgCode}`, + nn: `Testressurs for ${orgCode}`, + }, + description: { + en: `Generic test resource for ${orgCode} on access package ${accessPackage}${withPrivText}`, + nb: `Generisk testressurs for ${orgCode} på tilgangspakke ${accessPackage}${withPrivText}`, + nn: `Generisk testressurs for ${orgCode} på tilgangspakke ${accessPackage}${withPrivText}`, + }, + rightDescription: { + en: `Read, write and access on access package ${accessPackage}${withPrivText}`, + nb: `Lese, skrive og aksess på tilgangspakke ${accessPackage}${withPrivText}`, + nn: `Lese, skrive og aksess på tilgangspakke ${accessPackage}${withPrivText}`, + }, + } + }; + const updatedResource = applyPatch(resource, patch); + + const updateResp = resourceRegistryApiClient.PutResource(resourceId, updatedResource); + console.log(`Patched resource: ${resourceId}, Status: ${updateResp.status}`); + } +} diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/patch-resource-example.js b/K6/api/building-blocks/testdata-generation/resource-registry/patch-resource-example.js new file mode 100644 index 00000000..6fd710e2 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/patch-resource-example.js @@ -0,0 +1,51 @@ +/* +* An example script that demonstrates how to patch a resource in the Resource Registry API using k6. +* It retrieves an existing resource, applies specified changes, and updates the resource. +* Run: k6 run patch-resource.js +* Set environment variables: +* ENVIRONMENT - the target environment (e.g., "yt01", "at23", "tt02") +* BASE_URL - the base URL of the Resource Registry API +* Example: +* ENVIRONMENT=yt01 BASE_URL=https://platform.yt01.altinn.cloud k6 run patch-resource.js +* TOKEN_GENERATOR_USERNAME and TOKEN_GENERATOR_PASSWORD must also be set in the environment for token generation +*/ +import { ResourceRegistryApiClient } from "../../../../clients/authentication/index.js"; +import { EnterpriseTokenGenerator } from "../../../../common-imports.js"; +import { applyPatch } from "./templates/patch-json.js"; + +let resourceRegistryApiClient = undefined; + +export default function () { + if (resourceRegistryApiClient == undefined) { + const tokenOpts = new Map(); + tokenOpts.set("env", __ENV.ENVIRONMENT); + tokenOpts.set("ttl", 3600); + tokenOpts.set("scopes", "altinn:resourceregistry/resource.write altinn:resourceregistryresource.read altinn:resourceregistry/resource.admin"); + const tokenGenerator = new EnterpriseTokenGenerator(tokenOpts); + resourceRegistryApiClient = new ResourceRegistryApiClient(__ENV.BASE_URL, tokenGenerator); + } + const orgCode = "ttd"; + const resourceId = "k6-resource-example"; + + const resourceResp = resourceRegistryApiClient.GetResource(resourceId); + const resource = JSON.parse(resourceResp.body); + + const patch = { + set: { + title: { + en: `Testing resource for ${orgCode} (patched)`, + nb: `Testressurs for ${orgCode} (patched)`, + nn: `Testressurs for ${orgCode} (patched)`, + }, + description: { + en: `Generic test resource for ${orgCode} (patched)`, + nb: `Generisk testressurs for ${orgCode} (patched)`, + nn: `Generisk testressurs for ${orgCode} (patched)`, + }, + } + }; + const updatedResource = applyPatch(resource, patch); + + const updateResp = resourceRegistryApiClient.PutResource(resourceId, updatedResource); + console.log(`Patched resource: ${resourceId}, Status: ${updateResp.status}, Body: ${updateResp.body}`); +} diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/templates/patch-json.js b/K6/api/building-blocks/testdata-generation/resource-registry/templates/patch-json.js new file mode 100644 index 00000000..f328c10b --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/templates/patch-json.js @@ -0,0 +1,47 @@ +function deepMerge(target, source) { + const out = { ...target }; + for (const [k, v] of Object.entries(source)) { + if (v && typeof v === "object" && !Array.isArray(v)) { + out[k] = deepMerge(target?.[k] ?? {}, v); + } else { + out[k] = v; + } + } + return out; +} + +function removePath(obj, path) { + if (path.length === 0) return obj; + + const [key, ...rest] = path; + + if (!(key in obj)) return obj; + + if (rest.length === 0) { + const { [key]: _, ...out } = obj; + return out; + } + + return { + ...obj, + [key]: removePath(obj[key], rest), + }; +} + +export function applyPatch(original, patch) { + let result = { ...original }; + + // 1) removals + if (patch.remove) { + for (const path of patch.remove) { + result = removePath(result, path); + } + } + + // 2) sets / updates + if (patch.set) { + result = deepMerge(result, patch.set); + } + + return result; +} diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/templates/policy-builder.js b/K6/api/building-blocks/testdata-generation/resource-registry/templates/policy-builder.js new file mode 100644 index 00000000..7ab1cf49 --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/templates/policy-builder.js @@ -0,0 +1,171 @@ +/* +* Builds XACML policy XML strings based on provided definitions. +* Used for creating policies in the Resource Registry for testing purposes. +* Create other policies as needed by modifying or adding to the definitions below. +*/ +export function getDefaultPolicyXml(id) { + const policyDefinition = { + rules: [ + { + effect: "Permit", + description: "A rule giving the org 991825827 DIGITALISERINGSDIREKTORATET and 974761076 SKATTEETATEN access to publish/subscribe all events ", + subjects: [ + { id: "urn:altinn:organizationnumber", value: "991825827" }, + { id: "urn:altinn:organizationnumber", value: "974761076" }, + { id: "urn:altinn:org", value: "digdir" }, + { id: "urn:altinn:org", value: "skd" }, + { id: "urn:altinn:partyid", value: "50125678" }, + { id: "urn:altinn:partyid", value: "50167512" }, + ], + actions: ["publish", "subscribe"], + }, + { + effect: "Permit", + description: "A rule giving PRIV, DAGL, INNH and LEDE access to read,write,sign,open", + subjects: [ + { id: "urn:altinn:rolecode", value: "PRIV" }, + { id: "urn:altinn:rolecode", value: "DAGL" }, + { id: "urn:altinn:rolecode", value: "INNH" }, + { id: "urn:altinn:rolecode", value: "LEDE" }, + ], + actions: ["read", "write", "sign", "open"], + }, + ], + }; + return buildPolicy(policyDefinition, id); +} + +export function getAccessPackagePolicyXml(id, accessPackage) { + const policyDefinition = { + rules: [ + { + effect: "Permit", + description: `Består av tilgangspakken ${accessPackage}`, + subjects: [ + { id: "urn:altinn:accesspackage", value: accessPackage }, + ], + actions: ["read", "write", "access"], + }, + ], + obligationExpressions: [ + { + obligationId: "urn:altinn:obligation:authenticationLevel1", + fulfillOn: "Permit", + attributeId: "urn:altinn:obligation1-assignment1", + category: "urn:altinn:minimum-authenticationlevel", + value: 3, + },{ + obligationId: "urn:altinn:obligation:authenticationLevel2", + fulfillOn: "Permit", + attributeId: "urn:altinn:obligation2-assignment2", + category: "urn:altinn:minimum-authenticationlevel-org", + value: 3, + }, + ], + }; + return buildPolicy(policyDefinition, id); +} + +export function getAccessPackageWithPrivPolicyXml(id, accessPackage) { + const policyDefinition = { + rules: [ + { + effect: "Permit", + description: `Består av tilgangspakken ${accessPackage}`, + subjects: [ + { id: "urn:altinn:rolecode", value: "PRIV" }, + { id: "urn:altinn:rolecode", value: "SELN" }, + { id: "urn:altinn:accesspackage", value: accessPackage }, + ], + actions: ["read", "write", "access"], + }, + ], + obligationExpressions: [ + { + obligationId: "urn:altinn:obligation:authenticationLevel1", + fulfillOn: "Permit", + attributeId: "urn:altinn:obligation1-assignment1", + category: "urn:altinn:minimum-authenticationlevel", + value: 3, + }, + { + obligationId: "urn:altinn:obligation:authenticationLevel2", + fulfillOn: "Permit", + attributeId: "urn:altinn:obligation2-assignment2", + category: "urn:altinn:minimum-authenticationlevel-org", + value: 3, + }, + ], + }; + return buildPolicy(policyDefinition, id); +} + + +export function buildPolicy(definition, id) { + let policyXml = ` + + `; + let ruleId = 0; + for (const rule of definition.rules) { + ruleId += 1; + policyXml += ` + + ${rule.description} + + `; + // add subjects + for (const subject of rule.subjects) { + policyXml += ` + + + ${subject.value} + + + `; + } + policyXml += ` + `; + policyXml += ` + + + + ${id} + + + + `; + policyXml += ` + `; + for (const action of rule.actions) { + policyXml += ` + + + ${action} + + + `; + } + policyXml += ` + + + `; + } + if (definition.obligationExpressions && definition.obligationExpressions.length > 0) { + policyXml += ` + `; + + for (const obligation of definition.obligationExpressions) { + policyXml += ` + + + ${obligation.value} + + `; + } + policyXml += ` + `; + } + policyXml += ` + `; + return policyXml; +} diff --git a/K6/api/building-blocks/testdata-generation/resource-registry/templates/resource-templates.js b/K6/api/building-blocks/testdata-generation/resource-registry/templates/resource-templates.js new file mode 100644 index 00000000..a9788f6b --- /dev/null +++ b/K6/api/building-blocks/testdata-generation/resource-registry/templates/resource-templates.js @@ -0,0 +1,125 @@ +/* +* Returns a resource body based on the provided templateId. +* Used for creating resources in the Resource Registry for testing purposes. +* Create other templates as needed by modifying or adding to the definitions below. +*/ +export function getResourceBody(templateId, id, org, orgCode, accessPackage=null) { + switch (templateId) { + case "access-package": + return accessPackageTemplate(id, org, orgCode, accessPackage); + case "access-package-with-priv": + return accessPackageTemplate(id, org, orgCode, accessPackage, true); + default: + return getDefaultResourceBody(id, org, orgCode); + } +} + +function getDefaultResourceBody(id, org, orgCode) { + return { + "identifier": id, + "title": { + "en": `Testing resource for ${orgCode}`, + "nb": `Testressurs for ${orgCode}`, + "nn": `Testressurs for ${orgCode}` + }, + "description": { + "en": `Generic test resource for ${orgCode}`, + "nb": `Generisk testressurs for ${orgCode}`, + "nn": `Generisk testressurs for ${orgCode}`, + }, + "rightDescription": { + "en": `Generic test resource for ${orgCode}, check policy-file for rights`, + "nb": `Generisk testressurs for ${orgCode}, sjekk policy-fil for rettigheter`, + "nn": `Generisk testressurs for ${orgCode}, sjekk policy-fil for rettigheter`, + }, + "homepage": "https://platform.at22.altinn.cloud/", + "status": "Active", + "contactPoints": [], + "isPartOf": "Altinn", + "resourceReferences": [], + "delegable": false, + "visible": false, + "hasCompetentAuthority": { + "name": { + "en": "Test department", + "nb": "testdepartementet", + "nn": "Testdepartementet" + }, + "organization": org, + "orgcode": orgCode + }, + "keywords": [], + "accessListMode": "Disabled", + "selfIdentifiedUserEnabled": false, + "enterpriseUserEnabled": false, + "resourceType": "GenericAccessResource", + "authorizationReference": [ + { + "id": "urn:altinn:resource", + "value": id + } + ], + "isOneTimeConsent": false, + "versionId": 58 + }; +} + +function accessPackageTemplate(id, org, orgCode, accessPackage, withPriv=false) { + let withPrivText = withPriv ? " + PRIV" : ""; + return { + "identifier": id, + "version": "1", + "title": { + "en": `Testing resource for ${orgCode}`, + "nb": `Testressurs for ${orgCode}`, + "nn": `Testressurs for ${orgCode}` + }, + "description": { + "en": `Generic test resource for ${orgCode} on access package ${accessPackage}${withPrivText}`, + "nb": `Generisk testressurs for ${orgCode} på tilgangspakke ${accessPackage}${withPrivText}`, + "nn": `Generisk testressurs for ${orgCode} på tilgangspakke ${accessPackage}${withPrivText}`, + }, + "rightDescription": { + "en": `Read, write and access on access package ${accessPackage}${withPrivText}`, + "nb": `Read, write and access på tilgangspakke ${accessPackage}${withPrivText}`, + "nn": `Read, write and access på tilgangspakke ${accessPackage}${withPrivText}`, + }, + "homepage": "https://platform.at22.altinn.cloud/", + "status": "Completed", + "contactPoints": [ + { + "category": "Chat med oss", + "email": "", + "telephone": "", + "contactPage": "Slack testsenter" + } + ], + "delegable": true, + "visible": true, + "hasCompetentAuthority": { + "name": { + "en": "Test department", + "nb": "testdepartementet", + "nn": "Testdepartementet" + }, + "organization": org, + "orgcode": orgCode + }, + "keywords": [ + { + "word": "testsenter", + "language": "nb" + } + ], + "accessListMode": "Disabled", + "selfIdentifiedUserEnabled": true, + "enterpriseUserEnabled": false, + "resourceType": "GenericAccessResource", + "availableForType": [ + "PrivatePerson", + "SelfRegisteredUser" + ], + "isOneTimeConsent": false, + "versionId": 323 + }; +} diff --git a/K6/clients/authentication/access-packages.js b/K6/clients/authentication/access-packages.js new file mode 100644 index 00000000..0f5014df --- /dev/null +++ b/K6/clients/authentication/access-packages.js @@ -0,0 +1,45 @@ +import http from "k6/http"; + +class AccessPackagesApiClient { + /** + * + * @param {string} baseUrl e.g. https://platform.at22.altinn.cloud + */ + constructor( + baseUrl + ) { + /** + * + * @property {string} BASE_PATH The path to the api without host information + */ + this.BASE_PATH = "/accessmanagement/api/v1/meta/info/accesspackages"; + /** + * @property {string} FULL_PATH The path to the api including protocol, hostname, etc. + */ + this.FULL_PATH = baseUrl + this.BASE_PATH; + + } + + /** + * Get Roles + * Docs TODO: This link does not work, nothing yet {@link https://docs.altinn.studio/nb/api/accessmanagement/resourceowneropenapi/#/Roles} + * @param {string} label + * @returns http.RefinedResponse + */ + Search(searchOptions, label = null) { + const url = new URL(`${this.FULL_PATH}` + "/search"); + let nameTag = label ? label : url.toString(); + const params = { + tags: { name: nameTag }, + headers: { + "Content-type": "application/json", + }, + }; + for (const key in searchOptions) { + url.searchParams.append(key, searchOptions[key]); + } + return http.get(url.toString(), params); + } +} + +export { AccessPackagesApiClient }; diff --git a/K6/clients/authentication/index.js b/K6/clients/authentication/index.js index 8c4afc96..b2a8603d 100644 --- a/K6/clients/authentication/index.js +++ b/K6/clients/authentication/index.js @@ -8,3 +8,4 @@ export { ConnectionsApiClient } from "./connections.js"; export { RolesApiClient } from "./roles.js"; export { ResourceRegistryApiClient } from "./resource-registry.js"; export { RegisterLookupClient } from "../register/lookup.js"; +export { AccessPackagesApiClient } from "./access-packages.js"; diff --git a/K6/clients/authentication/resource-registry.js b/K6/clients/authentication/resource-registry.js index 371f03a3..7eb9fd28 100644 --- a/K6/clients/authentication/resource-registry.js +++ b/K6/clients/authentication/resource-registry.js @@ -5,15 +5,19 @@ class ResourceRegistryApiClient { /** * * @param {string} baseUrl e.g. https://platform.at22.altinn.cloud + * @param {object|null} tokenGenerator An object with a getToken() method that returns a valid token string */ constructor( - baseUrl + baseUrl, + tokenGenerator = null, ) { + + this.tokenGenerator = tokenGenerator; /** * * @property {string} BASE_PATH The path to the api without host information */ - this.BASE_PATH = "/resourceregistry/api/v1/resource/updated"; + this.BASE_PATH = "/resourceregistry/api/v1/resource/"; /** * @property {string} FULL_PATH The path to the api including protocol, hostname, etc. */ @@ -32,7 +36,7 @@ class ResourceRegistryApiClient { * @returns http.RefinedResponse */ GetUpdatedResources(since, limit, label = null) { - const url = new URL(`${this.FULL_PATH}`); + const url = new URL(`${this.FULL_PATH}/updated`); url.searchParams.append("since", since); url.searchParams.append("limit", limit); @@ -45,6 +49,85 @@ class ResourceRegistryApiClient { }; return http.get(url.toString(), params); } + + /** + * Get Resource + * @param {string} id The id of the resource, e.g. "super-simple-service" + * @returns http.RefinedResponse + */ + GetResource(id, label = null) { + const url = new URL(`${this.FULL_PATH}${id}`); + let nameTag = label ? label : url.pathname; + const params = { + tags: { name: nameTag }, + headers: { + "Content-type": "application/json", + }, + }; + return http.get(url.toString(), params); + } + + /** + * Put Resource + * @param {string} id The id of the resource, e.g. "super-simple-service" + * @param {*} resourceBody The body of the resource to be updated + * @returns http.RefinedResponse + */ + PutResource(id, resourceBody, label = null) { + const token = this.tokenGenerator ? this.tokenGenerator.getToken() : "no token"; + const url = new URL(`${this.FULL_PATH}${id}`); + let nameTag = label ? label : url.pathname; + const params = { + tags: { name: nameTag }, + headers: { + Authorization: "Bearer " + token, + "Content-type": "application/json", + }, + }; + return http.put(url.toString(), JSON.stringify(resourceBody), params); + } + + /** + * Post Resource + * @param {string} id The id of the resource, e.g. "super-simple-service" + * @param {string} resourceBody The body of the resource to be created + * @returns http.RefinedResponse + */ + PostResource(resourceBody) { + const token = this.tokenGenerator ? this.tokenGenerator.getToken() : "no token"; + const url = new URL(`${this.FULL_PATH}`); + + const params = { + headers: { + Authorization: "Bearer " + token, + "Content-type": "application/json", + }, + }; + + return http.post(url.toString(), JSON.stringify(resourceBody), params); + } + + /** + * Post Policy + * @param {string} resourceId The id of the resource, e.g. "super-simple-service" + * @param {xml} xml The policy xml to be uploaded + * @returns http.RefinedResponse + */ + PostPolicy(resourceId, xml) { + const token = this.tokenGenerator ? this.tokenGenerator.getToken() : "no token"; + const url = new URL(`${this.FULL_PATH}${resourceId}/policy`); + + const payload = { + policyFile: http.file(xml, "request.xml", "application/xml"), + }; + + const params = { + headers: { + Authorization: "Bearer " + token, + }, + }; + return http.put(url.toString(), payload, params); + } } export { ResourceRegistryApiClient }; diff --git a/K6/clients/dialogporten/serviceowner/request-body-templates.js b/K6/clients/dialogporten/serviceowner/request-body-templates.js index b4148f28..b1987767 100644 --- a/K6/clients/dialogporten/serviceowner/request-body-templates.js +++ b/K6/clients/dialogporten/serviceowner/request-body-templates.js @@ -45,8 +45,25 @@ function uuidv7() { ); } -export function getDialogBody ( endUser, serviceResource, serviceOwner) { +export function getDialogBody ( endUser, serviceResource, serviceOwner, title = null, otherResource = null) { + if (!title) { + title = `Dialog for ${serviceOwner} - ${new Date().toISOString()}`; + } + let summary = undefined; + let guiActionTitleExtra = ""; + let authorizationAttribute = ""; + let transmissionTitleExtra = ""; + if (otherResource) { + summary = `Dialog på tjeneste '${serviceResource}' som har en transmission på '${otherResource}'.`; + authorizationAttribute = `urn:altinn:resource:${otherResource}`; + transmissionTitleExtra = ` (${otherResource})`; + guiActionTitleExtra = ` for ressurs ${otherResource}`; + } else { + authorizationAttribute = `urn:altinn:resource:${serviceResource}`; + summary = `Dialog på tjeneste '${serviceResource}'. Et sammendrag her. Maks 200 tegn, ingen HTML-støtte. Påkrevd. Vises i liste.`; + } return { + //"id": uuidv7(), "serviceResource": `urn:altinn:resource:${serviceResource}`, // urn starting with urn:altinn:resource: "party": `urn:altinn:person:identifier-no:${endUser}`, // or urn:altinn:organization:identifier-no:<9 digits> "status": "notApplicable", // valid values: notApplicable, inprogress, draft, awaiting, equiresAttention, completed @@ -66,13 +83,13 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { ], "content": { "Title": { - "value": [{ "languageCode": "nb", "value": "Skjema for rapportering av et eller annet" }] + "value": [{ "languageCode": "nb", "value": title }] }, "SenderName": { - "value": [{ "languageCode": "nb", "value": "Avsendernavn" }] + "value": [{ "languageCode": "nb", "value": serviceOwner }] }, "Summary": { - "value": [{ "languageCode": "nb", "value": "Et sammendrag her. Maks 200 tegn, ingen HTML-støtte. Påkrevd. Vises i liste." }] + "value": [{ "languageCode": "nb", "value": summary }] }, "AdditionalInfo": { "mediaType": "text/plain", @@ -85,7 +102,7 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { "transmissions": [ { "type": "Information", - "authorizationAttribute": "element1", + "authorizationAttribute": authorizationAttribute, "sender": { "actorType": "serviceOwner", }, @@ -103,22 +120,31 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { ], "urls": [ { - "url": "https://digdir.apps.tt02.altinn.no/some-other-url", + "url": "https://digdir.no", "consumerType": "Gui" } ] } ], "content": { + "contentReference": { + "value": [ + { + "value": "https://dialogporten-serviceprovider-ahb4fkchhgceevej.norwayeast-01.azurewebsites.net/fce/019c4c6b-1de4-7ff4-a59a-abd448e27b38", + "languageCode": "nb" + } + ], + "mediaType": "application/vnd.dialogporten.frontchannelembed+json;type=markdown" + }, "title": { "value": [ { "languageCode": "nb", - "value": "Forsendelsestittel" + "value": "Forsendelsestittel" + transmissionTitleExtra }, { "languageCode": "en", - "value": "Transmission title" + "value": "Transmission title" + transmissionTitleExtra } ] }, @@ -155,8 +181,9 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { ], "urls": [ { - "url": "https://digdir.apps.tt02.altinn.no/some-other-url", - "consumerType": "Gui" + "url": "https://ksdigital.no/wp-content/uploads/2021/11/20211115-Syntetiske-tverretatlige-testdata.pdf", + "consumerType": "gui", + "mediaType": "application/pdf" } ] } @@ -166,7 +193,7 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { "value": [ { "languageCode": "nb", - "value": "Forsendelsesstittel" + "value": "Forsendelsestittel" }, { "languageCode": "en", @@ -190,7 +217,7 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { }, { "type": "Information", - "authorizationAttribute": "elementius", + //"authorizationAttribute": "elementius", "sender": { "actorType": "serviceOwner" }, @@ -208,7 +235,7 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { ], "urls": [ { - "url": "https://digdir.apps.tt02.altinn.no/some-other-url", + "url": "https://digdir.no", "consumerType": "Gui" } ] @@ -245,14 +272,15 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { "guiActions": [ { "action": "read", + "authorizationAttribute": authorizationAttribute, "url": "https://digdir.no", "priority": "Primary", "title": [ { - "value": "Gå til dialog", + "value": `Gui action${guiActionTitleExtra}`, "languageCode": "nb" } - ] + ], }, { "action": "read", @@ -296,7 +324,7 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { "urls": [ { "consumerType": "gui", - "url": "https://foo.com/foo.pdf", + "url": "https://ksdigital.no/wp-content/uploads/2021/11/20211115-Syntetiske-tverretatlige-testdata.pdf", "mediaType": "application/pdf" } ] @@ -311,7 +339,7 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { "urls": [ { "consumerType": "gui", - "url": "https://foo.com/foo.pdf", + "url": "https://ksdigital.no/wp-content/uploads/2021/11/20211115-Syntetiske-tverretatlige-testdata.pdf", "mediaType": "application/pdf" } ] @@ -326,7 +354,7 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { "urls": [ { "consumerType": "gui", - "url": "https://foo.com/foo.pdf", + "url": "https://ksdigital.no/wp-content/uploads/2021/11/20211115-Syntetiske-tverretatlige-testdata.pdf", "mediaType": "application/pdf" } ] @@ -367,8 +395,8 @@ export function getDialogBody ( endUser, serviceResource, serviceOwner) { }; }; -export function getDialogBodyWithoutTransmissionsAndActivities ( endUser, serviceResource) { - let body = getDialogBody( endUser, serviceResource); +export function getDialogBodyWithoutTransmissionsAndActivities ( endUser, serviceResource, title = null) { + let body = getDialogBody( endUser, serviceResource, title); body.transmissions = []; body.activities = []; return body; @@ -379,7 +407,7 @@ export function getTransmissionBody (relatedTransmissionId = 0) { { "id": uuidv7(), "createdAt": new Date().toISOString(), - "authorizationAttribute": "element1", + //"authorizationAttribute": "element1", "extendedType": "string", "type": "Information", "sender": { diff --git a/K6/clients/dialogporten/serviceowner/serviceowner.js b/K6/clients/dialogporten/serviceowner/serviceowner.js index 27fc53ec..8a00434f 100644 --- a/K6/clients/dialogporten/serviceowner/serviceowner.js +++ b/K6/clients/dialogporten/serviceowner/serviceowner.js @@ -76,6 +76,8 @@ class ServiceOwnerApiClient { serviceOwner, label = null, noTransmissionsActivities = false, + title = null, + otherResource = null, ) { const token = this.tokenGenerator.getToken(); const url = new URL(this.FULL_PATH + "/dialogs"); @@ -90,9 +92,9 @@ class ServiceOwnerApiClient { let requestBody = null; if (!noTransmissionsActivities) { - requestBody = getDialogBody(endUser, serviceResource, serviceOwner); + requestBody = getDialogBody(endUser, serviceResource, serviceOwner, title, otherResource); } else { - requestBody = getDialogBodyWithoutTransmissionsAndActivities(endUser, serviceResource, serviceOwner); + requestBody = getDialogBodyWithoutTransmissionsAndActivities(endUser, serviceResource, serviceOwner, title); } if (__ENV.TRACE_CALL) { params.headers["traceparent"] = uuidv4();