From 8305b1e2ab22f640b67bc0307baef964a390f2b3 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 22:34:01 +0700 Subject: [PATCH 01/12] feat: portfolio --- tests/portfolio.spec.ts | 79 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 tests/portfolio.spec.ts diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts new file mode 100644 index 0000000..ce34f9f --- /dev/null +++ b/tests/portfolio.spec.ts @@ -0,0 +1,79 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Portfolio Website Tests', () => { + test.beforeEach(async ({ page }) => { + await page.goto('https://my-porfolio-best.vercel.app/'); + }); + + test('should have correct title and header', async ({ page }) => { + await expect(page).toHaveTitle('Thet Myat Noe'); + await expect(page.getByText('Hello! This is')).toBeVisible(); + await expect(page.getByText('Thet Myat Noe', { exact: true })).toBeVisible(); + await expect(page.getByText('Senior Software Engineer')).toBeVisible(); + }); + + test('should display contact information correctly', async ({ page }) => { + await expect(page.getByText('thetmyatnoe223@gmail.com')).toBeVisible(); + await expect(page.getByText('+66 61 285 2597')).toBeVisible(); + await expect(page.getByText('Bangkok, Thailand')).toBeVisible(); + }); + + test('should have working social media links', async ({ page }) => { + const linkedinLink = page.getByRole('link', { name: /linkedin/i }); + await expect(linkedinLink).toHaveAttribute('href', 'https://www.linkedin.com/in/thet-myat-noe-14682b142/'); + + const twitterLink = page.getByRole('link', { name: /twitter/i }); + await expect(twitterLink).toHaveAttribute('href', 'https://twitter.com/ThetMyatNoe13'); + + const githubLink = page.getByRole('link', { name: /github/i }); + await expect(githubLink).toHaveAttribute('href', 'https://github.com/MrMyatNoe'); + + const facebookLink = page.getByRole('link', { name: /facebook/i }); + await expect(facebookLink).toHaveAttribute('href', 'https://www.facebook.com/thet.myatnoe.988'); + }); + + test('should display all skill sections', async ({ page }) => { + // Frontend Development section + await expect(page.getByRole('heading', { name: 'Frontend' })).toBeVisible(); + await expect(page.getByText('Create Dynamic Apps')).toBeVisible(); + await expect(page.getByText('From your mobile')).toBeVisible(); + await expect(page.getByText('To a Big Screen')).toBeVisible(); + + // Backend Development section + await expect(page.getByRole('heading', { name: 'Backend' })).toBeVisible(); + await expect(page.getByText('Building and maintaining')).toBeVisible(); + await expect(page.getByText('backend APIs, ranging from')).toBeVisible(); + await expect(page.getByText('Public to Private')).toBeVisible(); + + // Mobile Development section + await expect(page.getByRole('heading', { name: 'Mobile' })).toBeVisible(); + await expect(page.getByText('Real-time mobile apps')).toBeVisible(); + await expect(page.getByText('delivering user experiences')).toBeVisible(); + await expect(page.getByText('using Flutter')).toBeVisible(); + }); + + test('should display work experience section', async ({ page }) => { + // Current position + await expect(page.getByText('Backend Developer at Allianz Technology Thailand')).toBeVisible(); + await expect(page.getByText('July 2022 - Present')).toBeVisible(); + + // Skills tags verification for current position + const expectedSkills = [ + 'Backend', 'Java', 'Spring Boot', 'Rest API', 'Kafka', + 'Unit Testing', 'Contract Testing', 'Playwright Testing', + 'Github Actions', 'Microservices', 'Agile', 'Typescript', + 'DevSecOps', 'Insurance' + ]; + + for (const skill of expectedSkills) { + await expect(page.getByText(skill, { exact: true })).toBeVisible(); + } + + // Previous positions verification + await expect(page.getByText('Fullstack Developer, Product Owner, Designer for Mobile and Web')).toBeVisible(); + await expect(page.getByText('Freelance Frontend Developer at IHRP')).toBeVisible(); + await expect(page.getByText('Fullstack Developer at Nanyan Platform Myanmar')).toBeVisible(); + await expect(page.getByText('Fullstack Developer at MBC Software Development Myanmar')).toBeVisible(); + await expect(page.getByText('Junior Java Developer at FPT Software Myanmar')).toBeVisible(); + }); +}); \ No newline at end of file From db4ebae7600354976ca042945f0840eabdc98d26 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 22:43:36 +0700 Subject: [PATCH 02/12] feat: add networkd idle --- tests/portfolio.spec.ts | 134 ++++++++++++++++++++++++++-------------- 1 file changed, 87 insertions(+), 47 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index ce34f9f..83ae0fe 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -1,68 +1,96 @@ -import { test, expect } from '@playwright/test'; +import { expect, test } from "@playwright/test"; -test.describe('Portfolio Website Tests', () => { +test.describe("Portfolio Website Tests", () => { test.beforeEach(async ({ page }) => { - await page.goto('https://my-porfolio-best.vercel.app/'); + await page.goto("https://my-porfolio-best.vercel.app/"); + + await page.waitForLoadState("networkidle"); }); - test('should have correct title and header', async ({ page }) => { - await expect(page).toHaveTitle('Thet Myat Noe'); - await expect(page.getByText('Hello! This is')).toBeVisible(); - await expect(page.getByText('Thet Myat Noe', { exact: true })).toBeVisible(); - await expect(page.getByText('Senior Software Engineer')).toBeVisible(); + test("should have correct title and header", async ({ page }) => { + await expect(page).toHaveTitle("Thet Myat Noe"); + await expect(page.getByText("Hello! This is")).toBeVisible(); + await expect( + page.getByText("Thet Myat Noe", { exact: true }) + ).toBeVisible(); + await expect(page.getByText("Senior Software Engineer")).toBeVisible(); }); - test('should display contact information correctly', async ({ page }) => { - await expect(page.getByText('thetmyatnoe223@gmail.com')).toBeVisible(); - await expect(page.getByText('+66 61 285 2597')).toBeVisible(); - await expect(page.getByText('Bangkok, Thailand')).toBeVisible(); + test("should display contact information correctly", async ({ page }) => { + await expect(page.getByText("thetmyatnoe223@gmail.com")).toBeVisible(); + await expect(page.getByText("+66 61 285 2597")).toBeVisible(); + await expect(page.getByText("Bangkok, Thailand")).toBeVisible(); }); - test('should have working social media links', async ({ page }) => { - const linkedinLink = page.getByRole('link', { name: /linkedin/i }); - await expect(linkedinLink).toHaveAttribute('href', 'https://www.linkedin.com/in/thet-myat-noe-14682b142/'); + test("should have working social media links", async ({ page }) => { + const linkedinLink = page.getByRole("link", { name: /linkedin/i }); + await expect(linkedinLink).toHaveAttribute( + "href", + "https://www.linkedin.com/in/thet-myat-noe-14682b142/" + ); - const twitterLink = page.getByRole('link', { name: /twitter/i }); - await expect(twitterLink).toHaveAttribute('href', 'https://twitter.com/ThetMyatNoe13'); + const twitterLink = page.getByRole("link", { name: /twitter/i }); + await expect(twitterLink).toHaveAttribute( + "href", + "https://twitter.com/ThetMyatNoe13" + ); - const githubLink = page.getByRole('link', { name: /github/i }); - await expect(githubLink).toHaveAttribute('href', 'https://github.com/MrMyatNoe'); + const githubLink = page.getByRole("link", { name: /github/i }); + await expect(githubLink).toHaveAttribute( + "href", + "https://github.com/MrMyatNoe" + ); - const facebookLink = page.getByRole('link', { name: /facebook/i }); - await expect(facebookLink).toHaveAttribute('href', 'https://www.facebook.com/thet.myatnoe.988'); + const facebookLink = page.getByRole("link", { name: /facebook/i }); + await expect(facebookLink).toHaveAttribute( + "href", + "https://www.facebook.com/thet.myatnoe.988" + ); }); - test('should display all skill sections', async ({ page }) => { + test("should display all skill sections", async ({ page }) => { // Frontend Development section - await expect(page.getByRole('heading', { name: 'Frontend' })).toBeVisible(); - await expect(page.getByText('Create Dynamic Apps')).toBeVisible(); - await expect(page.getByText('From your mobile')).toBeVisible(); - await expect(page.getByText('To a Big Screen')).toBeVisible(); + await expect(page.getByRole("heading", { name: "Frontend" })).toBeVisible(); + await expect(page.getByText("Create Dynamic Apps")).toBeVisible(); + await expect(page.getByText("From your mobile")).toBeVisible(); + await expect(page.getByText("To a Big Screen")).toBeVisible(); // Backend Development section - await expect(page.getByRole('heading', { name: 'Backend' })).toBeVisible(); - await expect(page.getByText('Building and maintaining')).toBeVisible(); - await expect(page.getByText('backend APIs, ranging from')).toBeVisible(); - await expect(page.getByText('Public to Private')).toBeVisible(); + await expect(page.getByRole("heading", { name: "Backend" })).toBeVisible(); + await expect(page.getByText("Building and maintaining")).toBeVisible(); + await expect(page.getByText("backend APIs, ranging from")).toBeVisible(); + await expect(page.getByText("Public to Private")).toBeVisible(); // Mobile Development section - await expect(page.getByRole('heading', { name: 'Mobile' })).toBeVisible(); - await expect(page.getByText('Real-time mobile apps')).toBeVisible(); - await expect(page.getByText('delivering user experiences')).toBeVisible(); - await expect(page.getByText('using Flutter')).toBeVisible(); + await expect(page.getByRole("heading", { name: "Mobile" })).toBeVisible(); + await expect(page.getByText("Real-time mobile apps")).toBeVisible(); + await expect(page.getByText("delivering user experiences")).toBeVisible(); + await expect(page.getByText("using Flutter")).toBeVisible(); }); - test('should display work experience section', async ({ page }) => { + test("should display work experience section", async ({ page }) => { // Current position - await expect(page.getByText('Backend Developer at Allianz Technology Thailand')).toBeVisible(); - await expect(page.getByText('July 2022 - Present')).toBeVisible(); + await expect( + page.getByText("Backend Developer at Allianz Technology Thailand") + ).toBeVisible(); + await expect(page.getByText("July 2022 - Present")).toBeVisible(); // Skills tags verification for current position const expectedSkills = [ - 'Backend', 'Java', 'Spring Boot', 'Rest API', 'Kafka', - 'Unit Testing', 'Contract Testing', 'Playwright Testing', - 'Github Actions', 'Microservices', 'Agile', 'Typescript', - 'DevSecOps', 'Insurance' + "Backend", + "Java", + "Spring Boot", + "Rest API", + "Kafka", + "Unit Testing", + "Contract Testing", + "Playwright Testing", + "Github Actions", + "Microservices", + "Agile", + "Typescript", + "DevSecOps", + "Insurance", ]; for (const skill of expectedSkills) { @@ -70,10 +98,22 @@ test.describe('Portfolio Website Tests', () => { } // Previous positions verification - await expect(page.getByText('Fullstack Developer, Product Owner, Designer for Mobile and Web')).toBeVisible(); - await expect(page.getByText('Freelance Frontend Developer at IHRP')).toBeVisible(); - await expect(page.getByText('Fullstack Developer at Nanyan Platform Myanmar')).toBeVisible(); - await expect(page.getByText('Fullstack Developer at MBC Software Development Myanmar')).toBeVisible(); - await expect(page.getByText('Junior Java Developer at FPT Software Myanmar')).toBeVisible(); + await expect( + page.getByText( + "Fullstack Developer, Product Owner, Designer for Mobile and Web" + ) + ).toBeVisible(); + await expect( + page.getByText("Freelance Frontend Developer at IHRP") + ).toBeVisible(); + await expect( + page.getByText("Fullstack Developer at Nanyan Platform Myanmar") + ).toBeVisible(); + await expect( + page.getByText("Fullstack Developer at MBC Software Development Myanmar") + ).toBeVisible(); + await expect( + page.getByText("Junior Java Developer at FPT Software Myanmar") + ).toBeVisible(); }); -}); \ No newline at end of file +}); From 23796264ee4a45aeb707a9f67af7326a0ef5597b Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 22:46:30 +0700 Subject: [PATCH 03/12] fix: const to backendHeading --- tests/portfolio.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 83ae0fe..249a277 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -56,7 +56,8 @@ test.describe("Portfolio Website Tests", () => { await expect(page.getByText("To a Big Screen")).toBeVisible(); // Backend Development section - await expect(page.getByRole("heading", { name: "Backend" })).toBeVisible(); + const backendHeading = page.getByRole("heading", { name: "Backend" }); + await expect(backendHeading).toBeVisible(); await expect(page.getByText("Building and maintaining")).toBeVisible(); await expect(page.getByText("backend APIs, ranging from")).toBeVisible(); await expect(page.getByText("Public to Private")).toBeVisible(); From fca8dcacb1ba9c904b0d31640ab6dcabf7fe0471 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 23:26:25 +0700 Subject: [PATCH 04/12] refactor: test name in yml --- .github/workflows/playwright.yml | 38 +++++----- tests/portfolio.spec.ts | 126 +++++++++++++++---------------- 2 files changed, 82 insertions(+), 82 deletions(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 3eb1314..390d38e 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -1,27 +1,27 @@ name: Playwright Tests on: push: - branches: [ main, master ] + branches: [main, master] pull_request: - branches: [ main, master ] + branches: [main, master] jobs: - test: + playwright-tests: timeout-minutes: 60 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: lts/* - - name: Install dependencies - run: npm ci - - name: Install Playwright Browsers - run: npx playwright install --with-deps - - name: Run Playwright tests - run: npx playwright test - - uses: actions/upload-artifact@v4 - if: ${{ !cancelled() }} - with: - name: playwright-report - path: playwright-report/ - retention-days: 30 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 249a277..1e5a0b0 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -48,73 +48,73 @@ test.describe("Portfolio Website Tests", () => { ); }); - test("should display all skill sections", async ({ page }) => { - // Frontend Development section - await expect(page.getByRole("heading", { name: "Frontend" })).toBeVisible(); - await expect(page.getByText("Create Dynamic Apps")).toBeVisible(); - await expect(page.getByText("From your mobile")).toBeVisible(); - await expect(page.getByText("To a Big Screen")).toBeVisible(); + // test("should display all skill sections", async ({ page }) => { + // // Frontend Development section + // await expect(page.getByRole("heading", { name: "Frontend" })).toBeVisible(); + // await expect(page.getByText("Create Dynamic Apps")).toBeVisible(); + // await expect(page.getByText("From your mobile")).toBeVisible(); + // await expect(page.getByText("To a Big Screen")).toBeVisible(); - // Backend Development section - const backendHeading = page.getByRole("heading", { name: "Backend" }); - await expect(backendHeading).toBeVisible(); - await expect(page.getByText("Building and maintaining")).toBeVisible(); - await expect(page.getByText("backend APIs, ranging from")).toBeVisible(); - await expect(page.getByText("Public to Private")).toBeVisible(); + // // Backend Development section + // const backendHeading = page.getByRole("heading", { name: "Backend" }); + // await expect(backendHeading).toBeVisible(); + // await expect(page.getByText("Building and maintaining")).toBeVisible(); + // await expect(page.getByText("backend APIs, ranging from")).toBeVisible(); + // await expect(page.getByText("Public to Private")).toBeVisible(); - // Mobile Development section - await expect(page.getByRole("heading", { name: "Mobile" })).toBeVisible(); - await expect(page.getByText("Real-time mobile apps")).toBeVisible(); - await expect(page.getByText("delivering user experiences")).toBeVisible(); - await expect(page.getByText("using Flutter")).toBeVisible(); - }); + // // Mobile Development section + // await expect(page.getByRole("heading", { name: "Mobile" })).toBeVisible(); + // await expect(page.getByText("Real-time mobile apps")).toBeVisible(); + // await expect(page.getByText("delivering user experiences")).toBeVisible(); + // await expect(page.getByText("using Flutter")).toBeVisible(); + // }); - test("should display work experience section", async ({ page }) => { - // Current position - await expect( - page.getByText("Backend Developer at Allianz Technology Thailand") - ).toBeVisible(); - await expect(page.getByText("July 2022 - Present")).toBeVisible(); + // test("should display work experience section", async ({ page }) => { + // // Current position + // await expect( + // page.getByText("Backend Developer at Allianz Technology Thailand") + // ).toBeVisible(); + // await expect(page.getByText("July 2022 - Present")).toBeVisible(); - // Skills tags verification for current position - const expectedSkills = [ - "Backend", - "Java", - "Spring Boot", - "Rest API", - "Kafka", - "Unit Testing", - "Contract Testing", - "Playwright Testing", - "Github Actions", - "Microservices", - "Agile", - "Typescript", - "DevSecOps", - "Insurance", - ]; + // // Skills tags verification for current position + // const expectedSkills = [ + // "Backend", + // "Java", + // "Spring Boot", + // "Rest API", + // "Kafka", + // "Unit Testing", + // "Contract Testing", + // "Playwright Testing", + // "Github Actions", + // "Microservices", + // "Agile", + // "Typescript", + // "DevSecOps", + // "Insurance", + // ]; - for (const skill of expectedSkills) { - await expect(page.getByText(skill, { exact: true })).toBeVisible(); - } + // for (const skill of expectedSkills) { + // await expect(page.getByText(skill, { exact: true })).toBeVisible(); + // } - // Previous positions verification - await expect( - page.getByText( - "Fullstack Developer, Product Owner, Designer for Mobile and Web" - ) - ).toBeVisible(); - await expect( - page.getByText("Freelance Frontend Developer at IHRP") - ).toBeVisible(); - await expect( - page.getByText("Fullstack Developer at Nanyan Platform Myanmar") - ).toBeVisible(); - await expect( - page.getByText("Fullstack Developer at MBC Software Development Myanmar") - ).toBeVisible(); - await expect( - page.getByText("Junior Java Developer at FPT Software Myanmar") - ).toBeVisible(); - }); + // // Previous positions verification + // await expect( + // page.getByText( + // "Fullstack Developer, Product Owner, Designer for Mobile and Web" + // ) + // ).toBeVisible(); + // await expect( + // page.getByText("Freelance Frontend Developer at IHRP") + // ).toBeVisible(); + // await expect( + // page.getByText("Fullstack Developer at Nanyan Platform Myanmar") + // ).toBeVisible(); + // await expect( + // page.getByText("Fullstack Developer at MBC Software Development Myanmar") + // ).toBeVisible(); + // await expect( + // page.getByText("Junior Java Developer at FPT Software Myanmar") + // ).toBeVisible(); + // }); }); From 4bc980633f1826477697940381e5f4ad62e85702 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 23:34:11 +0700 Subject: [PATCH 05/12] feat: add first to solve rendering first --- tests/portfolio.spec.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 1e5a0b0..4ff74dd 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -23,29 +23,29 @@ test.describe("Portfolio Website Tests", () => { }); test("should have working social media links", async ({ page }) => { - const linkedinLink = page.getByRole("link", { name: /linkedin/i }); + const linkedinLink = page.getByRole("link", { name: /linkedin/i }).first(); await expect(linkedinLink).toHaveAttribute( "href", "https://www.linkedin.com/in/thet-myat-noe-14682b142/" ); - const twitterLink = page.getByRole("link", { name: /twitter/i }); - await expect(twitterLink).toHaveAttribute( - "href", - "https://twitter.com/ThetMyatNoe13" - ); + // const twitterLink = page.getByRole("link", { name: /twitter/i }); + // await expect(twitterLink).toHaveAttribute( + // "href", + // "https://twitter.com/ThetMyatNoe13" + // ); - const githubLink = page.getByRole("link", { name: /github/i }); - await expect(githubLink).toHaveAttribute( - "href", - "https://github.com/MrMyatNoe" - ); + // const githubLink = page.getByRole("link", { name: /github/i }); + // await expect(githubLink).toHaveAttribute( + // "href", + // "https://github.com/MrMyatNoe" + // ); - const facebookLink = page.getByRole("link", { name: /facebook/i }); - await expect(facebookLink).toHaveAttribute( - "href", - "https://www.facebook.com/thet.myatnoe.988" - ); + // const facebookLink = page.getByRole("link", { name: /facebook/i }); + // await expect(facebookLink).toHaveAttribute( + // "href", + // "https://www.facebook.com/thet.myatnoe.988" + // ); }); // test("should display all skill sections", async ({ page }) => { From f6e7b124a9439a463507252d7c5109853dd620dd Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 23:37:56 +0700 Subject: [PATCH 06/12] feat: add twitter --- tests/portfolio.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 4ff74dd..29b009a 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -29,11 +29,11 @@ test.describe("Portfolio Website Tests", () => { "https://www.linkedin.com/in/thet-myat-noe-14682b142/" ); - // const twitterLink = page.getByRole("link", { name: /twitter/i }); - // await expect(twitterLink).toHaveAttribute( - // "href", - // "https://twitter.com/ThetMyatNoe13" - // ); + const twitterLink = page.getByRole("link", { name: /twitter/i }); + await expect(twitterLink).toHaveAttribute( + "href", + "https://twitter.com/ThetMyatNoe13" + ); // const githubLink = page.getByRole("link", { name: /github/i }); // await expect(githubLink).toHaveAttribute( From c66709d34223af327729b660e20eeb5afaf95cfc Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 23:43:40 +0700 Subject: [PATCH 07/12] test: add first in github and facebook --- tests/portfolio.spec.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 29b009a..6f78af3 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -29,23 +29,23 @@ test.describe("Portfolio Website Tests", () => { "https://www.linkedin.com/in/thet-myat-noe-14682b142/" ); - const twitterLink = page.getByRole("link", { name: /twitter/i }); + const twitterLink = page.getByRole("link", { name: /twitter/i }).first(); await expect(twitterLink).toHaveAttribute( "href", "https://twitter.com/ThetMyatNoe13" ); - // const githubLink = page.getByRole("link", { name: /github/i }); - // await expect(githubLink).toHaveAttribute( - // "href", - // "https://github.com/MrMyatNoe" - // ); + const githubLink = page.getByRole("link", { name: /github/i }).first(); + await expect(githubLink).toHaveAttribute( + "href", + "https://github.com/MrMyatNoe" + ); - // const facebookLink = page.getByRole("link", { name: /facebook/i }); - // await expect(facebookLink).toHaveAttribute( - // "href", - // "https://www.facebook.com/thet.myatnoe.988" - // ); + const facebookLink = page.getByRole("link", { name: /facebook/i }).first(); + await expect(facebookLink).toHaveAttribute( + "href", + "https://www.facebook.com/thet.myatnoe.988" + ); }); // test("should display all skill sections", async ({ page }) => { From cb2eab03141d93e737bde53830a5ebe94cc735c7 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 23:46:42 +0700 Subject: [PATCH 08/12] feat: skill sections --- tests/portfolio.spec.ts | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 6f78af3..ac70c63 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -48,26 +48,27 @@ test.describe("Portfolio Website Tests", () => { ); }); - // test("should display all skill sections", async ({ page }) => { - // // Frontend Development section - // await expect(page.getByRole("heading", { name: "Frontend" })).toBeVisible(); - // await expect(page.getByText("Create Dynamic Apps")).toBeVisible(); - // await expect(page.getByText("From your mobile")).toBeVisible(); - // await expect(page.getByText("To a Big Screen")).toBeVisible(); + test("should display all skill sections", async ({ page }) => { + // Frontend Development section + await expect(page.getByRole("heading", { name: "Frontend" })).toBeVisible(); + await expect(page.getByText("Create Dynamic Apps")).toBeVisible(); + await expect(page.getByText("From your mobile")).toBeVisible(); + await expect(page.getByText("To a Big Screen")).toBeVisible(); - // // Backend Development section - // const backendHeading = page.getByRole("heading", { name: "Backend" }); - // await expect(backendHeading).toBeVisible(); - // await expect(page.getByText("Building and maintaining")).toBeVisible(); - // await expect(page.getByText("backend APIs, ranging from")).toBeVisible(); - // await expect(page.getByText("Public to Private")).toBeVisible(); + // Backend Development section + await expect( + page.getByRole("heading", { name: "Backend" }).first() + ).toBeVisible(); + await expect(page.getByText("Building and maintaining")).toBeVisible(); + await expect(page.getByText("backend APIs, ranging from")).toBeVisible(); + await expect(page.getByText("Public to Private")).toBeVisible(); - // // Mobile Development section - // await expect(page.getByRole("heading", { name: "Mobile" })).toBeVisible(); - // await expect(page.getByText("Real-time mobile apps")).toBeVisible(); - // await expect(page.getByText("delivering user experiences")).toBeVisible(); - // await expect(page.getByText("using Flutter")).toBeVisible(); - // }); + // Mobile Development section + await expect(page.getByRole("heading", { name: "Mobile" })).toBeVisible(); + await expect(page.getByText("Real-time mobile apps")).toBeVisible(); + await expect(page.getByText("delivering user experiences")).toBeVisible(); + await expect(page.getByText("using Flutter")).toBeVisible(); + }); // test("should display work experience section", async ({ page }) => { // // Current position From 2d2479f9ea89374ed4458927caf9cfc098a723c5 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 23:51:26 +0700 Subject: [PATCH 09/12] feat: current experience --- tests/portfolio.spec.ts | 90 ++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index ac70c63..a7e30ec 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -70,52 +70,52 @@ test.describe("Portfolio Website Tests", () => { await expect(page.getByText("using Flutter")).toBeVisible(); }); - // test("should display work experience section", async ({ page }) => { - // // Current position - // await expect( - // page.getByText("Backend Developer at Allianz Technology Thailand") - // ).toBeVisible(); - // await expect(page.getByText("July 2022 - Present")).toBeVisible(); + test("should display work experience section", async ({ page }) => { + // Current position + await expect( + page.getByText("Backend Developer at Allianz Technology Thailand") + ).toBeVisible(); + await expect(page.getByText("July 2022 - Present")).toBeVisible(); - // // Skills tags verification for current position - // const expectedSkills = [ - // "Backend", - // "Java", - // "Spring Boot", - // "Rest API", - // "Kafka", - // "Unit Testing", - // "Contract Testing", - // "Playwright Testing", - // "Github Actions", - // "Microservices", - // "Agile", - // "Typescript", - // "DevSecOps", - // "Insurance", - // ]; + // Skills tags verification for current position + const expectedSkills = [ + "Backend", + "Java", + "Spring Boot", + "Rest API", + "Kafka", + "Unit Testing", + "Contract Testing", + "Playwright Testing", + "Github Actions", + "Microservices", + "Agile", + "Typescript", + "DevSecOps", + "Insurance", + ]; - // for (const skill of expectedSkills) { - // await expect(page.getByText(skill, { exact: true })).toBeVisible(); - // } + for (const skill of expectedSkills) { + await expect(page.getByText(skill, { exact: true })).toBeVisible(); + } - // // Previous positions verification - // await expect( - // page.getByText( - // "Fullstack Developer, Product Owner, Designer for Mobile and Web" - // ) - // ).toBeVisible(); - // await expect( - // page.getByText("Freelance Frontend Developer at IHRP") - // ).toBeVisible(); - // await expect( - // page.getByText("Fullstack Developer at Nanyan Platform Myanmar") - // ).toBeVisible(); - // await expect( - // page.getByText("Fullstack Developer at MBC Software Development Myanmar") - // ).toBeVisible(); - // await expect( - // page.getByText("Junior Java Developer at FPT Software Myanmar") - // ).toBeVisible(); - // }); + // Previous positions verification + // await expect( + // page.getByText( + // "Fullstack Developer, Product Owner, Designer for Mobile and Web" + // ) + // ).toBeVisible(); + // await expect( + // page.getByText("Freelance Frontend Developer at IHRP") + // ).toBeVisible(); + // await expect( + // page.getByText("Fullstack Developer at Nanyan Platform Myanmar") + // ).toBeVisible(); + // await expect( + // page.getByText("Fullstack Developer at MBC Software Development Myanmar") + // ).toBeVisible(); + // await expect( + // page.getByText("Junior Java Developer at FPT Software Myanmar") + // ).toBeVisible(); + }); }); From 4775ee10cc163a2286a37c74aee27d4d778da775 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Mon, 29 Sep 2025 23:57:52 +0700 Subject: [PATCH 10/12] fix: add badge instead of text --- tests/portfolio.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index a7e30ec..1894935 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -96,7 +96,9 @@ test.describe("Portfolio Website Tests", () => { ]; for (const skill of expectedSkills) { - await expect(page.getByText(skill, { exact: true })).toBeVisible(); + await expect( + page.locator("span.chakra-badge").filter({ hasText: skill }) + ).toBeVisible(); } // Previous positions verification From dfdedc3ba689ef8eab285eab34b52232d55f03f9 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Tue, 30 Sep 2025 00:06:18 +0700 Subject: [PATCH 11/12] feat: add first in current position --- tests/portfolio.spec.ts | 46 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 1894935..9fe4b62 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "@playwright/test"; +import { expect, test } from '@playwright/test'; test.describe("Portfolio Website Tests", () => { test.beforeEach(async ({ page }) => { @@ -95,29 +95,35 @@ test.describe("Portfolio Website Tests", () => { "Insurance", ]; + const currentPositionSection = page + .getByText("Backend Developer at Allianz Technology Thailand") + .locator(".."); for (const skill of expectedSkills) { await expect( - page.locator("span.chakra-badge").filter({ hasText: skill }) + currentPositionSection + .locator("span.chakra-badge") + .filter({ hasText: skill }) + .first() ).toBeVisible(); } - // Previous positions verification - // await expect( - // page.getByText( - // "Fullstack Developer, Product Owner, Designer for Mobile and Web" - // ) - // ).toBeVisible(); - // await expect( - // page.getByText("Freelance Frontend Developer at IHRP") - // ).toBeVisible(); - // await expect( - // page.getByText("Fullstack Developer at Nanyan Platform Myanmar") - // ).toBeVisible(); - // await expect( - // page.getByText("Fullstack Developer at MBC Software Development Myanmar") - // ).toBeVisible(); - // await expect( - // page.getByText("Junior Java Developer at FPT Software Myanmar") - // ).toBeVisible(); + Previous positions verification + await expect( + page.getByText( + "Fullstack Developer, Product Owner, Designer for Mobile and Web" + ) + ).toBeVisible(); + await expect( + page.getByText("Freelance Frontend Developer at IHRP") + ).toBeVisible(); + await expect( + page.getByText("Fullstack Developer at Nanyan Platform Myanmar") + ).toBeVisible(); + await expect( + page.getByText("Fullstack Developer at MBC Software Development Myanmar") + ).toBeVisible(); + await expect( + page.getByText("Junior Java Developer at FPT Software Myanmar") + ).toBeVisible(); }); }); From 37a9eba3f32b9beb8a1b23e424f7f875fe96d2a0 Mon Sep 17 00:00:00 2001 From: MrMyatNoe Date: Tue, 30 Sep 2025 00:06:50 +0700 Subject: [PATCH 12/12] fix: remove unused line --- tests/portfolio.spec.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/portfolio.spec.ts b/tests/portfolio.spec.ts index 9fe4b62..effc4f2 100644 --- a/tests/portfolio.spec.ts +++ b/tests/portfolio.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from "@playwright/test"; test.describe("Portfolio Website Tests", () => { test.beforeEach(async ({ page }) => { @@ -107,7 +107,6 @@ test.describe("Portfolio Website Tests", () => { ).toBeVisible(); } - Previous positions verification await expect( page.getByText( "Fullstack Developer, Product Owner, Designer for Mobile and Web"