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