Skip to content

Commit

Permalink
Refactor/refactor validation for emailAdress and website (#122)
Browse files Browse the repository at this point in the history
* refactor: email validation

* fix: Email-Validation and add a test for it

* fix: Website Validation and add a test for it

* feat: change regexp from Url

* chore: version bump

* refactor: test for website

* refactor: changed wording of the test

* refactor: Tests for Email and Website

* refactor: change string in regexp

* refactor: test for Website and AbstractURL

* refactor: name and AbstractURL without escape

* refactor: Change Tests and RegExp

* chore: version bump

* feat: make regexp more readable

* fix: changed an error

* fix: error and last changes

* feat: last changes

* chore: version bump

* fix: delete unnecessary file

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
RuthDiG and mergify[bot] committed Jun 7, 2024
1 parent f7dd1f2 commit 45dc922
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 14 deletions.
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ÄäÖöÜüß]$/
);
@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"];

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

0 comments on commit 45dc922

Please sign in to comment.