Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor/refactor validation for emailAdress and website #122

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f95e9a6
refactor: email validation
RuthDiG Apr 16, 2024
6ddd188
fix: Email-Validation and add a test for it
RuthDiG May 6, 2024
64df3f4
fix: Website Validation and add a test for it
RuthDiG May 6, 2024
fde68a4
Merge remote-tracking branch 'origin/main' into refactor/refactor-val…
RuthDiG May 7, 2024
aa49e8a
feat: change regexp from Url
RuthDiG May 7, 2024
532278b
Merge branch 'main' into refactor/refactor-validation-for-AbstractEma…
mergify[bot] May 7, 2024
ea00966
chore: version bump
RuthDiG May 7, 2024
8b35b32
refactor: test for website
RuthDiG May 8, 2024
ee5b37b
refactor: changed wording of the test
RuthDiG May 13, 2024
7bf9bfd
refactor: Tests for Email and Website
RuthDiG May 14, 2024
76e95e1
refactor: change string in regexp
RuthDiG May 14, 2024
407b174
refactor: test for Website and AbstractURL
RuthDiG May 15, 2024
ef0e007
Merge branch 'main' into refactor/refactor-validation-for-AbstractEma…
RuthDiG May 16, 2024
24b3c14
refactor: name and AbstractURL without escape
RuthDiG May 16, 2024
73b6374
Merge branch 'main' into refactor/refactor-validation-for-AbstractEma…
RuthDiG Jun 4, 2024
a8fa603
refactor: Change Tests and RegExp
RuthDiG Jun 5, 2024
e045ae1
chore: version bump
RuthDiG Jun 5, 2024
2c2b4ed
feat: make regexp more readable
RuthDiG Jun 5, 2024
825bbee
fix: changed an error
RuthDiG Jun 5, 2024
5427a52
Merge branch 'main' into refactor/refactor-validation-for-AbstractEma…
mergify[bot] Jun 6, 2024
f1b4fdf
fix: error and last changes
RuthDiG Jun 6, 2024
151cfe4
Merge remote-tracking branch 'origin/main' into refactor/refactor-val…
RuthDiG Jun 7, 2024
b324923
feat: last changes
RuthDiG Jun 7, 2024
677088f
chore: version bump
RuthDiG Jun 7, 2024
0ce518a
fix: delete unnecessary file
RuthDiG Jun 7, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/content/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@nmshd/content",
"version": "2.10.1",
"version": "2.10.2",
"description": "The content library defines data structures that can be transmitted using the transport library.",
"homepage": "https://enmeshed.eu",
"repository": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,22 @@ import { AbstractString } from "../AbstractString";

export abstract class AbstractEMailAddress extends AbstractString {
// from https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
private static readonly regExp = new RegExp(
/^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@([A-Za-z0-9ÄäÖöÜüß]([A-Za-z0-9ÄäÖöÜüß-]{0,61}[A-Za-z0-9ÄäÖöÜüß])?\.)+[A-Za-z0-9ÄäÖöÜüß][A-Za-z0-9ÄäÖöÜüß-]{0,61}[A-Za-z0-9ÄäÖöÜüß]$/
RuthDiG marked this conversation as resolved.
Show resolved Hide resolved
);
@serialize()
@validate({
min: 3,
max: 100,
regExp: new RegExp("^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,}$", "i")
max: 254,
regExp: AbstractEMailAddress.regExp
})
public override value: string;

public static override get valueHints(): ValueHints {
return super.valueHints.copyWith({
min: 3,
max: 100,
pattern: "/^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,}$/i"
max: 254,
pattern: String(AbstractEMailAddress.regExp)
});
}

Expand Down
12 changes: 6 additions & 6 deletions packages/content/src/attributes/types/strings/AbstractURL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@ import { RenderHints, RenderHintsDataType, RenderHintsEditType, ValueHints } fro
import { AbstractString } from "../AbstractString";

export abstract class AbstractURL extends AbstractString {
private static readonly regExp = new RegExp(
/^([A-Za-z]+:\/\/)?((www\.)|(?!www\.))([A-Za-z0-9ÄäÖöÜüß]([A-Za-zÄäÖöÜüß0-9-]{0,61}[A-Za-zÄäÖöÜüß0-9])?\.)+([A-Za-z0-9ÄäÖöÜüß]([A-Za-zÄäÖöÜüß0-9-]{0,61}[A-Za-zÄäÖöÜüß0-9])?)(:[0-9]+)?(\/[A-Za-zÄäÖöÜüß0-9?#@!$&'()*+,;=%-]*)*$/
);

@serialize()
@validate({
min: 3,
max: 1024,
regExp: new RegExp(
// eslint-disable-next-line no-useless-escape
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
)
regExp: AbstractURL.regExp
})
public override value: string;

public static override get valueHints(): ValueHints {
return super.valueHints.copyWith({
min: 3,
max: 1024,
pattern:
"/((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w\\-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)/"
pattern: String(AbstractURL.regExp)
});
}

Expand Down
38 changes: 38 additions & 0 deletions packages/content/test/attributes/EMailAddress.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { ParsingError } from "@js-soft/ts-serval";
import { EMailAddress } from "../../src";

describe("Test valid EMailAddresses", () => {
const validEMailAddresses = ["peter123@inwind.it", "peter123@inwänd.it"];

test.each(validEMailAddresses)("EMail %s is recognized as valid", (email) => {
const validEMailAddress = EMailAddress.from({ value: email });
expect(validEMailAddress.value.toString()).toBe(email);
});
});

describe("Test invalid EMailAddresses", () => {
const invalidEMailAddresses = ["Hugo Becker@gmx.de", "Becker@gmx", "Becker@gmx-.de", "Becker@gmx-.de", ".Becker@gmx.de", "test@.address", "test@test..address"];

test.each(invalidEMailAddresses)("EMail %s is recognized as invalid", (email) => {
const invalidEMailAddressCall = () => {
EMailAddress.from({
value: email
});
};
expect(invalidEMailAddressCall).toThrow(
new ParsingError(
"EMailAddress",
"value",
"Value does not match regular expression /^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@([A-Za-z0-9ÄäÖöÜüß]([A-Za-z0-9ÄäÖöÜüß-]{0,61}[A-Za-z0-9ÄäÖöÜüß])?\\.)+[A-Za-z0-9ÄäÖöÜüß][A-Za-z0-9ÄäÖöÜüß-]{0,61}[A-Za-z0-9ÄäÖöÜüß]$/"
)
);
});
test("returns an error when trying to create an Attribute Value Type EMailAddress wich is empty", function () {
const invalidEMailAddressCall = () => {
EMailAddress.from({
value: ""
});
};
expect(invalidEMailAddressCall).toThrow(new ParsingError("EMailAddress", "value", "Value is shorter than 3 characters"));
});
});
45 changes: 45 additions & 0 deletions packages/content/test/attributes/Website.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { ParsingError } from "@js-soft/ts-serval";
import { Website } from "../../src";

describe("Test valid URLs", () => {
const validUrls = [
"www.google.com",
"https://inwänd.it",
"http://inwind.it",
"https://enmeshed.de/blog/meilenstein-enmeshed-als-komponente-ablage-in-mein-bildungsraum-geht-in-die-testphase-der-beta-version/",
"www.foo.www.www.enmeshed.eu",
"https://example.org:8080/mein/ordner/bericht"
];

test.each(validUrls)("URL %s is recognized as valid", (url) => {
const validWebsite = Website.from({ value: url });
expect(validWebsite.value.toString()).toBe(url);
});
});

describe("Test invalid URLs", () => {
const invalidUrls = ["google-.de", "www.google", "www.-google", "https://inwind.test it"];
slavistan marked this conversation as resolved.
Show resolved Hide resolved

RuthDiG marked this conversation as resolved.
Show resolved Hide resolved
test.each(invalidUrls)("URL %s is recognized as invalid", (url) => {
const invalidWebsiteCall = () => {
Website.from({
value: url
});
};
expect(invalidWebsiteCall).toThrow(
new ParsingError(
"Website",
"value",
"Value does not match regular expression /^([A-Za-z]+:\\/\\/)?((www\\.)|(?!www\\.))([A-Za-z0-9ÄäÖöÜüß]([A-Za-zÄäÖöÜüß0-9-]{0,61}[A-Za-zÄäÖöÜüß0-9])?\\.)+([A-Za-z0-9ÄäÖöÜüß]([A-Za-zÄäÖöÜüß0-9-]{0,61}[A-Za-zÄäÖöÜüß0-9])?)(:[0-9]+)?(\\/[A-Za-zÄäÖöÜüß0-9?#@!$&'()*+,;=%-]*)*$/"
)
);
});
test("returns an error when trying to create an Attribute Value Type Website wich is empty", function () {
const invalidWebsiteCall = () => {
Website.from({
value: ""
});
};
expect(invalidWebsiteCall).toThrow(new ParsingError("Website", "value", "Value is shorter than 3 characters"));
});
});
2 changes: 1 addition & 1 deletion packages/runtime/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"@js-soft/ts-serval": "2.0.10",
"@js-soft/ts-utils": "^2.3.3",
"@nmshd/consumption": "3.11.0",
"@nmshd/content": "2.10.1",
"@nmshd/content": "2.10.2",
"@nmshd/crypto": "2.0.6",
"@nmshd/transport": "2.8.0",
"ajv": "^8.16.0",
Expand Down