Skip to content

Commit

Permalink
feat(test): Userのバリデーションテストを書いた
Browse files Browse the repository at this point in the history
  • Loading branch information
laminne committed Sep 9, 2023
1 parent 554abe3 commit 1e4fe81
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 21 deletions.
101 changes: 101 additions & 0 deletions src/domain/user.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { describe, expect, it } from "vitest";
import { User, UserAPData } from "./user.js";
import { Snowflake } from "../helpers/id_generator.js";

describe("User domain model", () => {
const defaultDataArgs = {
id: "10100912877076480" as Snowflake,
serverID: "10100914303139840" as Snowflake,
handle: "test",
fullHandle: "test@example.jp",
nickName: "TestUser",
bio: "testのユーザーです",
headerImageURL: "https://image.example.jp/header.png",
iconImageURL: "https://image.example.jp/icon.png",
password: "efnrkgnjkneiug",
role: 0,
createdAt: new Date(),
isLocalUser: true,
following: [],
apData: new UserAPData({
followersURL: "https://example.jp/followers",
followingURL: "https://example.jp/following",
inboxURL: "https://example.jp/inbox",
outboxURL: "https://example.jp/outbox",
privateKey: "",
publicKey: "",
userAPID: "10100938952278016",
userID: "10100912877076480" as Snowflake,
}),
};

it("64文字以内の表示名は設定できる", () => {
const u = new User({ ...defaultDataArgs, nickName: "テストユーザー" });
expect(u).toBeTruthy();
});

it("64文字以上の表示名は設定できない", () => {
expect(
() =>
new User({
...defaultDataArgs,
nickName: "テストユーザー".repeat(10),
}),
).toThrowError(new Error("failed to create user: nickname is too long"));
});

it("64文字以上のハンドルは設定できない", () => {
expect(
() =>
new User({
...defaultDataArgs,
handle: "test_user".repeat(20),
}),
).toThrowError(new Error("failed to create user: handle is too long"));
});

it("64文字以下のハンドルを設定できる", () => {
expect(new User({ ...defaultDataArgs, handle: "test_user" })).toBeTruthy();
});

it("空文字列は設定できない", () => {
expect(() => new User({ ...defaultDataArgs, handle: "" })).toThrowError(
new Error("failed to create user: handle is too short"),
);
});

it("フルハンドルを設定できる", () => {
expect(
new User({ ...defaultDataArgs, fullHandle: "test@social.example.jp" }),
).toBeTruthy();
});

it("FQDNとして成立しない長さのフルハンドルは設定できない", () => {
expect(
() =>
new User({
...defaultDataArgs,
fullHandle: "t@a.b",
}),
).toThrowError(new Error("failed to create user: fullHandle is too short"));
});

it("3000文字以上のbioは設定できない", () => {
expect(
() =>
new User({
...defaultDataArgs,
bio: "a".repeat(3001),
}),
).toThrowError(new Error("failed to create user: bio is too long"));
});

it("bioを設定できる", () => {
expect(
new User({
...defaultDataArgs,
bio: "テストユーザーです",
}),
).toBeTruthy();
});
});
69 changes: 48 additions & 21 deletions src/domain/user.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
// ユーザー
import { Snowflake } from "../helpers/id_generator.js";

export interface UserArgs {
id: Snowflake;
handle: string;
fullHandle: string;
serverID: Snowflake;
nickName: string;
role: number;
bio: string;
headerImageURL: string;
iconImageURL: string;
password: string;
isLocalUser: boolean;
createdAt: Date;
apData: UserAPData;
following: Array<UserFollowEvent>;
}

export class User {
get id(): Snowflake {
return this._id;
Expand Down Expand Up @@ -70,10 +87,6 @@ export class User {
return this._createdAt;
}

set createdAt(value: Date) {
this._createdAt = value;
}

get apData(): UserAPData {
return this._apData;
}
Expand Down Expand Up @@ -133,39 +146,53 @@ export class User {
// フォロー中のユーザー
private _following: Set<UserFollowEvent>;

constructor(args: {
id: Snowflake;
handle: string;
fullHandle: string;
serverID: Snowflake;
nickName: string;
role: number;
bio: string;
headerImageURL: string;
iconImageURL: string;
password: string;
isLocalUser: boolean;
createdAt: Date;
apData: UserAPData;
following: Array<UserFollowEvent>;
}) {
constructor(args: UserArgs) {
this.validate(args);

// 不変
this._id = args.id;
this._handle = args.handle;
this._fullHandle = args.fullHandle;
this._isLocalUser = args.isLocalUser;
this._serverID = args.serverID;
this._createdAt = args.createdAt;

this._nickName = args.nickName;
this._role = args.role;
this._bio = args.bio;
this._password = args.password;
this._headerImageURL = args.headerImageURL;
this._iconImageURL = args.iconImageURL;
this._createdAt = args.createdAt;
this._apData = args.apData;
this._following = new Set(args.following);
}

private validate(args: UserArgs) {
if ([...args.nickName].length > 64) {
throw new Error("failed to create user: nickname is too long");
} else if ([...args.nickName].length < 1) {
throw new Error("failed to create user: nickname is too short");
}

if ([...args.handle].length > 64) {
throw new Error("failed to create user: handle is too long");
} else if ([...args.handle].length < 1) {
throw new Error("failed to create user: handle is too short");
}

// ホスト名は最小4文字, @で1文字、ハンドルが最小1文字: 合計6文字以上
if ([...args.fullHandle].length < 6) {
throw new Error("failed to create user: fullHandle is too short");
}

if ([...args.bio].length > 3000) {
throw new Error("failed to create user: bio is too long");
}

if (args.isLocalUser && args.password.length < 1) {
throw new Error("failed to create user: password is not set");
}
}
}

export class UserAPData {
Expand Down

0 comments on commit 1e4fe81

Please sign in to comment.