Skip to content

Commit 883010b

Browse files
committed
Fixes attachment validation.
1 parent 42e6dda commit 883010b

7 files changed

Lines changed: 103 additions & 19 deletions

File tree

dist/schemaRules/attachment.js

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
11
"use strict";
22
Object.defineProperty(exports, "__esModule", { value: true });
33
var rulr_1 = require("rulr");
4+
var lodash_1 = require("lodash");
45
var factory_1 = require("../factory");
5-
exports.default = rulr_1.restrictToSchema({
6-
usageType: rulr_1.required(factory_1.iri),
7-
display: rulr_1.required(factory_1.languageMap),
8-
description: rulr_1.optional(factory_1.languageMap),
9-
contentType: rulr_1.required(factory_1.imt),
10-
length: rulr_1.required(factory_1.integerValue),
11-
sha2: rulr_1.required(factory_1.stringValue),
12-
fileUrl: rulr_1.optional(factory_1.iri),
13-
});
6+
var SignedContentTypeWarning_1 = require("../warnings/SignedContentTypeWarning");
7+
exports.default = rulr_1.composeRules([
8+
rulr_1.restrictToSchema({
9+
usageType: rulr_1.required(factory_1.iri),
10+
display: rulr_1.required(factory_1.languageMap),
11+
description: rulr_1.optional(factory_1.languageMap),
12+
contentType: rulr_1.required(factory_1.imt),
13+
length: rulr_1.required(factory_1.integerValue),
14+
sha2: rulr_1.required(factory_1.stringValue),
15+
fileUrl: rulr_1.optional(factory_1.iri),
16+
}),
17+
function (data, path) {
18+
if (!lodash_1.isPlainObject(data))
19+
return [];
20+
if (data.usageType === 'http://adlnet.gov/expapi/attachments/signature' &&
21+
data.contentType !== 'application/octet-stream') {
22+
return [new SignedContentTypeWarning_1.default(data, path, data.contentType)];
23+
}
24+
return [];
25+
}
26+
]);

dist/tests/schemaRules/attachment.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
"use strict";
2+
var __assign = (this && this.__assign) || Object.assign || function(t) {
3+
for (var s, i = 1, n = arguments.length; i < n; i++) {
4+
s = arguments[i];
5+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6+
t[p] = s[p];
7+
}
8+
return t;
9+
};
210
Object.defineProperty(exports, "__esModule", { value: true });
311
var describeRequiredProp_1 = require("../describeRequiredProp");
412
var describeOptionalProp_1 = require("../describeOptionalProp");
513
var itsInvalid_1 = require("../itsInvalid");
14+
var itsValid_1 = require("../itsValid");
615
var factory_1 = require("../factory");
716
var validData = {
817
usageType: 'http://www.example.com',
@@ -15,6 +24,8 @@ var validData = {
1524
};
1625
exports.default = function (test) {
1726
itsInvalid_1.default(10, 'not an object', test);
27+
itsInvalid_1.default(__assign({}, validData, { usageType: 'http://adlnet.gov/expapi/attachments/signature', contentType: 'application/json' }), 'not a valid signed content type', test);
28+
itsValid_1.default(__assign({}, validData, { usageType: 'http://adlnet.gov/expapi/attachments/signature', contentType: 'application/octet-stream' }), test);
1829
describeRequiredProp_1.default('usageType', factory_1.iri, validData, test);
1930
describeRequiredProp_1.default('display', factory_1.languageMap, validData, test);
2031
describeOptionalProp_1.default('description', factory_1.languageMap, validData, test);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Path, Warning } from 'rulr';
2+
export default class SignedContentTypeWarning extends Warning {
3+
contentType: string;
4+
constructor(data: any, path: Path, contentType: string);
5+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use strict";
2+
var __extends = (this && this.__extends) || (function () {
3+
var extendStatics = Object.setPrototypeOf ||
4+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5+
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6+
return function (d, b) {
7+
extendStatics(d, b);
8+
function __() { this.constructor = d; }
9+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
10+
};
11+
})();
12+
Object.defineProperty(exports, "__esModule", { value: true });
13+
var rulr_1 = require("rulr");
14+
var SignedContentTypeWarning = (function (_super) {
15+
__extends(SignedContentTypeWarning, _super);
16+
function SignedContentTypeWarning(data, path, contentType) {
17+
var _this = _super.call(this, data, path) || this;
18+
_this.contentType = contentType;
19+
return _this;
20+
}
21+
return SignedContentTypeWarning;
22+
}(rulr_1.Warning));
23+
exports.default = SignedContentTypeWarning;

src/schemaRules/attachment.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
1-
import { restrictToSchema, optional, required, Rule } from 'rulr';
1+
import { composeRules, restrictToSchema, optional, required, Rule } from 'rulr';
2+
import { isPlainObject } from 'lodash';
23
import { iri, languageMap, imt, integerValue, stringValue } from '../factory';
4+
import SignedContentTypeWarning from '../warnings/SignedContentTypeWarning';
35

4-
export default restrictToSchema({
5-
usageType: required(iri),
6-
display: required(languageMap),
7-
description: optional(languageMap),
8-
contentType: required(imt),
9-
length: required(integerValue),
10-
sha2: required(stringValue),
11-
fileUrl: optional(iri),
12-
}) as Rule;
6+
export default composeRules([
7+
restrictToSchema({
8+
usageType: required(iri),
9+
display: required(languageMap),
10+
description: optional(languageMap),
11+
contentType: required(imt),
12+
length: required(integerValue),
13+
sha2: required(stringValue),
14+
fileUrl: optional(iri),
15+
}),
16+
(data, path) => {
17+
if (!isPlainObject(data)) return [];
18+
if (
19+
data.usageType === 'http://adlnet.gov/expapi/attachments/signature' &&
20+
data.contentType !== 'application/octet-stream'
21+
) {
22+
return [new SignedContentTypeWarning(data, path, data.contentType)];
23+
}
24+
return [];
25+
}
26+
]) as Rule;

src/tests/schemaRules/attachment.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Test from '../helpers/test';
22
import describeRequiredProp from '../describeRequiredProp';
33
import describeOptionalProp from '../describeOptionalProp';
44
import itsInvalid from '../itsInvalid';
5+
import itsValid from '../itsValid';
56
import { iri, languageMap, imt, integerValue, stringValue } from '../factory';
67

78
const validData = {
@@ -16,6 +17,16 @@ const validData = {
1617

1718
export default (test: Test) => {
1819
itsInvalid(10, 'not an object', test);
20+
itsInvalid({
21+
...validData,
22+
usageType: 'http://adlnet.gov/expapi/attachments/signature',
23+
contentType: 'application/json',
24+
}, 'not a valid signed content type', test);
25+
itsValid({
26+
...validData,
27+
usageType: 'http://adlnet.gov/expapi/attachments/signature',
28+
contentType: 'application/octet-stream',
29+
}, test);
1930
describeRequiredProp('usageType', iri, validData, test);
2031
describeRequiredProp('display', languageMap, validData, test);
2132
describeOptionalProp('description', languageMap, validData, test);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Path, Warning } from 'rulr';
2+
3+
export default class SignedContentTypeWarning extends Warning {
4+
constructor(data: any, path: Path, public contentType: string) {
5+
super(data, path);
6+
}
7+
}

0 commit comments

Comments
 (0)