From 6f8aa0b06f69ec999f52ec100bd70d0ca1d82b3d Mon Sep 17 00:00:00 2001 From: codejam Date: Sun, 22 Aug 2021 17:06:08 +0530 Subject: [PATCH] Performance Test --- .circleci/config.yml | 59 +- pom.xml | 230 + test/jmeter/JsonSample.groovy | 52 + test/jmeter/README.md | 210 + test/jmeter/Resource API.jmx | 7258 +++++++++++++++++ test/jmeter/data/challenge-data.json | 27 + .../create-dependency-with-invalid-data.json | 59 + ...create-dependency-with-invalid-tokens.json | 27 + .../create-dependency.json | 14 + ...delete-dependency-with-invalid-tokens.json | 26 + .../get-dependencies-with-invalid-data.json | 34 + .../get-dependency-with-invalid-tokens.json | 27 + .../update-dependency-with-invalid-data.json | 59 + ...update-dependency-with-invalid-tokens.json | 27 + .../update-dependency.json | 12 + .../create-resource-role-by-admin.json | 58 + .../create-resource-role-by-m2m.json | 55 + ...reate-resource-role-with-invalid-data.json | 79 + ...ate-resource-role-with-invalid-tokens.json | 27 + .../get-resource-role-with-invalid-data.json | 79 + .../update-resource-role-by-admin.json | 48 + .../update-resource-role-by-m2m.json | 48 + ...pdate-resource-role-with-invalid-data.json | 79 + ...ate-resource-role-with-invalid-tokens.json | 27 + .../resource/create-resource-by-admin.json | 18 + .../data/resource/create-resource-by-m2m.json | 18 + .../create-resource-with-invalid-data.json | 104 + .../create-resource-with-invalid-tokens.json | 22 + ...elete-resource-with-invalid-parameter.json | 70 + .../delete-resource-with-invalid-tokens.json | 14 + ...ources-by-member-with-different-users.json | 18 + ...rces-by-member-with-invalid-parameter.json | 19 + ...sources-by-member-with-invalid-tokens.json | 19 + ...esources-by-member-with-resource-role.json | 14 + .../get-resources-with-all-parameters.json | 26 + .../get-resources-with-invalid-data.json | 242 + ...get-resources-with-required-parameter.json | 30 + test/jmeter/data/token-data.json | 9 + 38 files changed, 9242 insertions(+), 2 deletions(-) create mode 100644 pom.xml create mode 100644 test/jmeter/JsonSample.groovy create mode 100644 test/jmeter/README.md create mode 100644 test/jmeter/Resource API.jmx create mode 100644 test/jmeter/data/challenge-data.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-data.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/create-dependency.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/get-dependencies-with-invalid-data.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-data.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource-role-phase-dependency/update-dependency.json create mode 100644 test/jmeter/data/resource-role/create-resource-role-by-admin.json create mode 100644 test/jmeter/data/resource-role/create-resource-role-by-m2m.json create mode 100644 test/jmeter/data/resource-role/create-resource-role-with-invalid-data.json create mode 100644 test/jmeter/data/resource-role/create-resource-role-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource-role/get-resource-role-with-invalid-data.json create mode 100644 test/jmeter/data/resource-role/update-resource-role-by-admin.json create mode 100644 test/jmeter/data/resource-role/update-resource-role-by-m2m.json create mode 100644 test/jmeter/data/resource-role/update-resource-role-with-invalid-data.json create mode 100644 test/jmeter/data/resource-role/update-resource-role-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource/create-resource-by-admin.json create mode 100644 test/jmeter/data/resource/create-resource-by-m2m.json create mode 100644 test/jmeter/data/resource/create-resource-with-invalid-data.json create mode 100644 test/jmeter/data/resource/create-resource-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource/delete-resource-with-invalid-parameter.json create mode 100644 test/jmeter/data/resource/delete-resource-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource/get-resources-by-member-with-different-users.json create mode 100644 test/jmeter/data/resource/get-resources-by-member-with-invalid-parameter.json create mode 100644 test/jmeter/data/resource/get-resources-by-member-with-invalid-tokens.json create mode 100644 test/jmeter/data/resource/get-resources-by-member-with-resource-role.json create mode 100644 test/jmeter/data/resource/get-resources-with-all-parameters.json create mode 100644 test/jmeter/data/resource/get-resources-with-invalid-data.json create mode 100644 test/jmeter/data/resource/get-resources-with-required-parameter.json create mode 100644 test/jmeter/data/token-data.json diff --git a/.circleci/config.yml b/.circleci/config.yml index c86be2c..b567e88 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,6 +3,9 @@ parameters: run_automatedtesting: default: false type: boolean + run_performancetesting: + default: false + type: boolean run_basedeployment: default: true type: boolean @@ -54,7 +57,7 @@ builddeploy_steps: &builddeploy_steps --url https://circleci.com/api/v2/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pipeline \ --header "Circle-Token: ${QA_USER_TOKEN}" \ --header 'content-type: application/json' \ - --data '{"branch":"'"$CIRCLE_BRANCH"'","parameters":{"run_automatedtesting":true , "run_basedeployment": false}}' + --data '{"branch":"'"$CIRCLE_BRANCH"'","parameters":{"run_performancetesting":true , "run_automatedtesting":true, "run_basedeployment": false}}' fi @@ -107,8 +110,44 @@ jobs: npm run test:newman:clear npm run test:newman npm run test:newman:clear + + "Performance-Testing": + docker: + # specify the version you desire here + - image: circleci/openjdk:8-jdk + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/postgres:9.4 + + working_directory: ~/repo + + environment: + # Customize the JVM maximum heap limit + MAVEN_OPTS: -Xmx3200m + + steps: + - checkout + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "pom.xml" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + - run: mvn dependency:go-offline + + - save_cache: + paths: + - ~/.m2 + key: v1-dependencies-{{ checksum "pom.xml" }} + + - run: mvn verify + - store_artifacts: - path: ./newman + path: target/jmeter/reports workflows: version: 2 @@ -146,3 +185,19 @@ workflows: only: - develop - dev-circleci + + Performance Testing: + when: << pipeline.parameters.run_performancetesting >> + jobs: + # Performance Test is executed on "feature/performance" "develop" and "performance" branches only. + - Hold [Performance-Testing]: + type: approval + - Performance-Testing: + context : org-global + requires: + - Hold [Performance-Testing] + filters: + branches: + only: + - develop + - performance \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..104a7d6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,230 @@ + + 4.0.0 + com.ubikingenierie.ubikloadpack + jmeter-maven-plugin-demo + 0.0.1-SNAPSHOT + + UTF-8 + 2.9.0 + Resource API.jmx + + + + commons-codec + commons-codec + 1.11 + + + org.slf4j + slf4j-api + 1.7.25 + + + org.apache.jmeter + ApacheJMeter_core + 5.1 + + + + + + + + + + standalone + + true + + + + + com.lazerycode.jmeter + jmeter-maven-plugin + ${jmeter-maven-plugin.version} + + true + 60 + true + + ${project.version} + 7 + 30 + + + kg.apc:jmeter-plugins-casutg:2.8 + + + com.ubikingenierie.ubikloadpack:jmeter-maven-plugin-demo:${project.version} + + + org.slf4j:slf4j-nop + avalon-framework:* + org.apache.tika:* + excalibur-datasource:excalibur-datasource + excalibur-instrument:excalibur-instrument + excalibur-logger:excalibur-logger + excalibur-pool:* + org.beanshell:bsh:jar:2.0b5 + + + + -XX:MaxMetaspaceSize=512m + -Xmx2048m + -Xms2048m + + + + ${jmeterScript} + + ./test/jmeter + + + + jmeter-tests + verify + + jmeter + results + + + + + + + + + worker + + + + org.codehaus.groovy.maven + gmaven-plugin + 1.0 + + + generate-resources + + execute + + + + project.properties["hostname"] = InetAddress.getLocalHost().getHostName() + + + + + + + com.lazerycode.jmeter + jmeter-maven-plugin + ${jmeter-maven-plugin.version} + + + true + + + kg.apc:jmeter-plugins-casutg:2.8 + + + com.ubikingenierie.ubikloadpack:jmeter-maven-plugin-demo:${project.version} + + + org.slf4j:slf4j-nop + avalon-framework:* + org.apache.tika:* + excalibur-datasource:excalibur-datasource + excalibur-instrument:excalibur-instrument + excalibur-logger:excalibur-logger + excalibur-pool:* + org.beanshell:bsh:jar:2.0b5 + + + + -XX:MaxMetaspaceSize=512m + -Xmx2048m + -Xms2048m + + + ${hostname} + 3010 + + + + start-jmeter-server + + remote-server + + verify + + false + + + + + + + + + controller + + + + com.lazerycode.jmeter + jmeter-maven-plugin + ${jmeter-maven-plugin.version} + + + true + + + ${project.version} + 7 + 30 + + true + + kg.apc:jmeter-plugins-casutg:2.8 + + + com.ubikingenierie.ubikloadpack:jmeter-maven-plugin-demo:${project.version} + + + org.slf4j:slf4j-nop + avalon-framework:* + org.apache.tika:* + excalibur-datasource:excalibur-datasource + excalibur-instrument:excalibur-instrument + excalibur-logger:excalibur-logger + excalibur-pool:* + org.beanshell:bsh:jar:2.0b5 + + + + -XX:MaxMetaspaceSize=512m + -Xmx2048m + -Xms2048m + + + + ${serverList} + true + + + + + performance-test + + jmeter + results + + verify + + + + + + + + \ No newline at end of file diff --git a/test/jmeter/JsonSample.groovy b/test/jmeter/JsonSample.groovy new file mode 100644 index 0000000..23c935c --- /dev/null +++ b/test/jmeter/JsonSample.groovy @@ -0,0 +1,52 @@ +import groovy.json.JsonSlurper +import groovy.json.JsonOutput +import org.apache.jmeter.services.FileServer +import java.util.concurrent.ConcurrentLinkedQueue +import java.util.concurrent.ConcurrentHashMap + +class JsonSampleHolder { + static samples = + MapWithDefault.newInstance( + new ConcurrentHashMap(), { String f -> new JsonSample(f) } + ) + + static def next(file) { + return samples.get(file).next() + } +} + +class JsonSample { + def data = null + def ite = null + + JsonSample(file) { + if(data == null) { + def inputPath = FileServer.getFileServer().getBaseDir() + file + File inputFile = new File(inputPath) + def slurper = new JsonSlurper() + data = new ConcurrentLinkedQueue(slurper.parse(inputFile)) + ite = data.iterator() + } + } + synchronized def next() { + if(!ite.hasNext()) { + ite = data.iterator() + } + return ite.next() + } +} + + +Thread thread = Thread.currentThread(); +Long threadNum = thread.getId(); +def value = JsonSampleHolder.next(args[0]) +def json = JsonOutput.toJson(value) +log.info(threadNum + " : " + value) +vars.putObject(args[1], value) +vars.put(args[1] + "_json", json) + +if(binding.hasVariable('SampleResult')) { + SampleResult.setContentType("application/json") + SampleResult.setResponseCodeOK() + SampleResult.setResponseData(json, "utf-8") +} diff --git a/test/jmeter/README.md b/test/jmeter/README.md new file mode 100644 index 0000000..dab4061 --- /dev/null +++ b/test/jmeter/README.md @@ -0,0 +1,210 @@ +# Topcoder - JMeter Performance Testing Framework - Part 1 + +## Requirements +- [Java VM >= 8](https://www.java.com/en/download/) +- [Apache maven >= ](https://maven.apache.org/download.cgi) +- [Apache jmeter >= 5.4.1](https://jmeter.apache.org/download_jmeter.cgi) + +## Project structure +- env/ + - _Default env vars to test locally_ +- test/jmeter + - data/ + - _Json Datasets_ + - JsonSample.groovy + - _Custom Json sampler in groovy_ + - Resource API.jmx + - _JMeter test plan file_ +- pom.xml + - _Maven configuration file_ +## What is provided in this project? + + +### Sensitive variables +Sensitive informations are now loaded though environments variables. +- User credentials +- M2M credentials +- TopCoder API URL + - This one is not sensitive but loading it through env var instead of csv or json is more convenient. + +Addind new one is as simple as adding new user variable within JMeter. The value of the variable has just to be set to : +```groovy +${__groovy(System.getenv("ENV_VAR_NAME"))} +``` +You can see exemples in the current JMeter test file +- Authentication/Crendentials +- Resource API[DEV]/API Variables + +As these env vars are copied to standard JMeter vars, they can be used anywhere in the test plan with `${var}`. + +## Json datasets +A groovy script `JsonSample.groovy` is provided to load data from Json files. +It has been implemented using [these datasets](https://github.com/topcoder-platform/resources-api/tree/develop/test/postman/testData/resource-role) under `Create Resource Role`of the test plan. + +THe script is fully generic and can be used for any Json file that has an array as the root object (see bellow). + +### Format requirements +The JSon root object must be an array, the content of it is not restricted. +```json +[ + { + "memberHandle": "handle1", + "httpCode": 200 + }, + { + "memberHandle": "handle2", + "httpCode": 200 + } +] +``` + +### Usage +The has to be used as a `JSR223 Sampler` or `JSR223 PreProcessor` with groovy interpreter. + +Here are the required parameters +- File Name: `JsonSample.groovy` (script path relative to test directory) + +- Parameters: json dataset location + destination var, separated by space. + - ie: /data/sample.json myvar + +### Exemples +You can see an exemple of using the parser as a Sample in the `create-resource-role-by-admin` section of the test plan + +An exemple using it as a pre-processor is available with `create-resource-role-by-m2m`, an inline groovy script is then used to remove unneeded fileds from data, but it can also be written as a plain groovy script. See the body of the `Create active, read and write access resource role by M2M`request. +```groovy +${__groovy( + import groovy.json.JsonOutput + JsonOutput.toJson(vars.getObject("resource_role_m2m").findAll {k\,v -> !['httpCode'\, 'message'].contains(k)} ) +)} +``` + +### Behaviour + +Each of the JMeter gets a different value, very similar to the CSV Dataset Behaviour. + +If there is no more data to load, the reading restarts at the beginning. + +Each element of the Json array is stored as Object to the JMeter variable whose is name from the second groovy script parameter (see Parameters above). + +The result is also stored as the `SampleResult` if used as a Sample and can be use by the orginal Jmeter parsers (ie. JsonPath extractor) + +Finally the element json string is stored inside the `varname_json` var. + +The result can alos be processed by any of the JMeter scripting languages, an exemple is provided in the JMeter test plan. + +```groovy +// Extracting simple json object (no children) to vars named with the keys of the json data +def data = vars.getObject("tokens") +data.entrySet().each { + vars.put(it.getKey(), it.getValue()) +} +``` + +## Testing + +## JMeter GUI +Default env file are provided to allow testing the project without executing CI. + +```bash +source env/api.env +source env/credentials.env +source env/m2m.env +jmeter -t "test/jmeter/Resource API.jmx" +``` + +## Testing with maven +```bash +mvn clean verify + +... + +INFO] ------------------------------------------------------- +[INFO] C O N F I G U R I N G J M E T E R +[INFO] ------------------------------------------------------- +[INFO] +[INFO] Building JMeter directory structure... +[INFO] Configuring JMeter artifacts... +[INFO] Populating JMeter directory... +[INFO] Copying extensions to JMeter lib/ext directory /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/lib/ext with downloadExtensionDependencies set to true... +[WARNING] The POM for commons-math3:commons-math3:jar:3.4.1 is missing, no dependency information available +[WARNING] The POM for commons-pool2:commons-pool2:jar:2.3 is missing, no dependency information available +[INFO] Copying JUnit libraries to JMeter junit lib directory /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/lib/junit with downloadLibraryDependencies set to true... +[INFO] Copying test libraries to JMeter lib directory /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/lib with downloadLibraryDependencies set to true... +[WARNING] The POM for xom:xom:jar:1.2.10 is missing, no dependency information available +[INFO] Configuring JMeter properties... +[INFO] Generating JSON Test config... +[INFO] +[INFO] <<< jmeter-maven-plugin:2.9.0:jmeter (jmeter-tests) < :configure @ jmeter-maven-plugin-demo <<< +[INFO] +[INFO] +[INFO] --- jmeter-maven-plugin:2.9.0:jmeter (jmeter-tests) @ jmeter-maven-plugin-demo --- +[INFO] +[INFO] ------------------------------------------------------- +[INFO] P E R F O R M A N C E T E S T S +[INFO] ------------------------------------------------------- +[INFO] +[INFO] Will generate HTML report in /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/reports/Resource API +[INFO] Executing test: Resource API.jmx +[INFO] Arguments for forked JMeter JVM: [java, -Xms512M, -Xmx512M, -XX:MaxMetaspaceSize=512m, -Xmx2048m, -Xms2048m, -Djava.awt.headless=true, -jar, ApacheJMeter-5.1.1.jar, -d, /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter, -e, -j, /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/logs/Resource API.jmx.log, -l, /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/results/20210803-Resource API.csv, -n, -o, /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/reports/Resource API, -t, /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/testFiles/Resource API.jmx, -Dsun.net.http.allowRestrictedHeaders, true] +[INFO] +[INFO] WARNING: An illegal reflective access operation has occurred +[INFO] WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/lib/xstream-1.4.11.jar) to field java.util.TreeMap.comparator +[INFO] WARNING: Please consider reporting this to the maintainers of com.thoughtworks.xstream.core.util.Fields +[INFO] WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations +[INFO] WARNING: All illegal access operations will be denied in a future release +[INFO] Warning: Nashorn engine is planned to be removed from a future JDK release +[INFO] Creating summariser +[INFO] Created the tree successfully using /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/testFiles/Resource API.jmx +[INFO] Starting the test @ Tue Aug 03 16:12:31 CEST 2021 (1627999951676) +[INFO] Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445 +[INFO] Warning: Nashorn engine is planned to be removed from a future JDK release +[INFO] summary + 1 in 00:00:03 = 0,3/s Avg: 2915 Min: 2915 Max: 2915 Err: 0 (0,00%) Active: 1 Started: 1 Finished: 0 +[INFO] summary + 22 in 00:00:18 = 1,3/s Avg: 518 Min: 1 Max: 1880 Err: 8 (36,36%) Active: 0 Started: 1 Finished: 1 +[INFO] summary = 23 in 00:00:21 = 1,1/s Avg: 623 Min: 1 Max: 2915 Err: 8 (34,78%) +[INFO] Tidying up ... @ Tue Aug 03 16:12:53 CEST 2021 (1627999973022) +[INFO] ... end of run +[INFO] Completed Test: /Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/testFiles/Resource API.jmx +[INFO] +[INFO] +[INFO] --- jmeter-maven-plugin:2.9.0:results (jmeter-tests) @ jmeter-maven-plugin-demo --- +[INFO] +[INFO] ------------------------------------------------------- +[INFO] S C A N N I N G F O R R E S U L T S +[INFO] ------------------------------------------------------- +[INFO] +[INFO] Will scan results using format: CSV +[INFO] +[INFO] Parsing results file '/Users/gmagniez/Work/topcoder/jmeter/submission/target/jmeter/results/20210803-Resource API.csv' as type: CSV +[INFO] Number of failures in '20210803-Resource API.csv': 8 +[INFO] Number of successes in '20210803-Resource API.csv': 15 +[INFO] +[INFO] ------------------------------------------------------- +[INFO] P E R F O R M A N C E T E S T R E S U L T S +[INFO] ------------------------------------------------------- +[INFO] +[INFO] Result (.csv) files scanned: 1 +[INFO] Successful requests: 15 +[INFO] Failed requests: 8 +[INFO] Failures: 34.782608% (60.0% accepted) +[INFO] +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 33.142 s +[INFO] Finished at: 2021-08-03T16:12:54+02:00 +[INFO] ------------------------------------------------------------------------ +[INFO] Shutdown detected, destroying JMeter process... +[INFO] +``` + +## Integration with CircleCI +Use a classic Maven/Java pipeline : [Language Guide: Java (with Maven)](https://circleci.com/docs/2.0/language-java-maven/) + +Provided required environment variables : [Using Environment Variables](https://circleci.com/docs/2.0/env-vars/) + + +## Errors +All errors reported by JMeter where already present in the provided tests plan, it was not asked to solve them. +- User 2&3 Invalid credentials +- RessourceRole creation + - Provided ids already exists, not modified to avoid creating millions of entries in the ressource-role database. diff --git a/test/jmeter/Resource API.jmx b/test/jmeter/Resource API.jmx new file mode 100644 index 0000000..642e5ba --- /dev/null +++ b/test/jmeter/Resource API.jmx @@ -0,0 +1,7258 @@ + + + + + Check the Performance of the Resource API + false + true + false + + + + basedir + ${__groovy(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir();)}${__groovy(File.separator)} + = + + + + + + + + continue + + false + 1 + + 1 + 1 + false + + + false + + + + + + true + ${basedir}/JsonSample.groovy + /data/credentials.json credentials + + groovy + + + + true + + + def data = vars.getObject("credentials") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + + + + adminusername + ${__groovy(System.getenv("ADMIN_USERNAME"))} + = + + + adminpassword + ${__groovy(System.getenv("ADMIN_PASSWORD"))} + = + + + managerusername + ${__groovy(System.getenv("MANAGER_USERNAME"))} + = + + + managerpassword + ${__groovy(System.getenv("MANAGER_PASSWORD"))} + = + + + copilotusername + ${__groovy(System.getenv("COPILOT_USERNAME"))} + = + + + copilotpassword + ${__groovy(System.getenv("COPILOT_PASSWORD"))} + = + + + user1username + ${__groovy(System.getenv("USER1_USERNAME"))} + = + + + user1password + ${__groovy(System.getenv("USER1_PASSWORD"))} + = + + + user2username + ${__groovy(System.getenv("USER2_USERNAME"))} + = + + + user2password + ${__groovy(System.getenv("USER2_PASSWORD"))} + = + + + user3username + ${__groovy(System.getenv("USER3_USERNAME"))} + = + + + user3password + ${__groovy(System.getenv("USER3_PASSWORD"))} + = + + + m2m_all_client_id + ${__groovy(System.getenv("M2M_ALL_CLIENT_ID"))} + = + + + m2m_all_client_secret + ${__groovy(System.getenv("M2M_ALL_CLIENT_SECRET"))} + = + + + m2m_read_client_id + ${__groovy(System.getenv("M2M_READ_CLIENT_ID"))} + = + + + m2m_read_client_secret + ${__groovy(System.getenv("M2M_READ_CLIENT_SECRET"))} + = + + + m2m_modify_client_id + ${__groovy(System.getenv("M2M_MODIFY_CLIENT_ID"))} + = + + + m2m_modify_client_secret + ${__groovy(System.getenv("M2M_MODIFY_CLIENT_SECRET"))} + = + + + + + + + + + + + false + ${adminusername} + = + true + username + + + false + ${adminpassword} + = + true + password + + + false + JFDo7HMkf0q2CkVFHojy3zHWafziprhT + = + true + client_id + + + false + false + = + true + sso + + + false + openid profile offline_access + = + true + scope + + + false + token + = + true + response_type + + + false + TC-User-Database + = + true + connection + + + false + password + = + true + grant_type + + + false + Browser + = + true + device + + + + topcoder-dev.auth0.com + + https + + /oauth/ro + POST + true + false + true + false + + + + + + + Get the {refresh_token} + refresh_token + refresh_token + + + + + Get the {id_token} + id_token + id_token + + + + + Set the {access_token} globally + ${__setProperty(id_token, ${id_token})}; +${__setProperty(refresh_token, ${refresh_token})}; + + + false + + + + + true + + + + false + { + "param": { + "externalToken": "${__property(id_token)}", + "refreshToken": "${__property(refresh_token)}" + } +} + = + + + + api.topcoder-dev.com + + https + + /v3/authorizations + POST + true + false + true + false + + + + + + + + + Authorization + Bearer ${__property(id_token)} + + + cache-control + no-cache + + + Content-Type + application/json + + + + + + adminusertoken + $.result[*].token + + + + + ${__setProperty(adminusertoken, ${adminusertoken})}; + + + false + + + + + + + + + + + false + ${managerusername} + = + true + username + + + false + ${managerpassword} + = + true + password + + + false + JFDo7HMkf0q2CkVFHojy3zHWafziprhT + = + true + client_id + + + false + false + = + true + sso + + + false + openid profile offline_access + = + true + scope + + + false + token + = + true + response_type + + + false + TC-User-Database + = + true + connection + + + false + password + = + true + grant_type + + + false + Browser + = + true + device + + + + topcoder-dev.auth0.com + + https + + /oauth/ro + POST + true + false + true + false + + + + + + + Get the {refresh_token} + refresh_token + refresh_token + + + + + Get the {id_token} + id_token + id_token + + + + + Set the {access_token} globally + ${__setProperty(id_token, ${id_token})}; +${__setProperty(refresh_token, ${refresh_token})}; + + + false + + + + + true + + + + false + { + "param": { + "externalToken": "${__property(id_token)}", + "refreshToken": "${__property(refresh_token)}" + } +} + = + + + + api.topcoder-dev.com + + https + + /v3/authorizations + POST + true + false + true + false + + + + + + + + + Authorization + Bearer ${__property(id_token)} + + + cache-control + no-cache + + + Content-Type + application/json + + + + + + managerusertoken + $.result[*].token + + + + + ${__setProperty(managerusertoken, ${managerusertoken})}; + + + false + + + + + + + + + + + false + ${copilotusername} + = + true + username + + + false + ${copilotpassword} + = + true + password + + + false + JFDo7HMkf0q2CkVFHojy3zHWafziprhT + = + true + client_id + + + false + false + = + true + sso + + + false + openid profile offline_access + = + true + scope + + + false + token + = + true + response_type + + + false + TC-User-Database + = + true + connection + + + false + password + = + true + grant_type + + + false + Browser + = + true + device + + + + topcoder-dev.auth0.com + + https + + /oauth/ro + POST + true + false + true + false + + + + + + + Get the {refresh_token} + refresh_token + refresh_token + + + + + Get the {id_token} + id_token + id_token + + + + + Set the {access_token} globally + ${__setProperty(id_token, ${id_token})}; +${__setProperty(refresh_token, ${refresh_token})}; + + + false + + + + + true + + + + false + { + "param": { + "externalToken": "${__property(id_token)}", + "refreshToken": "${__property(refresh_token)}" + } +} + = + + + + api.topcoder-dev.com + + https + + /v3/authorizations + POST + true + false + true + false + + + + + + + + + Authorization + Bearer ${__property(id_token)} + + + cache-control + no-cache + + + Content-Type + application/json + + + + + + copilotusertoken + $.result[*].token + + + + + ${__setProperty(copilotusertoken, ${copilotusertoken})}; + + + false + + + + + + + + + + + false + ${user1username} + = + true + username + + + false + ${user1password} + = + true + password + + + false + JFDo7HMkf0q2CkVFHojy3zHWafziprhT + = + true + client_id + + + false + false + = + true + sso + + + false + openid profile offline_access + = + true + scope + + + false + token + = + true + response_type + + + false + TC-User-Database + = + true + connection + + + false + password + = + true + grant_type + + + false + Browser + = + true + device + + + + topcoder-dev.auth0.com + + https + + /oauth/ro + POST + true + false + true + false + + + + + + + Get the {refresh_token} + refresh_token + refresh_token + + + + + Get the {id_token} + id_token + id_token + + + + + Set the {access_token} globally + ${__setProperty(id_token, ${id_token})}; +${__setProperty(refresh_token, ${refresh_token})}; + + + false + + + + + true + + + + false + { + "param": { + "externalToken": "${__property(id_token)}", + "refreshToken": "${__property(refresh_token)}" + } +} + = + + + + api.topcoder-dev.com + + https + + /v3/authorizations + POST + true + false + true + false + + + + + + + + + Authorization + Bearer ${__property(id_token)} + + + cache-control + no-cache + + + Content-Type + application/json + + + + + + normaluser_1_token + $.result[*].token + + + + + ${__setProperty(normaluser_1_token, ${normaluser_1_token})}; + + + false + + + + + + + + + + + false + ${user2username} + = + true + username + + + false + ${user2password} + = + true + password + + + false + JFDo7HMkf0q2CkVFHojy3zHWafziprhT + = + true + client_id + + + false + false + = + true + sso + + + false + openid profile offline_access + = + true + scope + + + false + token + = + true + response_type + + + false + TC-User-Database + = + true + connection + + + false + password + = + true + grant_type + + + false + Browser + = + true + device + + + + topcoder-dev.auth0.com + + https + + /oauth/ro + POST + true + false + true + false + + + + + + + Get the {refresh_token} + refresh_token + refresh_token + + + + + Get the {id_token} + id_token + id_token + + + + + Set the {access_token} globally + ${__setProperty(id_token, ${id_token})}; +${__setProperty(refresh_token, ${refresh_token})}; + + + false + + + + + true + + + + false + { + "param": { + "externalToken": "${__property(id_token)}", + "refreshToken": "${__property(refresh_token)}" + } +} + = + + + + api.topcoder-dev.com + + https + + /v3/authorizations + POST + true + false + true + false + + + + + + + + + Authorization + Bearer ${__property(id_token)} + + + cache-control + no-cache + + + Content-Type + application/json + + + + + + normaluser_2_token + $.result[*].token + + + + + ${__setProperty(normaluser_2_token, ${normaluser_2_token})}; + + + false + + + + + + + + + + + false + ${user3username} + = + true + username + + + false + ${user3password} + = + true + password + + + false + JFDo7HMkf0q2CkVFHojy3zHWafziprhT + = + true + client_id + + + false + false + = + true + sso + + + false + openid profile offline_access + = + true + scope + + + false + token + = + true + response_type + + + false + TC-User-Database + = + true + connection + + + false + password + = + true + grant_type + + + false + Browser + = + true + device + + + + topcoder-dev.auth0.com + + https + + /oauth/ro + POST + true + false + true + false + + + + + + + Get the {refresh_token} + refresh_token + refresh_token + + + + + Get the {id_token} + id_token + id_token + + + + + Set the {access_token} globally + ${__setProperty(id_token, ${id_token})}; +${__setProperty(refresh_token, ${refresh_token})}; + + + false + + + + + true + + + + false + { + "param": { + "externalToken": "${__property(id_token)}", + "refreshToken": "${__property(refresh_token)}" + } +} + = + + + + api.topcoder-dev.com + + https + + /v3/authorizations + POST + true + false + true + false + + + + + + + + + Authorization + Bearer ${__property(id_token)} + + + cache-control + no-cache + + + Content-Type + application/json + + + + + + normaluser_3_token + $.result[*].token + + + + + ${__setProperty(normaluser_3_token, ${normaluser_3_token})}; + + + false + + + + + + + + + false + https://m2m.topcoder-dev.com/ + = + true + audience + + + false + client_credentials + = + true + grant_type + + + false + application/json + = + true + content-type + + + false + ${m2m_all_client_id} + = + true + client_id + + + false + ${m2m_all_client_secret} + = + true + client_secret + + + + topcoder-dev.auth0.com + + https + + /oauth/token + POST + true + false + true + false + + + + + + + Get the {access_token} + m2m_token + access_token + + + + + Set the {access_token} globally + ${__setProperty(m2m_token, ${m2m_token})}; + + + false + + + + + + + + false + https://m2m.topcoder-dev.com/ + = + true + audience + + + false + client_credentials + = + true + grant_type + + + false + application/json + = + true + content-type + + + false + ${m2m_read_client_id} + = + true + client_id + + + false + ${m2m_read_client_secret} + = + true + client_secret + + + + topcoder-dev.auth0.com + + https + + /oauth/token + POST + true + false + true + false + + + + + + + Get the {access_token} + m2m_token_read + access_token + + + + + Set the {access_token} globally + ${__setProperty(m2m_token_read, ${m2m_token_read})}; + + + false + + + + + + + + false + https://m2m.topcoder-dev.com/ + = + true + audience + + + false + client_credentials + = + true + grant_type + + + false + application/json + = + true + content-type + + + false + ${m2m_modify_client_id} + = + true + client_id + + + false + ${m2m_modify_client_secret} + = + true + client_secret + + + + topcoder-dev.auth0.com + + https + + /oauth/token + POST + true + false + true + false + + + + + + + Get the {access_token} + m2m_token_modify + access_token + + + + + Set the {access_token} globally + ${__setProperty(m2m_token_modify, ${m2m_token_modify})}; + + + false + + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + + + server-url + ${__groovy(System.getenv("SERVER_URL") ?: "api.topcoder-dev.com")} + = + + + + + + + + true + ${basedir}/JsonSample.groovy + /data/token-data.json tokens + + groovy + + + + true + + + def data = vars.getObject("tokens") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + + + + true + ${basedir}/JsonSample.groovy + /data/challenge-data.json challenge + + groovy + + + + true + + + def data = vars.getObject("challenge") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + + + + + ${server-url} + + https + + /v5/resources/health + GET + true + false + true + false + + + + health check + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + checksRun + checksRun + + + + + ${__setProperty(checksRun, ${checksRun})}; + + + false + + + + + ${JMeterThread.last_sample_ok} + false + true + + + + 1500 + + + + + + + + + + groovy + /data/resource-role/create-resource-role-by-admin.json resource_role_admin + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("resource_role_admin") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + { + "name": "${name}", + "fullReadAccess": ${fullReadAccess}, + "fullWriteAccess": ${fullWriteAccess}, + "isActive": ${isActive}, + "selfObtainable": ${selfObtainable} +} + = + + + + ${server-url} + + https + + /v5/resource-roles + POST + true + false + true + false + + + + create active read only access resource role by admin + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + id_admin_copilot_resource_role + id + + + + + ${__setProperty(id_admin_copilot_resource_role, ${id_admin_copilot_resource_role})}; + + + false + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + + + + groovy + ../postman/testData/resource-role/create-resource-role-by-admin.json resource_role_m2m + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("resource_role_m2m") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + ${__groovy( + import groovy.json.JsonOutput + JsonOutput.toJson(vars.getObject("resource_role_m2m").findAll {k\,v -> !['httpCode'\, 'message'].contains(k)} ) +)} + = + + + + ${server-url} + + https + + /v5/resource-roles + POST + true + false + true + false + + + + create-resource-role-by-m2m + + + + groovy + /data/resource-role/create-resource-role-by-admin.json resource_role_m2m + ${basedir}/JsonSample.groovy + true + ${basedir}/JsonSample.groovy + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + + + + groovy + /data/resource-role/create-resource-role-with-invalid-data.json resource_role_admin_invalid_data + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("resource_role_admin_invalid_data") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + { + "name": "${name}", + "fullReadAccess": ${fullReadAccess}, + "fullWriteAccess": ${fullWriteAccess}, + "required_field_1": "${required_field_1}", + "required_field_2": "${required_field_2}", + "isActive": ${isActive}, + "selfObtainable": ${selfObtainable} +} + = + + + + ${server-url} + + https + + /v5/resource-roles + POST + true + false + true + false + + + + create active, read and write access resource role by M2M + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + id_m2m_submitter_resource_role + id + + + + + ${__setProperty(id_m2m_submitter_resource_role, ${id_m2m_submitter_resource_role})}; + + + false + + + + message_received + .message + + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + ${message} + + + Assertion.response_data + true + 8 + variable + message_received + + + + + + + + groovy + /data/resource-role/create-resource-role-with-invalid-tokens.json resource_role_admin_invalid_token + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("resource_role_admin_invalid_token") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + { + "name": "IGNORE", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles + POST + true + false + true + false + + + + create active, read and write access resource role by Admin + + + + + + Authorization + ${jwtToken} + + + content-type + application/json + + + + + + message_received + .message + + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + ${message} + + + Assertion.response_data + true + 8 + variable + message_received + + + + + + false + true + false + + + + + + + + + groovy + /data/resource-role/update-resource-role-by-admin.json update_resource_role_admin + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("update_resource_role_admin") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + { + "name": "${name}", + "fullReadAccess": ${fullReadAccess}, + "fullWriteAccess": ${fullWriteAccess}, + "isActive": ${isActive}, + "selfObtainable": ${selfObtainable} +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + PUT + true + false + true + false + + + + update resource role via admin + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + + + + groovy + ../postman/testData/resource-role/create-resource-role-by-admin.json resource_role_m2m + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("resource_role_m2m") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + ${__groovy( + import groovy.json.JsonOutput + JsonOutput.toJson(vars.getObject("resource_role_m2m").findAll {k\,v -> !['httpCode'\, 'message'].contains(k)} ) +)} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + POST + true + false + true + false + + + + update-resource-role-by-m2m + + + + groovy + /data/resource-role/update-resource-role-by-m2m.json resource_role_m2m + ${basedir}/JsonSample.groovy + true + ${basedir}/JsonSample.groovy + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + + true + + + + false + { + "name": "failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/test + PUT + true + false + true + false + + + + Update resource role invalid id 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + PUT + true + false + true + false + + + + update resource role missing parameter 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "name": "failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + PUT + true + false + true + false + + + + update resource role without token 401 + + + + true + + + + false + { + "name": "failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + PUT + true + false + true + false + + + + update resource role invalid token 401 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "name": "failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + PUT + true + false + true + false + + + + update resource role expired token 401 + + + + + + Authorization + Bearer ${expire_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "name": "failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + PUT + true + false + true + false + + + + update resource role by user 403 + + + + + + Authorization + Bearer ${__property(normaluser_3_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "name": "failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_m2m_submitter_resource_role} + PUT + true + false + true + false + + + + update resource role using invalid m2m token 403 + + + + + + Authorization + Bearer ${invalid_m2m_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "name": "failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/12345 + PUT + true + false + true + false + + + + update resource role not-found 404 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "name": "JMeter Submitter (M2M | Active) Edit", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/${id_admin_copilot_resource_role} + PUT + true + false + true + false + + + + update resource role name duplication 409 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles + GET + true + false + true + false + + + + get all resource roles + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Failure Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Team Captain + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Specification Submitter + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Final Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Copilot + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Iterative Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Test resource role + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Submitter + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Screener + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Post-Mortem Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Aggregator + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Manager + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Stress Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Specification Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Accuracy Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Free Agent + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Payment Manager + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Observer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Approver + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Primary Screener + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Client Manager + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Checkpoint Reviewer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Checkpoint Screener + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?name=Designer + GET + true + false + true + false + + + + get resource role by name + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + get active resource roles + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=false + GET + true + false + true + false + + + + Get inactive resource roles + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=invalid + GET + true + false + true + false + + + + failure - get resource roles with invalid parameter 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles using expire token 401 + + + + + + Authorization + Bearer ${expire_token} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles using expire token 401 + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles using invalid token 401 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles using invalid m2m token 403 + + + + + + Authorization + Bearer ${invalid_m2m_token} + + + content-type + application/json + + + + + + + + + + + + + + + groovy + /data/resource-role-phase-dependency/create-dependency.json create_dependency_admin + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("create_dependency_admin") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_1}", + "phaseState": ${phaseState} +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + create dependency by admin + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + dependency_id_admin + id + + + + + ${__setProperty(dependency_id_admin, ${dependency_id_admin})}; + + + false + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + + + + groovy + /data/resource-role-phase-dependency/create-dependency.json create_dependency_m2m + ${basedir}/JsonSample.groovy + true + + + + + true + + + def data = vars.getObject("create_dependency_m2m") +data.entrySet().each { + vars.put(it.getKey(), String.valueOf(it.getValue())) +} + + groovy + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_1}", + "phaseState": ${phaseState} +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + Create dependency {M2M} + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + dependency_id_m2m + id + + + + + ${__setProperty(dependency_id_m2m, ${dependency_id_m2m})}; + + + false + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + + + + true + + + + false + ${__groovy( + import groovy.json.JsonOutput + JsonOutput.toJson(vars.getObject("create_dependency_role_m2m").findAll {k\,v -> !['httpCode'\, 'message'].contains(k)} ) +)} + = + + + + ${server-url} + + https + + /v5/resource-roles + POST + true + false + true + false + + + + create-dependency-by-m2m + + + + groovy + /data/resource-role-phase-dependency/create-dependency.json create_dependency_role_m2m + ${basedir}/JsonSample.groovy + true + ${basedir}/JsonSample.groovy + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + ${httpCode} + + + Assertion.response_code + false + 8 + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + create dependency by M2M + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + dependency_id_m2m + id + + + + + ${__setProperty(dependency_id_m2m, ${dependency_id_m2m})}; + + + false + + + + + true + + + + false + { + "phaseId": "abc", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + Create dependency with invalid body 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + failure - create dependency without token 401 + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + create dependency with expired token 401 + + + + + + Authorization + Bearer ${expire_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + create dependency by user 403 + + + + + + Authorization + Bearer ${__property(normaluser_3_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + create dependency with conflict 409 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "a93544bc-c165-4af4-b55e-18f3593b4570", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + POST + true + false + true + false + + + + create dependency with not found phase id 404 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + GET + true + false + true + false + + + + get all dependencies + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies?phaseId=${phase_id}&resourceRoleId=${id_resource_role_2}&phaseState=false + GET + true + false + true + false + + + + get matched dependencies + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies?phaseId=abc&resourceRoleId=123&phaseState=abc + GET + true + false + true + false + + + + get dependencies with invalid query 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + GET + true + false + true + false + + + + get dependencies with forbidden M2M 403 + + + + + + Authorization + Bearer ${__property(m2m_token_modify)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies + GET + true + false + true + false + + + + get dependencies with forbidden user 403 + + + + + + Authorization + Bearer ${__property(normaluser_3_token)} + + + content-type + application/json + + + + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "ac953811-8268-403a-ac06-fd88a100c9c7", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_admin)} + PUT + true + false + true + false + + + + update dependency via admin + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "ac953811-8268-403a-ac06-fd88a100c9c7", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_m2m)} + PUT + true + false + true + false + + + + update dependency via m2m + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "ac953811-8268-403a-0000-fd88a100c9c7", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_admin)} + PUT + true + false + true + false + + + + update dependency with not found role id 404 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "${id_resource_role_2}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${id_resource_role_2} + PUT + true + false + true + false + + + + update not found dependency 404 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "resourceRoleId": "${id_resource_role_1}", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_admin)} + PUT + true + false + true + false + + + + update dependency with invalid body 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "phaseId": "${phase_id}", + "resourceRoleId": "ac953811-8268-403a-ac06-fd88a100c9c7", + "phaseState": false +} + = + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_admin)} + PUT + true + false + true + false + + + + update dependency via forbidden m2m 403 + + + + + + Authorization + Bearer ${__property(m2m_token_read)} + + + content-type + application/json + + + + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_admin)} + DELETE + true + false + true + false + + + + delete dependency via admin + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_m2m)} + DELETE + true + false + true + false + + + + delete dependency via m2m + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/cfe12b3f-2a12-4639-9d8b-ec86726f76b0 + DELETE + true + false + true + false + + + + failure - delete not found dependency 404 + + + + + + Authorization + Bearer ${__property(m2m_token_modify)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/12345 + DELETE + true + false + true + false + + + + delete dependency via invalid id 400 + + + + + + Authorization + Bearer ${__property(m2m_token_modify)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_m2m)} + DELETE + true + false + true + false + + + + delete dependency via forbidden m2m 403 + + + + + + Authorization + Bearer ${__property(m2m_token_read)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles/Phase-dependencies/${__property(dependency_id_m2m)} + DELETE + true + false + true + false + + + + delete dependency via forbidden user 403 + + + + + + Authorization + Bearer ${__property(normaluser_3_token)} + + + content-type + application/json + + + + + + + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_5}", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + dependency_id_admin + id + + + + + ${__setProperty(dependency_id_admin, ${dependency_id_admin})}; + + + false + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_copilot}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create another resource for hohosky + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + dependency_id_m2m + id + + + + + ${__setProperty(dependency_id_m2m, ${dependency_id_m2m})}; + + + false + + + + + true + + + + false + { + "challengeId": "${challenge_id_2}", + "memberHandle": "${handle_3}", + "roleId": "${id_resource_role_observer}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource by user + + + + + + Authorization + Bearer ${__property(copilotusertoken)} + + + content-type + application/json + + + + + + dependency_id_m2m + id + + + + + ${__setProperty(dependency_id_m2m, ${dependency_id_m2m})}; + + + false + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource using m2m token + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + dependency_id_m2m + id + + + + + ${__setProperty(dependency_id_m2m, ${dependency_id_m2m})}; + + + false + + + + + true + + + + false + { + "challengeId": "${challenge_id_2}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_review}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource for challenge 2 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + dependency_id_m2m + id + + + + + ${__setProperty(dependency_id_m2m, ${dependency_id_m2m})}; + + + false + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_observer}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource for challenge 3 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + dependency_id_m2m + id + + + + + ${__setProperty(dependency_id_m2m, ${dependency_id_m2m})}; + + + false + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "469341ed-19b7-44a4-a8ac-c2bf74544748" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource using inactive role 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "unexisted_role" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource using unexisted role 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "fe6d0a58ce7d4521-8501-11112b1c0391", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_observer}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource invalid challengeId 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle1": "${handle_Invalid}", + "roleId": "${id_resource_role_copilot}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource invalid parameter 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "abc_Invalid", + "roleId": "${id_resource_role_copilot}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource member doesn't exist 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "tonyj", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource using invalid token 401 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "tonyj", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource using expired token 401 + + + + + + Authorization + Bearer ${expire_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "memberHandle": "tonyj", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + POST + true + false + true + false + + + + create resource challengeId missing 400 + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id} + GET + true + false + true + false + + + + get resources by admin + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id}&memberId=${member_id_4} + GET + true + false + true + false + + + + get resources by admin with member ID + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id}&memberHandle=${handle_3} + GET + true + false + true + false + + + + get resources by admin with member handle + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id} + GET + true + false + true + false + + + + get resources by user has full-access permission + + + + + + Authorization + Bearer ${__property(copilotusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id}&memberId=${member_id_1} + GET + true + false + true + false + + + + get resources by user has full-access permission with member ID + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id}&memberId=${handle_1} + GET + true + false + true + false + + + + Get resources by user has full-access permission with member handle + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id} + GET + true + false + true + false + + + + get resources using m2m token + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id}&memberId=${member_id_1} + GET + true + false + true + false + + + + get resources using m2m token with member ID + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id}&memberId=${handle_1} + GET + true + false + true + false + + + + get resources using m2m token with member handle + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=invalid + GET + true + false + true + false + + + + get resources invalid challenge id 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id} + GET + true + false + true + false + + + + get resources using invalid token 401 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id} + GET + true + false + true + false + + + + get resources using expire token 401 + + + + + + Authorization + Bearer ${expire_token} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id} + GET + true + false + true + false + + + + get resources by user without full-access permission 403 + + + + + + Authorization + Bearer ${__property(normaluser_3_token)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id} + GET + true + false + true + false + + + + get resources using invalid m2m token 403 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources?challengeId=${challenge_id_not_found} + GET + true + false + true + false + + + + get resources challenge not found 404 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + + + + ${server-url} + + https + + /v5/resources/16096823/challenges + GET + true + false + true + false + + + + Get challenges hohosky can access + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources/151743/challenges + GET + true + false + true + false + + + + get challenges ghostar can access + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources/151743/challenges?resourceRoleId=318b9c07-079a-42d9-a81f-b96be1dc1099 + GET + true + false + true + false + + + + get challenges ghostar can access with filter + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resources/111111111/challenges + GET + true + false + true + false + + + + get challenges for a non existed user | 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles using expire token 401 + + + + + + Authorization + Bearer ${expire_token} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles without token 401 + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles using invalid token 401 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + + + + ${server-url} + + https + + /v5/resource-roles?isActive=true + GET + true + false + true + false + + + + failure - get resource roles using invalid m2m token 403 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_5}", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource by admin + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_copilot}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + Create another resource for ${handle} + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_2}", + "memberHandle": "${handle_3}", + "roleId": "${id_resource_role_observer}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource by user + + + + + + Authorization + Bearer ${__property(copilotusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource using m2m token + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_2}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_review}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource for challenge ${challenge_id_2} + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_observer}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource for challenge ${challenge_id_3} + + + + + + Authorization + Bearer ${__property(m2m_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_1}", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete obtainable resource by user itself + + + + + + Authorization + Bearer ${__property(copilotusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "lars2520", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete other's self obtainable resource by user 403 + + + + + + Authorization + Bearer ${__property(normaluser_1_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "hohoSKY", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource that user doesn't have 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "invalid", + "memberHandle": "hohoSKY", + "roleId": "${id_resource_role_copilot}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + Delete resource invalid challenge id 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_2}", + "roleId": "2a4dc376-a31c-4d00-b173-13934d89e200" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource using unexisted role 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "${handle_Invalid}", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource member doesn't exist 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": true, + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource invalid parameter 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "tonyj", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource using invalid token 401 + + + + + + Authorization + Bearer ${invalid_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "tonyj", + "roleId": "${id_resource_role_observer}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource using expired token 401 + + + + + + Authorization + Bearer ${expire_token} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "tonyj", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource with invalid user 403 + + + + + + Authorization + Bearer ${__property(normaluser_1_token)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "${challenge_id_3}", + "memberHandle": "tonyj", + "roleId": "${id_resource_role_submitter}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource using invalid m2m token 403 + + + + + + Authorization + Bearer ${__property(m2m_token_read)} + + + content-type + application/json + + + + + + + true + + + + false + { + "challengeId": "b197d41c-92f1-4d94-0000-87a13e83e053", + "memberHandle": "hohoSKY", + "roleId": "${id_resource_role_copilot}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource challenge not found 404 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + true + + + + false + { + "memberHandle": "HoHoSKY", + "roleId": "${id_resource_role_copilot}" +} + = + + + + ${server-url} + + https + + /v5/resources + DELETE + true + false + true + false + + + + delete resource missing challengeId 400 + + + + + + Authorization + Bearer ${__property(adminusertoken)} + + + content-type + application/json + + + + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + report.csv + + + + + diff --git a/test/jmeter/data/challenge-data.json b/test/jmeter/data/challenge-data.json new file mode 100644 index 0000000..04a5287 --- /dev/null +++ b/test/jmeter/data/challenge-data.json @@ -0,0 +1,27 @@ +[ + { + "Copilot_resource_role_id": "838b231b-8ab6-4e4f-96d3-f1d483e0c30e", + "challenge_id": "b197d41c-92f1-4d94-911a-87a13e83e053", + "challenge_id_2": "a494c004-d303-48e2-afe0-0ce9786ab2d2", + "challenge_id_3": "53383a29-80ef-4230-b48f-08a6d302f1ed", + "phase_id": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "handle_1": "TCConnCopilot", + "member_id_1": 41002174, + "handle_2": "ghostar", + "member_id_2": 151743, + "handle_3": "pshah_copilot", + "member_id_3": 41002174, + "handle_4": "TopConnCustomer", + "member_id_4": 40158997, + "handle_5": "mess", + "member_id_5": 305384, + "handle_Invalid": "abc", + "challenge_id_not_found": "xxxd0a58-ce7d-4521-8501-b8132b1c0391", + "id_resource_role_1": "d663fc84-5c37-43d1-a537-793feffb7667", + "id_resource_role_2": "92276e89-08cb-4071-a59b-ffc8f10b0ec4", + "id_resource_role_copilot": "cfe12b3f-2a24-4639-9d8b-ec86726f76bd", + "id_resource_role_review": "318b9c07-079a-42d9-a81f-b96be1dc1099", + "id_resource_role_submitter": "732339e7-8e30-49d7-9198-cccf9451e221", + "id_resource_role_observer": "2a4dc376-a31c-4d00-b173-13934d89e286" + } + ] \ No newline at end of file diff --git a/test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-data.json b/test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-data.json new file mode 100644 index 0000000..22f8b78 --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-data.json @@ -0,0 +1,59 @@ +[ + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is not allowed to be empty" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "not_guid", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" must be a valid GUID" + }, + { + "required_field_1": "phaseIdNotProvided", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseStateNotProvided", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseState\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "not a guid", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json b/test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/create-dependency-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/jmeter/data/resource-role-phase-dependency/create-dependency.json b/test/jmeter/data/resource-role-phase-dependency/create-dependency.json new file mode 100644 index 0000000..4469b8f --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/create-dependency.json @@ -0,0 +1,14 @@ +[ + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 200, + "idLabel": "DEPENDENCY_ID_3" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": false, + "httpCode": 200, + "idLabel": "DEPENDENCY_ID_4" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json b/test/jmeter/data/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..75af002 --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/delete-dependency-with-invalid-tokens.json @@ -0,0 +1,26 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "httpCode": 401, + "message": "No token provided." + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role-phase-dependency/get-dependencies-with-invalid-data.json b/test/jmeter/data/resource-role-phase-dependency/get-dependencies-with-invalid-data.json new file mode 100644 index 0000000..b566912 --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/get-dependencies-with-invalid-data.json @@ -0,0 +1,34 @@ +[ + { + "phaseId": "", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is not allowed to be empty" + }, + { + "phaseId": "not_guid", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" must be a valid GUID" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": 123, + "httpCode": 400, + "message": "\"phaseState\" must be a boolean" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "not a guid", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json b/test/jmeter/data/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/get-dependency-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-data.json b/test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-data.json new file mode 100644 index 0000000..22f8b78 --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-data.json @@ -0,0 +1,59 @@ +[ + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is not allowed to be empty" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "not_guid", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" must be a valid GUID" + }, + { + "required_field_1": "phaseIdNotProvided", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseId\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseStateNotProvided", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 400, + "message": "\"phaseState\" is required" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "not a guid", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "required_field_1": "phaseId", + "required_field_2": "resourceRoleId", + "required_field_3": "phaseState", + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "COPILOT_RESOURCE_ROLE_ID": "", + "phaseState": true, + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json b/test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/update-dependency-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/jmeter/data/resource-role-phase-dependency/update-dependency.json b/test/jmeter/data/resource-role-phase-dependency/update-dependency.json new file mode 100644 index 0000000..6eea897 --- /dev/null +++ b/test/jmeter/data/resource-role-phase-dependency/update-dependency.json @@ -0,0 +1,12 @@ +[ + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": true, + "httpCode": 200 + }, + { + "phaseId": "aa5a3f78-79e0-4bf7-93ff-b11e8f5b398b", + "phaseState": false, + "httpCode": 200 + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role/create-resource-role-by-admin.json b/test/jmeter/data/resource-role/create-resource-role-by-admin.json new file mode 100644 index 0000000..5e3123f --- /dev/null +++ b/test/jmeter/data/resource-role/create-resource-role-by-admin.json @@ -0,0 +1,58 @@ +[ + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-Observer", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-reviewer", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "invalid": "invalid", + "fullReadAccess": true, + "fullWriteAccess": false, + "selfObtainable": false, + "isActive": 5, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-failure-test", + "fullReadAccess": true, + "fullWriteAccess": false, + "selfObtainable": false, + "isActive": 5, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 409 + } +] diff --git a/test/jmeter/data/resource-role/create-resource-role-by-m2m.json b/test/jmeter/data/resource-role/create-resource-role-by-m2m.json new file mode 100644 index 0000000..fcf816e --- /dev/null +++ b/test/jmeter/data/resource-role/create-resource-role-by-m2m.json @@ -0,0 +1,55 @@ +[ + { + "name": "POSTMANE2E-co-pilot-m2m", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-Observer-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-submitter-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-reviewer-m2m", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "invalid": "invalid-m2m", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-failure-test-m2m", + "fullReadAccess": true, + "fullWriteAccess": false, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-submitter-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 409 + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role/create-resource-role-with-invalid-data.json b/test/jmeter/data/resource-role/create-resource-role-with-invalid-data.json new file mode 100644 index 0000000..9a05fba --- /dev/null +++ b/test/jmeter/data/resource-role/create-resource-role-with-invalid-data.json @@ -0,0 +1,79 @@ +[ + { + "name": "", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"name\" is not allowed to be empty" + }, + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainableNotProvided", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"selfObtainable\" is required" + }, + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActiveNotProvided", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" is required" + }, + { + "name": "POSTMANE2E-co-pilot", + "fullReadAccess": "123", + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullReadAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-Observer", + "fullReadAccess": true, + "fullWriteAccess": "123", + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": false, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullWriteAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": "123", + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" must be a boolean" + }, + { + "name": "POSTMANE2E-reviewer", + "fullReadAccess": false, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": "123", + "httpCode": 400, + "message": "\"selfObtainable\" must be a boolean" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role/create-resource-role-with-invalid-tokens.json b/test/jmeter/data/resource-role/create-resource-role-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/jmeter/data/resource-role/create-resource-role-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/jmeter/data/resource-role/get-resource-role-with-invalid-data.json b/test/jmeter/data/resource-role/get-resource-role-with-invalid-data.json new file mode 100644 index 0000000..00181e7 --- /dev/null +++ b/test/jmeter/data/resource-role/get-resource-role-with-invalid-data.json @@ -0,0 +1,79 @@ +[ + { + "name": "", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"name\" is not allowed to be empty" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": "", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"legacyId\" must be a number" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": 123, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"fullReadAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": 123, + "isActive": true, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"fullWriteAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": 123, + "selfObtainable": false, + "invalid": "", + "httpCode": 400, + "message": "\"isActive\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": 123, + "invalid": "", + "httpCode": 400, + "message": "\"selfObtainable\" must be a boolean" + }, + { + "name": "POSTMANE2E-test-copilot", + "legacyId": 1, + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "invalid": "invalid", + "httpCode": 400, + "message": "\"invalid\" is not allowed" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role/update-resource-role-by-admin.json b/test/jmeter/data/resource-role/update-resource-role-by-admin.json new file mode 100644 index 0000000..acab0d5 --- /dev/null +++ b/test/jmeter/data/resource-role/update-resource-role-by-admin.json @@ -0,0 +1,48 @@ +[ + { + "name": "POSTMANE2E-UPDATE_CO-PILOT-admin", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_OBSERVER-admin", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_SUBMITTER-admin", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-admin", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-admin1", + "isActive": true, + "selfObtainable": false, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-SUBMITTER", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 409 + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role/update-resource-role-by-m2m.json b/test/jmeter/data/resource-role/update-resource-role-by-m2m.json new file mode 100644 index 0000000..d251464 --- /dev/null +++ b/test/jmeter/data/resource-role/update-resource-role-by-m2m.json @@ -0,0 +1,48 @@ +[ + { + "name": "POSTMANE2E-UPDATE_CO-PILOT-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_OBSERVER-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": false, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_SUBMITTER-m2m", + "fullReadAccess": true, + "fullWriteAccess": true, + "isActive": true, + "selfObtainable": true, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-m2m", + "fullReadAccess": false, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 200 + }, + { + "name": "POSTMANE2E-UPDATE_REVIEWER-m2m1", + "isActive": true, + "selfObtainable": false, + "httpCode": 400 + }, + { + "name": "POSTMANE2E-SUBMITTER", + "fullReadAccess": true, + "fullWriteAccess": false, + "isActive": true, + "selfObtainable": false, + "httpCode": 409 + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role/update-resource-role-with-invalid-data.json b/test/jmeter/data/resource-role/update-resource-role-with-invalid-data.json new file mode 100644 index 0000000..ab0c78b --- /dev/null +++ b/test/jmeter/data/resource-role/update-resource-role-with-invalid-data.json @@ -0,0 +1,79 @@ +[ + { + "name": "", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"name\" is not allowed to be empty" + }, + { + "name": "POSTMANE2E-update-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainableNotProvided", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"selfObtainable\" is required" + }, + { + "name": "POSTMANE2E-update-co-pilot", + "fullReadAccess": true, + "fullWriteAccess": false, + "required_field_1": "isActiveNotProvided", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" is required" + }, + { + "name": "POSTMANE2E-update-co-pilot", + "fullReadAccess": "123", + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullReadAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-Observer", + "fullReadAccess": true, + "fullWriteAccess": "123", + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": false, + "selfObtainable": false, + "httpCode": 400, + "message": "\"fullWriteAccess\" must be a boolean" + }, + { + "name": "POSTMANE2E-update-submitter", + "fullReadAccess": true, + "fullWriteAccess": true, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": "123", + "selfObtainable": true, + "httpCode": 400, + "message": "\"isActive\" must be a boolean" + }, + { + "name": "POSTMANE2E-update-reviewer", + "fullReadAccess": false, + "fullWriteAccess": false, + "required_field_1": "isActive", + "required_field_2": "selfObtainable", + "isActive": true, + "selfObtainable": "123", + "httpCode": 400, + "message": "\"selfObtainable\" must be a boolean" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource-role/update-resource-role-with-invalid-tokens.json b/test/jmeter/data/resource-role/update-resource-role-with-invalid-tokens.json new file mode 100644 index 0000000..3f9931d --- /dev/null +++ b/test/jmeter/data/resource-role/update-resource-role-with-invalid-tokens.json @@ -0,0 +1,27 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "You are not allowed to perform this action!" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/jmeter/data/resource/create-resource-by-admin.json b/test/jmeter/data/resource/create-resource-by-admin.json new file mode 100644 index 0000000..41ab013 --- /dev/null +++ b/test/jmeter/data/resource/create-resource-by-admin.json @@ -0,0 +1,18 @@ +[ + { + "memberHandle": "HoHoSKY", + "httpCode": 200 + }, + { + "memberHandle": "mess", + "httpCode": 200 + }, + { + "memberHandle": "x", + "httpCode": 200 + }, + { + "memberHandle": "TonyJ", + "httpCode": 200 + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/create-resource-by-m2m.json b/test/jmeter/data/resource/create-resource-by-m2m.json new file mode 100644 index 0000000..6c7dbc3 --- /dev/null +++ b/test/jmeter/data/resource/create-resource-by-m2m.json @@ -0,0 +1,18 @@ +[ + { + "memberHandle": "iamtong", + "httpCode": 200 + }, + { + "memberHandle": "jack", + "httpCode": 200 + }, + { + "memberHandle": "onsky", + "httpCode": 200 + }, + { + "memberHandle": "ghostar", + "httpCode": 200 + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/create-resource-with-invalid-data.json b/test/jmeter/data/resource/create-resource-with-invalid-data.json new file mode 100644 index 0000000..49ec7f7 --- /dev/null +++ b/test/jmeter/data/resource/create-resource-with-invalid-data.json @@ -0,0 +1,104 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "CHALLENGE_ID": "", + "httpCode": 400, + "message": "\"challengeId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId_not_provided", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "httpCode": 400, + "message": "\"challengeId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "CHALLENGE_ID": "123", + "httpCode": 400, + "message": "\"challengeId\" must be a valid GUID" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 404, + "message": "Challenge of id 11111111-ce7d-4521-8501-b8132b1c0391 is not found." + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle_not_provided", + "required_field_3": "roleId", + "memberHandle": "heffan", + "httpCode": 400, + "message": "\"memberHandle\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "some_not_exist_handle", + "httpCode": 400, + "message": "User with handle: some_not_exist_handle doesn't exist" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "COPILOT_RESOURCE_ROLE_ID": "", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId_not_provided", + "memberHandle": "heffan", + "httpCode": 400, + "message": "\"roleId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "COPILOT_RESOURCE_ROLE_ID": "123", + "httpCode": 400, + "message": "\"roleId\" must be a valid GUID" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "heffan", + "COPILOT_RESOURCE_ROLE_ID": "11111111-ce7d-4521-8501-b8132b1c0771", + "httpCode": 400, + "message": "No resource role found with id: 11111111-ce7d-4521-8501-b8132b1c0771." + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "ghostar", + "httpCode": 409, + "message": "User ghostar already has resource with roleId:" + } +] diff --git a/test/jmeter/data/resource/create-resource-with-invalid-tokens.json b/test/jmeter/data/resource/create-resource-with-invalid-tokens.json new file mode 100644 index 0000000..0628a63 --- /dev/null +++ b/test/jmeter/data/resource/create-resource-with-invalid-tokens.json @@ -0,0 +1,22 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "jwtToken": "Bearer {{user_token}}", + "httpCode": 403, + "message": "Only M2M, admin or user with full access role can perform this action" + }, + { + "jwtToken": "", + "httpCode": 401, + "message": "No token provided." + } +] diff --git a/test/jmeter/data/resource/delete-resource-with-invalid-parameter.json b/test/jmeter/data/resource/delete-resource-with-invalid-parameter.json new file mode 100644 index 0000000..dd92fce --- /dev/null +++ b/test/jmeter/data/resource/delete-resource-with-invalid-parameter.json @@ -0,0 +1,70 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 404, + "message": "Challenge of id 11111111-ce7d-4521-8501-b8132b1c0391 is not found." + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "COPILOT_RESOURCE_ROLE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "httpCode": 400, + "message": "No resource role found with id: 11111111-ce7d-4521-8501-b8132b1c0391." + }, + { + "required_field_1": "challengeId_not_provided", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"challengeId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle_not_provided", + "required_field_3": "roleId", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"memberHandle\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId_not_provided", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"roleId\" is required" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "CHALLENGE_ID": "", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"challengeId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "memberHandle": "", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberHandle", + "required_field_3": "roleId", + "COPILOT_RESOURCE_ROLE_ID": "", + "memberHandle": "mess", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + } +] diff --git a/test/jmeter/data/resource/delete-resource-with-invalid-tokens.json b/test/jmeter/data/resource/delete-resource-with-invalid-tokens.json new file mode 100644 index 0000000..32f548a --- /dev/null +++ b/test/jmeter/data/resource/delete-resource-with-invalid-tokens.json @@ -0,0 +1,14 @@ +[ + { + "jwtToken": "Bearer invalid", + "httpCode": 401 + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "httpCode": 401 + }, + { + "jwtToken": "", + "httpCode": 401 + } +] diff --git a/test/jmeter/data/resource/get-resources-by-member-with-different-users.json b/test/jmeter/data/resource/get-resources-by-member-with-different-users.json new file mode 100644 index 0000000..a00e295 --- /dev/null +++ b/test/jmeter/data/resource/get-resources-by-member-with-different-users.json @@ -0,0 +1,18 @@ +[ + { + "jwtToken": "Bearer {{user_token}}", + "memberId": "16096823" + }, + { + "jwtToken": "Bearer {{copilot_token}}", + "memberId": "16096823" + }, + { + "jwtToken": "Bearer {{admin_token}}", + "memberId": "16096823" + }, + { + "jwtToken": "Bearer {{M2M_TOKEN}}", + "memberId": "not_exist_user" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/get-resources-by-member-with-invalid-parameter.json b/test/jmeter/data/resource/get-resources-by-member-with-invalid-parameter.json new file mode 100644 index 0000000..9e4420d --- /dev/null +++ b/test/jmeter/data/resource/get-resources-by-member-with-invalid-parameter.json @@ -0,0 +1,19 @@ +[ + { + "COPILOT_RESOURCE_ROLE_ID": "", + "invalid": "", + "httpCode": 400, + "message": "\"resourceRoleId\" is not allowed to be empty" + }, + { + "COPILOT_RESOURCE_ROLE_ID": "11111", + "invalid": "", + "httpCode": 400, + "message": "\"resourceRoleId\" must be a valid GUID" + }, + { + "invalid": "invalid", + "httpCode": 400, + "message": "\"invalid\" is not allowed" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/get-resources-by-member-with-invalid-tokens.json b/test/jmeter/data/resource/get-resources-by-member-with-invalid-tokens.json new file mode 100644 index 0000000..d584dde --- /dev/null +++ b/test/jmeter/data/resource/get-resources-by-member-with-invalid-tokens.json @@ -0,0 +1,19 @@ +[ + { + "jwtToken": "Bearer invalid", + "memberId": "16096823", + "httpCode": 401, + "message": "Invalid Token." + }, + { + "jwtToken": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU1MTA2MzIxMSwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1MTA1MzIxMSwiZW1haWwiOiJ0amVmdHMrZml4QHRvcGNvZGVyLmNvbSIsImp0aSI6ImY5NGQxZTI2LTNkMGUtNDZjYS04MTE1LTg3NTQ1NDRhMDhmMSJ9.97-pjuSGGqDAqK2FG2yi_3nmzB7ZMXQwtG0bi8_PlKk", + "memberId": "16096823", + "httpCode": 401, + "message": "Failed to authenticate token." + }, + { + "memberId": "16096823", + "httpCode": 401, + "message": "No token provided." + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/get-resources-by-member-with-resource-role.json b/test/jmeter/data/resource/get-resources-by-member-with-resource-role.json new file mode 100644 index 0000000..cbc555d --- /dev/null +++ b/test/jmeter/data/resource/get-resources-by-member-with-resource-role.json @@ -0,0 +1,14 @@ +[ + { + "memberId": "16096823" + }, + { + "memberId": "16096823" + }, + { + "memberId": "16096823" + }, + { + "memberId": "not_exist_user" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/get-resources-with-all-parameters.json b/test/jmeter/data/resource/get-resources-with-all-parameters.json new file mode 100644 index 0000000..1c11ebe --- /dev/null +++ b/test/jmeter/data/resource/get-resources-with-all-parameters.json @@ -0,0 +1,26 @@ +[ + { + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc" + }, + { + "page": 2, + "perPage": 4, + "memberId": 105878, + "memberHandle": "x", + "sortBy": "memberHandle", + "sortOrder": "desc" + }, + { + "page": 1, + "perPage": 10, + "memberId": 111036, + "memberHandle": "jack", + "sortBy": "memberHandle", + "sortOrder": "asc" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/get-resources-with-invalid-data.json b/test/jmeter/data/resource/get-resources-with-invalid-data.json new file mode 100644 index 0000000..cf78f51 --- /dev/null +++ b/test/jmeter/data/resource/get-resources-with-invalid-data.json @@ -0,0 +1,242 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"challengeId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId_not_provided", + "required_field_2": "memberId_not_provided", + "required_field_3": "memberHandle_not_provided", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "At least one of the following parameters is required: [challengeId, memberId, memberHandle]" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": -1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"page\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 0, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"page\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": "", + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"page\" must be a number" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": -1, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"perPage\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 0, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "invalid": "", + "httpCode": 400, + "message": "\"perPage\" must be larger than or equal to 1" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": "", + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"perPage\" must be a number" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": "", + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"memberId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"memberHandle\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"sortBy\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberId", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"sortBy\" must be one of [memberHandle, created]" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "", + "httpCode": 400, + "message": "\"sortOrder\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "invalid", + "httpCode": 400, + "message": "\"sortOrder\" must be one of [desc, asc]" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "123", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"challengeId\" must be a valid GUID" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "CHALLENGE_ID": "11111111-ce7d-4521-8501-b8132b1c0391", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 404, + "message": "Challenge ID 11111111-ce7d-4521-8501-b8132b1c0391 not found" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "COPILOT_RESOURCE_ROLE_ID": "", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"roleId\" is not allowed to be empty" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "COPILOT_RESOURCE_ROLE_ID": "123", + "page": 1, + "perPage": 10, + "memberId": 305384, + "memberHandle": "mess", + "sortBy": "memberHandle", + "sortOrder": "desc", + "httpCode": 400, + "message": "\"roleId\" must be a valid GUID" + } +] \ No newline at end of file diff --git a/test/jmeter/data/resource/get-resources-with-required-parameter.json b/test/jmeter/data/resource/get-resources-with-required-parameter.json new file mode 100644 index 0000000..7403d8a --- /dev/null +++ b/test/jmeter/data/resource/get-resources-with-required-parameter.json @@ -0,0 +1,30 @@ +[ + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle", + "memberId": 305384, + "memberHandle": "mess" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId_only_challengeId_provided", + "required_field_3": "memberHandle_only_challengeId_provided", + "memberId": 305384, + "memberHandle": "mess" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId", + "required_field_3": "memberHandle_is_not_provided", + "memberId": 305384, + "memberHandle": "mess" + }, + { + "required_field_1": "challengeId", + "required_field_2": "memberId_is_not_provided", + "required_field_3": "memberHandle", + "memberId": 305384, + "memberHandle": "mess" + } +] \ No newline at end of file diff --git a/test/jmeter/data/token-data.json b/test/jmeter/data/token-data.json new file mode 100644 index 0000000..e0c40b6 --- /dev/null +++ b/test/jmeter/data/token-data.json @@ -0,0 +1,9 @@ +[ +{ + "expire_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRvcGNvZGVyY29ubmVjdCtNYW5hZ2VyQGdtYWlsLmNvbSIsIm5hbWUiOiJ0b3Bjb2RlcmNvbm5lY3QrTWFuYWdlckBnbWFpbC5jb20iLCJuaWNrbmFtZSI6IlRDQ29uTWFuYWdlciIsInBpY3R1cmUiOiJodHRwczovL3MuZ3JhdmF0YXIuY29tL2F2YXRhci9iNDU5OWMyNzFiZmE3NDhjNDNkOWU2NGM3ZTJmNDU4Nz9zPTQ4MCZyPXBnJmQ9aHR0cHMlM0ElMkYlMkZjZG4uYXV0aDAuY29tJTJGYXZhdGFycyUyRnRvLnBuZyIsInJvbGVzIjpbIlRvcGNvZGVyIFVzZXIiLCJDb25uZWN0IE1hbmFnZXIiXSwiYXBwX21ldGFkYXRhIjp7ImF1dGhvcml6YXRpb24iOnsiZ3JvdXBzIjpbXX19LCJhdXRob3JpemF0aW9uIjp7Imdyb3VwcyI6W119LCJncm91cHMiOltdLCJjbGllbnRJRCI6IkpGRG83SE1rZjBxMkNrVkZIb2p5M3pIV2FmemlwcmhUIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMjZUMTE6MzQ6NTQuNzg3WiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpZGVudGl0aWVzIjpbeyJ1c2VyX2lkIjoiNDAxNTg5OTciLCJwcm92aWRlciI6ImF1dGgwIiwiY29ubmVjdGlvbiI6IlRDLVVzZXItRGF0YWJhc2UiLCJpc1NvY2lhbCI6ZmFsc2V9XSwidXBkYXRlZF9hdCI6IjIwMjEtMDYtMTRUMTA6MTU6MzMuODMxWiIsInVzZXJfaWQiOiJhdXRoMHw0MDE1ODk5NyIsInVzZXJfbWV0YWRhdGEiOnt9LCJpc3MiOiJodHRwczovL3RvcGNvZGVyLWRldi5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NDAxNTg5OTciLCJhdWQiOiJKRkRvN0hNa2YwcTJDa1ZGSG9qeTN6SFdhZnppcHJoVCIsImlhdCI6MTYyMzY2NTczNSwiZXhwIjoxOTgzNjY1NzM1fQ.awdiyOcqPysf7VJ8FfqMT_a_wOSloDk_TB1fsOYeB40", + "invalid_token": "B40bGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRvcGNvZGVyY29ubmVjdCtNYW5hZ2VyQGdtYWlsLmNvbSIsIm5hbWUiOiJ0b3Bjb2RlcmNvbm5lY3QrTWFuYWdlckBnbWFpbC5jb20iLCJuaWNrbmFtZSI6IlRDQ29uTWFuYWdlciIsInBpY3R1cmUiOiJodHRwcZmFsc2V9XSwidXBkYXRlZF9hdCI6IjIwMjEtMDYtMTRUMTA6MTU6MzMuODMxWiIsInVzZXJfaWQiOiJhdXRoMHw0MDE1ODk5NyIsInVzZXJfbWV0YWRhdGEiOnt9LCJpc3MiOiJodHRwczovL3RvcGNvZGVyLWRldi5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NDAxNTg5OTciLCJhdWQiOiJKRkRvN0hNa2Yw", + "invalid_m2m_token": "hbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.NTQuNzg3WiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpZGVudGl0aWVzIjpbeyJ1c2VyX2lkIjoiNDAxNTg5OTciLCJwcm92aWRlciI6ImF1dGgwIiwiY29ubmVjdGlvbiI6IlRDLVVzZXItRGF0YWJhc2UiLCJpc1NvY2lhbCI6ZmFsc2V9XSwidXBkYXRlZF9hdCI6IjIwMjEtMDYtMTRUMTA6MTU6MzMuODMxWiIsInVzZXJfaWQiOiJhdXRoMHw0MDE1ODk5NyIsInVzZXJfbWV0YWRhdGEiOnt9LCJpc3MiOiJodHRwczovL3RvcGNvZGVyLWRldi5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NDAxNTg5OTciLCJhdWQiOiJKRkRvN0hNa2Yw", + "expire_m2m_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik5VSkZORGd4UlRVME5EWTBOVVkzTlRkR05qTXlRamxETmpOQk5UYzVRVUV3UlRFeU56TTJRUSJ9.eyJpc3MiOiJodHRwczovL3RvcGNvZGVyLWRldi5hdXRoMC5jb20vIiwic3ViIjoiS0l4b0hrVXRCeFozUWRiQ2NEaVhmWVM4eGhxaTBEQnFAY2xpZW50cyIsImF1ZCI6Imh0dHBzOi8vbTJtLnRvcGNvZGVyLWRldi5jb20vIiwiaWF0IjoxNjI0MTAwNjg4LCJleHAiOjE2MjQxODcwODgsImF6cCI6IktJeG9Ia1V0QnhaM1FkYkNjRGlYZllTOHhocWkwREJxIiwic2NvcGUiOiJkZWxldGU6cmVzb3VyY2VzIHVwZGF0ZTpyZXNvdXJjZXMgY3JlYXRlOnJlc291cmNlcyIsImd0eSI6ImNsaWVudC1jcmVkZW50aWFscyJ9.mIifZ-rwWmv1YtEKI6dSvFhAvOa5Sz1EqhLzbSzOA8crkBFMIOgTpCYJteW-NGNMiidy9oa4XmUB9crvxqeLAbDN4FNA0i7JUeM0BOlDMphxru6wo5MRJY_p1fR8VOs5b8oeavZbgpyt4zaE4VA6DL8nlw7YmrRYrCc3d5HXLQ-YQgQVsN1jGB6bncKHq7VzaIkUJOPdjFFAyluDU-x9QW4HmbYjP0VJVLQm86kzJ0E8ZogZ40Vo_xKVEHEJ0CrUeM5mMUqmJA8EXKFf_kAy3q2-_sABo67mvDmeuQco4S47YTls4vNTV7NYA5Mf20guwmo0VMPWtOFQlq8QX02vaQ" +} + +] \ No newline at end of file