@forge/util 1.2.3-next.0 → 1.2.4-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/package.json +8 -3
- package/packages/analytics-node-client/CHANGELOG.md +8 -0
- package/packages/analytics-node-client/README.md +1 -0
- package/packages/analytics-node-client/package.json +1 -1
- package/packages/analytics-node-client/src/index.js +1 -1
- package/packages/cs-ari/CHANGELOG.md +8 -0
- package/packages/cs-ari/dist/AppAriImpls.d.ts +1 -0
- package/packages/cs-ari/dist/AppAriImpls.js +97 -114
- package/packages/cs-ari/dist/AppAriImpls.js.map +1 -1
- package/packages/cs-ari/dist/AppAris.js +16 -38
- package/packages/cs-ari/dist/AppAris.js.map +1 -1
- package/packages/cs-ari/dist/Constraints.js +32 -43
- package/packages/cs-ari/dist/Constraints.js.map +1 -1
- package/packages/cs-ari/dist/Index.js +69 -86
- package/packages/cs-ari/dist/Index.js.map +1 -1
- package/packages/cs-ari/package.json +9 -4
- package/packages/cs-ari/xunit.xml +42 -32
- package/packages/cs-ari/yarn.lock +27 -67
- package/scripts/replace-packages.js +4 -5
|
@@ -1,40 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
extendStatics(d, b);
|
|
11
|
-
function __() { this.constructor = d; }
|
|
12
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
function __export(m) {
|
|
16
|
-
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
|
17
|
-
}
|
|
18
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
|
|
20
|
-
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const Constraints_1 = require("./Constraints");
|
|
5
|
+
tslib_1.__exportStar(require("./AppAris"), exports);
|
|
21
6
|
/**
|
|
22
7
|
* InvalidAriError - an error thrown if an invalid Ari is constructed
|
|
23
8
|
*/
|
|
24
|
-
|
|
25
|
-
__extends(InvalidAriError, _super);
|
|
9
|
+
class InvalidAriError extends Error {
|
|
26
10
|
/**
|
|
27
11
|
* Construct an InvalidAriError given an error message
|
|
28
12
|
*
|
|
29
13
|
* @param {string} ariString - the ARI that failed to parse
|
|
30
14
|
* @param {string|undefined} description - The error message
|
|
31
15
|
*/
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
16
|
+
constructor(ariString, description) {
|
|
17
|
+
super(`Invalid ari string: ${ariString}${description ? '. ' + description : ''}`);
|
|
18
|
+
this.ariString = ariString;
|
|
35
19
|
// Support correct inheritance in ES5
|
|
36
|
-
Object.setPrototypeOf(
|
|
37
|
-
return _this;
|
|
20
|
+
Object.setPrototypeOf(this, InvalidAriError.prototype);
|
|
38
21
|
}
|
|
39
22
|
/**
|
|
40
23
|
* Construct an InvalidAriError given some constraint violations
|
|
@@ -42,11 +25,10 @@ var InvalidAriError = /** @class */ (function (_super) {
|
|
|
42
25
|
* @param {string} ariString - the ARI that failed to parse
|
|
43
26
|
* @param {ConstraintViolation<Object>[]} violations - The array of constraint errors
|
|
44
27
|
*/
|
|
45
|
-
|
|
46
|
-
return new InvalidAriError(ariString, violations.map(
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
}(Error));
|
|
28
|
+
static withConstraintViolations(ariString, violations) {
|
|
29
|
+
return new InvalidAriError(ariString, violations.map((v) => v.toString()).join('\n'));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
50
32
|
exports.InvalidAriError = InvalidAriError;
|
|
51
33
|
function matchesSegment(value1, value2) {
|
|
52
34
|
if (value1 === value2) {
|
|
@@ -58,23 +40,29 @@ function matchesSegment(value1, value2) {
|
|
|
58
40
|
return false;
|
|
59
41
|
}
|
|
60
42
|
// constraints are based on draft of v2 spec https://hello.atlassian.net/wiki/spaces/ARCH/pages/161909310/Atlassian+Resource+Identifier+Spec+draft-2.0#AtlassianResourceIdentifierSpec(draft-2.0)-Syntax
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
43
|
+
const basicCharConstraint = Constraints_1.pattern(/^[a-z][a-z.-]*$/);
|
|
44
|
+
/**
|
|
45
|
+
* resourceType allows for capitalized letters to support Identity ARIs (`ari:cloud:identity::userGrant/<...>`)
|
|
46
|
+
* It's a violation of the spec, but we still need to support that.
|
|
47
|
+
* See https://hello.atlassian.net/wiki/spaces/ARCH/pages/161909310/Atlassian+Resource+Identifier+Spec+draft-2.0
|
|
48
|
+
*/
|
|
49
|
+
const resourceTypeCharConstraints = Constraints_1.pattern(/^[a-z][a-z.-]*$/i);
|
|
50
|
+
const resourceOwnerConstraints = [Constraints_1.lengthBetween(3, 255), basicCharConstraint];
|
|
51
|
+
const resourceTypeConstraints = [Constraints_1.lengthBetween(3, 255), resourceTypeCharConstraints];
|
|
52
|
+
const cloudIdConstraints = [Constraints_1.lengthBetween(3, 255)];
|
|
53
|
+
const siteResourceType = 'site';
|
|
54
|
+
const resourceIdChars = /[\w-._~:@#]/.source;
|
|
55
|
+
const resourceIdConstraints = [Constraints_1.pattern(new RegExp(`^${resourceIdChars}+(/${resourceIdChars}*)*(;v=${resourceIdChars}*)*$`))];
|
|
68
56
|
/**
|
|
69
57
|
* Returns an Ari that is of the latest version of the Ari spec that we support. Any legacy formats
|
|
70
58
|
* (like those for site wide ARIs) are upgraded to their latest form.
|
|
71
59
|
*/
|
|
72
60
|
function upgrade(values) {
|
|
73
|
-
|
|
61
|
+
const { resourceId, resourceOwner, cloudId } = values;
|
|
74
62
|
// note: The new ARI spec has not defined a format for system wide contexts so we exclude them from upgrade
|
|
75
63
|
if (!resourceId && cloudId) {
|
|
76
64
|
return {
|
|
77
|
-
resourceOwner
|
|
65
|
+
resourceOwner,
|
|
78
66
|
resourceType: siteResourceType,
|
|
79
67
|
resourceId: cloudId,
|
|
80
68
|
};
|
|
@@ -83,7 +71,13 @@ function upgrade(values) {
|
|
|
83
71
|
return values;
|
|
84
72
|
}
|
|
85
73
|
}
|
|
86
|
-
|
|
74
|
+
class ResourceIdentifier {
|
|
75
|
+
get cloudId() {
|
|
76
|
+
if (this.resourceType === siteResourceType) {
|
|
77
|
+
return this.internalCloudId ? this.internalCloudId : this.resourceId;
|
|
78
|
+
}
|
|
79
|
+
return this.internalCloudId;
|
|
80
|
+
}
|
|
87
81
|
/**
|
|
88
82
|
* Create a new Ari
|
|
89
83
|
*
|
|
@@ -97,24 +91,14 @@ var ResourceIdentifier = /** @class */ (function () {
|
|
|
97
91
|
*
|
|
98
92
|
* @throws {InvalidAriError} if the provided segments fail to pass validation
|
|
99
93
|
*/
|
|
100
|
-
|
|
101
|
-
|
|
94
|
+
constructor(values) {
|
|
95
|
+
const { resourceId, resourceOwner, resourceType, cloudId } = upgrade(values);
|
|
102
96
|
this.resourceOwner = resourceOwner;
|
|
103
97
|
this.internalCloudId = cloudId;
|
|
104
98
|
this.resourceType = resourceType;
|
|
105
99
|
this.resourceId = resourceId;
|
|
106
100
|
this.validate();
|
|
107
101
|
}
|
|
108
|
-
Object.defineProperty(ResourceIdentifier.prototype, "cloudId", {
|
|
109
|
-
get: function () {
|
|
110
|
-
if (this.resourceType === siteResourceType) {
|
|
111
|
-
return this.internalCloudId ? this.internalCloudId : this.resourceId;
|
|
112
|
-
}
|
|
113
|
-
return this.internalCloudId;
|
|
114
|
-
},
|
|
115
|
-
enumerable: true,
|
|
116
|
-
configurable: true
|
|
117
|
-
});
|
|
118
102
|
/**
|
|
119
103
|
* Parse a string as an Ari
|
|
120
104
|
*
|
|
@@ -122,16 +106,16 @@ var ResourceIdentifier = /** @class */ (function () {
|
|
|
122
106
|
* @returns {Ari} the parsed ari
|
|
123
107
|
* @throws {InvalidAriError} if the string could not be correctly parsed as an Ari.
|
|
124
108
|
*/
|
|
125
|
-
|
|
109
|
+
static parse(ariString) {
|
|
126
110
|
if (!ariString) {
|
|
127
111
|
throw new InvalidAriError(ariString);
|
|
128
112
|
}
|
|
129
|
-
|
|
113
|
+
const match = ariString.match(/^ari:cloud:([^:/]+):([^:/]*):([^:/]*)\/(.*)$/);
|
|
130
114
|
if (!match || (match.length !== 5)) {
|
|
131
115
|
throw new InvalidAriError(ariString);
|
|
132
116
|
}
|
|
133
|
-
|
|
134
|
-
|
|
117
|
+
const terms = match.map((a) => a && a.length > 0 ? a : undefined);
|
|
118
|
+
const resourceOwner = terms[1];
|
|
135
119
|
if (!resourceOwner) {
|
|
136
120
|
throw new InvalidAriError(ariString);
|
|
137
121
|
}
|
|
@@ -141,41 +125,41 @@ var ResourceIdentifier = /** @class */ (function () {
|
|
|
141
125
|
resourceType: terms[3],
|
|
142
126
|
resourceId: terms[4]
|
|
143
127
|
});
|
|
144
|
-
}
|
|
145
|
-
|
|
128
|
+
}
|
|
129
|
+
static parseEncoded(encodedAriString) {
|
|
146
130
|
return parse(decodeURIComponent(encodedAriString));
|
|
147
|
-
}
|
|
131
|
+
}
|
|
148
132
|
/**
|
|
149
133
|
* Converts this Ari to a string.
|
|
150
134
|
*/
|
|
151
|
-
|
|
135
|
+
toString() {
|
|
152
136
|
if (!this.ariString) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
this.ariString =
|
|
137
|
+
const resourceId = this.resourceType === siteResourceType && this.internalCloudId ? this.internalCloudId : (this.resourceId || '');
|
|
138
|
+
const resourceType = this.resourceType || '';
|
|
139
|
+
const sanitizedCloudId = this.resourceType === siteResourceType ? '' : this.internalCloudId || '';
|
|
140
|
+
this.ariString = `ari:cloud:${this.resourceOwner}:${sanitizedCloudId}:${resourceType}/${resourceId}`;
|
|
157
141
|
}
|
|
158
142
|
return this.ariString;
|
|
159
|
-
}
|
|
143
|
+
}
|
|
160
144
|
/**
|
|
161
145
|
* Converts this object to its json representation
|
|
162
146
|
*/
|
|
163
|
-
|
|
147
|
+
toJSON() {
|
|
164
148
|
return this.toString();
|
|
165
|
-
}
|
|
149
|
+
}
|
|
166
150
|
/**
|
|
167
151
|
* Checks if this context is the same as another context
|
|
168
152
|
*
|
|
169
153
|
* @param {Ari} other - the other parameter to match with
|
|
170
154
|
* @returns {boolean} - true if all segments of both Aris are equal, false otherwise
|
|
171
155
|
*/
|
|
172
|
-
|
|
156
|
+
equals(other) {
|
|
173
157
|
return other instanceof ResourceIdentifier
|
|
174
158
|
&& this.resourceOwner === other.resourceOwner
|
|
175
159
|
&& this.cloudId === other.cloudId
|
|
176
160
|
&& this.resourceType === other.resourceType
|
|
177
161
|
&& this.resourceId === other.resourceId;
|
|
178
|
-
}
|
|
162
|
+
}
|
|
179
163
|
/**
|
|
180
164
|
* This method checks if the current context contains the other context.
|
|
181
165
|
*
|
|
@@ -185,9 +169,9 @@ var ResourceIdentifier = /** @class */ (function () {
|
|
|
185
169
|
* @param {Ari} other
|
|
186
170
|
* @returns {boolean}
|
|
187
171
|
*/
|
|
188
|
-
|
|
172
|
+
contains(other) {
|
|
189
173
|
return this.matches(new ResourceIdentifier(other));
|
|
190
|
-
}
|
|
174
|
+
}
|
|
191
175
|
/**
|
|
192
176
|
* Checks if this context is the same as or contains the provided context.
|
|
193
177
|
*
|
|
@@ -202,42 +186,41 @@ var ResourceIdentifier = /** @class */ (function () {
|
|
|
202
186
|
* @param {Ari} other - the other parameter to match with
|
|
203
187
|
* @returns {boolean} true if this Ari is the same as the other Ari, or matches the other Ari. False otherwise.
|
|
204
188
|
*/
|
|
205
|
-
|
|
189
|
+
matches(other) {
|
|
206
190
|
return matchesSegment(this.resourceOwner, other.resourceOwner)
|
|
207
191
|
&& matchesSegment(this.cloudId, other.cloudId)
|
|
208
192
|
&& ((this.resourceType === siteResourceType && !!other.resourceType) || matchesSegment(this.resourceType, other.resourceType))
|
|
209
193
|
&& ((this.resourceType === siteResourceType && !!other.resourceType) || matchesSegment(this.resourceId, other.resourceId));
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
|
|
194
|
+
}
|
|
195
|
+
validateSiteWide() {
|
|
196
|
+
const { resourceType, cloudId } = this;
|
|
213
197
|
if (resourceType === siteResourceType && !cloudId) {
|
|
214
198
|
return new Constraints_1.GeneralValidationError('site wide ARIs must have a cloudId');
|
|
215
199
|
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
|
|
200
|
+
}
|
|
201
|
+
validate() {
|
|
202
|
+
const constraintViolations = [
|
|
219
203
|
Constraints_1.validateField(this, 'resourceOwner', resourceOwnerConstraints),
|
|
220
204
|
Constraints_1.validateField(this, 'resourceType', resourceTypeConstraints),
|
|
221
205
|
Constraints_1.validateField(this, 'resourceId', resourceIdConstraints),
|
|
222
206
|
Constraints_1.validateField(this, 'cloudId', cloudIdConstraints),
|
|
223
207
|
this.validateSiteWide()
|
|
224
208
|
]
|
|
225
|
-
.filter(
|
|
209
|
+
.filter((v) => v);
|
|
226
210
|
if (constraintViolations.length > 0) {
|
|
227
211
|
throw InvalidAriError.withConstraintViolations(this.toString(), constraintViolations);
|
|
228
212
|
}
|
|
229
213
|
if (this.resourceId !== undefined && this.resourceType === undefined) {
|
|
230
214
|
throw new InvalidAriError(this.toString(), 'The resource type must be specified if the resource id is defined.');
|
|
231
215
|
}
|
|
232
|
-
}
|
|
233
|
-
|
|
216
|
+
}
|
|
217
|
+
urlEncode() {
|
|
234
218
|
return encodeURIComponent(this.toString());
|
|
235
|
-
}
|
|
236
|
-
|
|
219
|
+
}
|
|
220
|
+
urlDecode() {
|
|
237
221
|
return decodeURIComponent(this.toString());
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
}());
|
|
222
|
+
}
|
|
223
|
+
}
|
|
241
224
|
exports.ResourceIdentifier = ResourceIdentifier;
|
|
242
225
|
/**
|
|
243
226
|
* Parse a string as an Ari
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../lib/Index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../lib/Index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cs-ari",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.1",
|
|
4
|
+
"license": "ISC",
|
|
4
5
|
"description": "An implementation of the Atlassian Resource Identifier (ARI) scheme for Connect as a Service (CaaS)",
|
|
5
6
|
"publishConfig": {
|
|
6
7
|
"registry": "https://packages.atlassian.com"
|
|
@@ -14,9 +15,12 @@
|
|
|
14
15
|
"test": "mocha --reporter mocha-multi --reporter-options spec=-,xunit=xunit.xml --require ts-node/register `find ./lib -name '*.spec.ts' -print`",
|
|
15
16
|
"lint": "tslint -c ../../tslint.json --project tsconfig.json --project",
|
|
16
17
|
"format": "tsfmt -r && tslint -c ../../tslint.json --project tsconfig.json --fix --force",
|
|
17
|
-
"bamboo": "npm install -g yarn@0.18.0 && yarn && yarn test"
|
|
18
|
+
"bamboo": "npm install -g yarn@0.18.0 && yarn && yarn test",
|
|
19
|
+
"yarn-deduplicate": "yarn-deduplicate"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"ts-is-present": "^1.1.1"
|
|
18
23
|
},
|
|
19
|
-
"dependencies": {},
|
|
20
24
|
"devDependencies": {
|
|
21
25
|
"@types/chai": "^4.1.7",
|
|
22
26
|
"@types/mocha": "^5.2.7",
|
|
@@ -29,7 +33,8 @@
|
|
|
29
33
|
"ts-node": "^8.2.0",
|
|
30
34
|
"tslint": "^5.17.0",
|
|
31
35
|
"typescript": "^3.5.1",
|
|
32
|
-
"typescript-formatter": "7.2.2"
|
|
36
|
+
"typescript-formatter": "7.2.2",
|
|
37
|
+
"yarn-deduplicate": "^1.1.1"
|
|
33
38
|
},
|
|
34
39
|
"typings": "./dist/Index.d.ts"
|
|
35
40
|
}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
<testsuite name="Mocha Tests" tests="
|
|
1
|
+
<testsuite name="Mocha Tests" tests="107" failures="0" errors="0" skipped="0" timestamp="Fri, 28 Aug 2020 02:29:05 GMT" time="0.05">
|
|
2
2
|
<testcase classname="Ari toString" name="should correctly serialise ari when all fields are present" time="0.001"/>
|
|
3
3
|
<testcase classname="Ari toString" name="should correctly serialise ari when cloudId is omitted" time="0"/>
|
|
4
4
|
<testcase classname="Ari toString" name="should correctly serialise ari when a system wide user context provided" time="0"/>
|
|
5
5
|
<testcase classname="Ari toString" name="should correctly serialise ari when resourceId is omitted" time="0"/>
|
|
6
6
|
<testcase classname="Ari toString" name="should correctly serialise ari when resourceId and resourceType are omitted" time="0"/>
|
|
7
|
-
<testcase classname="Ari toString" name="should correctly serialise ari when resourceOwner contains a full stop" time="0
|
|
7
|
+
<testcase classname="Ari toString" name="should correctly serialise ari when resourceOwner contains a full stop" time="0"/>
|
|
8
8
|
<testcase classname="Ari toString" name="should correctly serialise ari when resourceOwner contains a dash" time="0"/>
|
|
9
9
|
<testcase classname="Ari toString" name="should correctly serialise ari when a global system context provided" time="0"/>
|
|
10
10
|
<testcase classname="Ari toString" name="should correctly serialise ari when cloudId and resourceId are both UUIDs" time="0"/>
|
|
11
11
|
<testcase classname="Ari toString" name="should correctly serialise ari when application wide system context provided" time="0"/>
|
|
12
12
|
<testcase classname="Ari toString" name="should correctly serialise ari when site wide context" time="0"/>
|
|
13
13
|
<testcase classname="Ari toString" name="should correctly serialise ari when ARI has colon in resource id" time="0"/>
|
|
14
|
+
<testcase classname="Ari toString" name="should correctly serialise ari when ARI has hash in resource id" time="0"/>
|
|
14
15
|
<testcase classname="Ari toString" name="should correctly serialise ari when ARI has path characters in resource id" time="0"/>
|
|
15
|
-
<testcase classname="Ari
|
|
16
|
+
<testcase classname="Ari toString" name="should correctly serialise ari when resourceType is capitalized" time="0"/>
|
|
17
|
+
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when all fields are present" time="0"/>
|
|
16
18
|
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when cloudId is omitted" time="0"/>
|
|
17
19
|
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when a system wide user context provided" time="0"/>
|
|
18
20
|
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when resourceId is omitted" time="0"/>
|
|
@@ -24,26 +26,28 @@
|
|
|
24
26
|
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when application wide system context provided" time="0"/>
|
|
25
27
|
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when site wide context" time="0"/>
|
|
26
28
|
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when ARI has colon in resource id" time="0"/>
|
|
29
|
+
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when ARI has hash in resource id" time="0"/>
|
|
27
30
|
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when ARI has path characters in resource id" time="0"/>
|
|
28
|
-
<testcase classname="Ari
|
|
31
|
+
<testcase classname="Ari JSON.stringify" name="should correctly serialise ari when resourceType is capitalized" time="0"/>
|
|
32
|
+
<testcase classname="Ari parse" name="should throw InvalidAriError when ariString is invalid" time="0.001"/>
|
|
29
33
|
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceOwner is null" time="0"/>
|
|
30
|
-
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceOwner too short" time="0"/>
|
|
34
|
+
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceOwner too short" time="0.001"/>
|
|
31
35
|
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceOwner starts with a -" time="0"/>
|
|
32
36
|
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceOwner starts with a ." time="0.001"/>
|
|
33
|
-
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceType starts with a -" time="0
|
|
34
|
-
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceType starts with a ." time="0"/>
|
|
37
|
+
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceType starts with a -" time="0"/>
|
|
38
|
+
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceType starts with a ." time="0.001"/>
|
|
35
39
|
<testcase classname="Ari parse" name="should throw InvalidAriError when cloudId too short" time="0"/>
|
|
36
|
-
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceId contains a %" time="0
|
|
37
|
-
<testcase classname="Ari parse" name="should throw InvalidAriError when both resourceOwner and cloudId too short" time="0
|
|
38
|
-
<testcase classname="Ari parse" name="should throw InvalidAriError when a resource id is provided but the cloud id or resource type is not specified" time="0
|
|
40
|
+
<testcase classname="Ari parse" name="should throw InvalidAriError when resourceId contains a %" time="0"/>
|
|
41
|
+
<testcase classname="Ari parse" name="should throw InvalidAriError when both resourceOwner and cloudId too short" time="0"/>
|
|
42
|
+
<testcase classname="Ari parse" name="should throw InvalidAriError when a resource id is provided but the cloud id or resource type is not specified" time="0"/>
|
|
39
43
|
<testcase classname="Ari parse" name="should throw InvalidAriError when a site wide resourceType without a cloudId" time="0"/>
|
|
40
44
|
<testcase classname="Ari parse" name="should correctly format ARI in case of site resource type and cloud id" time="0"/>
|
|
41
45
|
<testcase classname="Ari parse" name="should correctly format ARI in case of site resource type and resource id" time="0"/>
|
|
42
46
|
<testcase classname="Ari parse" name="should correctly parse ari when all fields are present" time="0"/>
|
|
43
47
|
<testcase classname="Ari parse" name="should correctly parse ari when cloudId is omitted" time="0"/>
|
|
44
|
-
<testcase classname="Ari parse" name="should correctly parse ari when a system wide user context provided" time="0
|
|
48
|
+
<testcase classname="Ari parse" name="should correctly parse ari when a system wide user context provided" time="0"/>
|
|
45
49
|
<testcase classname="Ari parse" name="should correctly parse ari when resourceId is omitted" time="0"/>
|
|
46
|
-
<testcase classname="Ari parse" name="should correctly parse ari when resourceId and resourceType are omitted" time="0
|
|
50
|
+
<testcase classname="Ari parse" name="should correctly parse ari when resourceId and resourceType are omitted" time="0"/>
|
|
47
51
|
<testcase classname="Ari parse" name="should correctly parse ari when resourceOwner contains a full stop" time="0"/>
|
|
48
52
|
<testcase classname="Ari parse" name="should correctly parse ari when resourceOwner contains a dash" time="0"/>
|
|
49
53
|
<testcase classname="Ari parse" name="should correctly parse ari when a global system context provided" time="0"/>
|
|
@@ -51,41 +55,47 @@
|
|
|
51
55
|
<testcase classname="Ari parse" name="should correctly parse ari when application wide system context provided" time="0"/>
|
|
52
56
|
<testcase classname="Ari parse" name="should correctly parse ari when site wide context" time="0"/>
|
|
53
57
|
<testcase classname="Ari parse" name="should correctly parse ari when ARI has colon in resource id" time="0"/>
|
|
58
|
+
<testcase classname="Ari parse" name="should correctly parse ari when ARI has hash in resource id" time="0"/>
|
|
54
59
|
<testcase classname="Ari parse" name="should correctly parse ari when ARI has path characters in resource id" time="0"/>
|
|
60
|
+
<testcase classname="Ari parse" name="should correctly parse ari when resourceType is capitalized" time="0.001"/>
|
|
55
61
|
<testcase classname="Ari urlEncodeAri and urlDecodeAri" name="should be able to urlEncodeAri and urlDecodeAri the ARI" time="0.001"/>
|
|
56
62
|
<testcase classname="Ari urlEncodeAri and urlDecodeAri" name="should be able to urlEncodeAri and urlDecodeAri the ARI when a part of resource Id has a /" time="0"/>
|
|
57
63
|
<testcase classname="Ari urlEncodeAri and urlDecodeAri" name="should be able to parse a encoded ARI" time="0"/>
|
|
58
|
-
<testcase classname="Ari contains" name="should return true when both contexts are the same" time="0
|
|
59
|
-
<testcase classname="Ari contains" name="should return true when self is broader than other context" time="0"/>
|
|
60
|
-
<testcase classname="Ari contains" name="should return false when other context is broader than self" time="0
|
|
61
|
-
<testcase classname="Ari contains" name="should return false when self resource Id is different than other context resource Id" time="0"/>
|
|
64
|
+
<testcase classname="Ari contains" name="should return true when both contexts are the same" time="0"/>
|
|
65
|
+
<testcase classname="Ari contains" name="should return true when self is broader than other context" time="0.001"/>
|
|
66
|
+
<testcase classname="Ari contains" name="should return false when other context is broader than self" time="0"/>
|
|
67
|
+
<testcase classname="Ari contains" name="should return false when self resource Id is different than other context resource Id" time="0.001"/>
|
|
62
68
|
<testcase classname="Ari contains" name="should return false when self resource type is different than other context resource type" time="0"/>
|
|
63
69
|
<testcase classname="Ari contains" name="should return false when self cloud Id is different than other cloud Id" time="0"/>
|
|
64
70
|
<testcase classname="Ari contains" name="should return false when self resource owner is different than other" time="0"/>
|
|
65
71
|
<testcase classname="Ari contains" name="should return false when self cloud Id is undefined" time="0"/>
|
|
66
72
|
<testcase classname="Ari contains" name="should contain site resource type ARI with cloudIds in different fields" time="0"/>
|
|
67
73
|
<testcase classname="Ari cloudId" name="should return cloud ids for site resource type" time="0"/>
|
|
68
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an app ari" time="0.
|
|
69
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an environment group ari" time="0
|
|
70
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an environment group ari with version" time="0"/>
|
|
71
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension group ari" time="0
|
|
72
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when a static extension-group group ari" time="0
|
|
73
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when a defaulted static environment group ari" time="0
|
|
74
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension group ari with version" time="0
|
|
74
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an app ari" time="0.002"/>
|
|
75
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an environment group ari" time="0"/>
|
|
76
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an environment group ari with version" time="0.001"/>
|
|
77
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension group ari" time="0"/>
|
|
78
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when a static extension-group group ari" time="0"/>
|
|
79
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when a defaulted static environment group ari" time="0"/>
|
|
80
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension group ari with version" time="0"/>
|
|
75
81
|
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when a static extension-group group ari with version" time="0"/>
|
|
76
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when a defaulted static environment group ari with version" time="0"/>
|
|
77
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension ari" time="0
|
|
78
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension ari with static extension group" time="0"/>
|
|
82
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when a defaulted static environment group ari with version" time="0.001"/>
|
|
83
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension ari" time="0"/>
|
|
84
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should correctly parse ari when an extension ari with static extension group" time="0.001"/>
|
|
85
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw InvalidAriError when app ID is not a valid UUID" time="0"/>
|
|
86
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw InvalidAriError when environment ID is not a valid UUID" time="0.001"/>
|
|
87
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw InvalidAriError when extension group ID is not a valid UUID" time="0"/>
|
|
79
88
|
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when extra segs on app ari" time="0"/>
|
|
80
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when extra segs on environment ari" time="0"/>
|
|
81
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when extra segs on extension group ari" time="0
|
|
89
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when extra segs on environment ari" time="0.001"/>
|
|
90
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when extra segs on extension group ari" time="0"/>
|
|
82
91
|
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when extra segs on extension ari" time="0"/>
|
|
83
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when too few segs on extension ari" time="0"/>
|
|
92
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when too few segs on extension ari" time="0.001"/>
|
|
84
93
|
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when too few segs on extension group ari" time="0"/>
|
|
85
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when too few segs on environment ari" time="0
|
|
94
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when too few segs on environment ari" time="0"/>
|
|
86
95
|
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when too few segs on app ari" time="0"/>
|
|
87
|
-
<testcase classname="AppFamilyAri parseAppAri" name="should throw
|
|
88
|
-
<testcase classname="AppFamilyAri
|
|
96
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw InvalidAriError when empty first seg on extension group ARI" time="0"/>
|
|
97
|
+
<testcase classname="AppFamilyAri parseAppAri" name="should throw NotAppFamilyAriError when empty segs on extension group ari" time="0"/>
|
|
98
|
+
<testcase classname="AppFamilyAri toAri" name="should correctly convert to ari when an app ari" time="0"/>
|
|
89
99
|
<testcase classname="AppFamilyAri toAri" name="should correctly convert to ari when an environment group ari" time="0"/>
|
|
90
100
|
<testcase classname="AppFamilyAri toAri" name="should correctly convert to ari when an environment group ari with version" time="0"/>
|
|
91
101
|
<testcase classname="AppFamilyAri toAri" name="should correctly convert to ari when an extension group ari" time="0"/>
|