chore: test

This commit is contained in:
kekskurse 2025-03-16 01:16:06 +01:00
parent 4818cf15d2
commit b0578f5eda
5 changed files with 80 additions and 13 deletions
pkg
userstore/migrations
web
playwright
templates

View file

@ -1,9 +1,26 @@
-- --
-- LibSQL SQL Schema dump automatic generated by geni -- Sqlite SQL Schema dump automatic generated by geni
-- --
CREATE TABLE schema_migrations (id VARCHAR(255) NOT NULL PRIMARY KEY); CREATE TABLE schema_migrations (id VARCHAR(255) PRIMARY KEY);
CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, username TEXT NOT NULL UNIQUE, password TEXT NOT NULL); CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL
);
CREATE TABLE sqlite_sequence(name,seq); CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE mail (id INTEGER PRIMARY KEY AUTOINCREMENT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, user_id INTEGER NOT NULL, mail TEXT NOT NULL UNIQUE, validation_code TEXT NOT NULL UNIQUE, is_validated BOOLEAN NOT NULL DEFAULT 0, is_primary BOOLEAN NOT NULL DEFAULT 0, FOREIGN KEY (user_id) REFERENCES users (id)); CREATE TABLE mail (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
user_id INTEGER NOT NULL,
mail TEXT NOT NULL UNIQUE,
validation_code TEXT NOT NULL UNIQUE,
is_validated BOOLEAN NOT NULL DEFAULT 0,
is_primary BOOLEAN NOT NULL DEFAULT 0,
FOREIGN KEY(user_id) REFERENCES users(id)
);

View file

@ -45,6 +45,7 @@ func (w Web) PostRegisterPage(c *gin.Context) {
if c.PostForm("password") != c.PostForm("confirm_password") { if c.PostForm("password") != c.PostForm("confirm_password") {
c.HTML(http.StatusOK, "register.html", gin.H{"msg": "Passworts dont match"}) c.HTML(http.StatusOK, "register.html", gin.H{"msg": "Passworts dont match"})
return
} }
err := w.ma.RegisterUser(c.PostForm("username"), c.PostForm("email"), c.PostForm("password")) err := w.ma.RegisterUser(c.PostForm("username"), c.PostForm("email"), c.PostForm("password"))

Binary file not shown.

Before

(image error) Size: 4.7 KiB

After

(image error) Size: 46 KiB

View file

@ -12,6 +12,55 @@ test('check ping route', async ({ page }) => {
test('see register page', async ({page}) => { test('see register page', async ({page}) => {
await page.goto('/web/register'); await page.goto('/web/register');
await expect(page.getByRole('heading', { name: 'Registrieren'})).toBeVisible(); await expect(page.getByRole('heading', { name: 'Register'})).toBeVisible();
await expect(page.getByRole('button', { name: 'Registrieren' })).toBeVisible(); await expect(page.getByRole('button', { name: 'Register' })).toBeVisible();
})
test('invalide username at register page', async ({page}) => {
await page.goto('/web/register');
await page.getByLabel('Username').fill('abc');
await page.getByLabel('E-mail Address').fill('error@error.error');
await page.getByLabel('Password', {name: 'password', exact: true}).fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%%n3T7rKw');
await page.getByLabel('Repeat Password').fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%%n3T7rKw');
await page.getByRole('button', { name: 'Register' }).click();
await expect(page.getByText('username has invalide chars: username has invalide chars ')).toBeVisible();
await page.screenshot({ path: 'screenshot.png' });
})
test('invalide mail at register page', async ({page, browserName}) => {
await page.goto('/web/register');
await page.getByLabel('Username').fill('kekskursefail');
await page.getByLabel('E-mail Address').fill('error@error.error');
await page.getByLabel('Password', {name: 'password', exact: true}).fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%%n3T7rKw');
await page.getByLabel('Repeat Password').fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%%n3T7rKw');
await page.getByRole('button', { name: 'Register' }).click();
await page.screenshot({ path: 'screenshot.png' });
await expect(page.getByText('cant send mail: cant send mail to error mail')).toBeVisible();
})
test('different passwords', async ({page}) => {
await page.goto('/web/register');
await page.getByLabel('Username').fill('kekskurse');
await page.getByLabel('E-mail Address').fill('error@error.error');
await page.getByLabel('Password', {name: 'password', exact: true}).fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%');
await page.getByLabel('Repeat Password').fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%%n3T7rKw');
await page.getByRole('button', { name: 'Register' }).click();
await page.screenshot({ path: 'screenshot.png' });
await expect(page.getByText('Passworts dont match')).toBeVisible();
})
test('register currect', async ({page, browserName}) => {
await page.goto('/web/register');
await page.getByLabel('Username').fill('kekskurse'+browserName);
await page.getByLabel('E-mail Address').fill('hello'+browserName+'@example.com');
await page.getByLabel('Password', {name: 'password', exact: true}).fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%');
await page.getByLabel('Repeat Password').fill('7Jw^zNhk!NU3a8qfVp%a*VV!&Won1gD9zVHr&pgNairR5U6^h^$D%TxyJ2qHp%');
await page.getByRole('button', { name: 'Register' }).click();
await page.screenshot({ path: 'screenshot.png' });
await expect(page.getByText('Your account was created, you can login now')).toBeVisible();
}) })

View file

@ -8,7 +8,7 @@
</head> </head>
<body class="bg-gray-100 flex items-center justify-center min-h-screen"> <body class="bg-gray-100 flex items-center justify-center min-h-screen">
<div class="bg-white p-8 shadow-xl w-full max-w-md"> <div class="bg-white p-8 shadow-xl w-full max-w-md">
<h2 class="text-2xl font-semibold text-gray-900 text-center mb-6">Registrieren</h2> <h2 class="text-2xl font-semibold text-gray-900 text-center mb-6">Register</h2>
{{ if .msg }} {{ if .msg }}
<div id="global-error" class=" bg-red-100 text-red-700 p-3 text-center mb-4 border border-red-400"> <div id="global-error" class=" bg-red-100 text-red-700 p-3 text-center mb-4 border border-red-400">
{{ .msg }} {{ .msg }}
@ -16,28 +16,28 @@
{{ end }} {{ end }}
<form action="#" method="POST" class="space-y-4"> <form action="#" method="POST" class="space-y-4">
<div> <div>
<label for="username" class="block text-sm font-medium text-gray-700">Benutzername</label> <label for="username" class="block text-sm font-medium text-gray-700">Username</label>
<input type="text" id="username" name="username" required <input type="text" id="username" name="username" required
class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none"> class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none">
</div> </div>
<div> <div>
<label for="email" class="block text-sm font-medium text-gray-700">E-Mail-Adresse</label> <label for="email" class="block text-sm font-medium text-gray-700">E-mail Address</label>
<input type="email" id="email" name="email" required <input type="email" id="email" name="email" required
class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none"> class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none">
</div> </div>
<div> <div>
<label for="password" class="block text-sm font-medium text-gray-700">Passwort</label> <label for="password" class="block text-sm font-medium text-gray-700">Password</label>
<input type="password" id="password" name="password" required <input type="password" id="password" name="password" required
class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none"> class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none">
</div> </div>
<div> <div>
<label for="confirm_password" class="block text-sm font-medium text-gray-700">Passwort wiederholen</label> <label for="confirm_password" class="block text-sm font-medium text-gray-700">Repeat Password</label>
<input type="password" id="confirm_password" name="confirm_password" required <input type="password" id="confirm_password" name="confirm_password" required
class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none"> class="mt-1 p-3 w-full border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none">
</div> </div>
<button type="submit" <button type="submit"
class="w-full bg-blue-600 text-white py-3 text-lg font-medium hover:bg-blue-700 focus:ring-4 focus:ring-blue-300"> class="w-full bg-blue-600 text-white py-3 text-lg font-medium hover:bg-blue-700 focus:ring-4 focus:ring-blue-300">
Registrieren Register
</button> </button>
</form> </form>
@ -60,7 +60,7 @@
</div> </div>
!--> !-->
<p class="text-sm text-gray-600 text-center mt-4">Bereits ein Konto? <a href="#" class="text-blue-500 hover:underline">Anmelden</a></p> <p class="text-sm text-gray-600 text-center mt-4">Already have an account?? <a href="#" class="text-blue-500 hover:underline">Login</a></p>
</div> </div>
</body> </body>
</html> </html>