diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 402eeb701..e61e63f34 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -9,7 +9,7 @@ on: - 'v*' env: - DOCKER_REPO_NAME: kaw393939/mywebclass + DOCKER_REPO_NAME: tawanaarthur/project1 jobs: build: diff --git a/Team_Productivity_Log.md b/Team_Productivity_Log.md new file mode 100644 index 000000000..fc3abad51 --- /dev/null +++ b/Team_Productivity_Log.md @@ -0,0 +1,16 @@ +# Team Productivity Log + +This table tracks the progress of tasks in our project, including the issue title, story points, issue link, status, assigned to and assigned on, completed on, category, and status notes. + +| Issue title | Story points | Issue link | Status | Assigned to, Assigned on | Completed on | Category | Status notes | +|------------------------------------------|--------------|-----------------------------------------------------------------------|-------------|--------------------------|--------------|---------------|----------------------------------------------------------| +| Team Productivity Log | 1 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/11) | Completed | Rajiv, 2022-03-16 | 2022-03-16 | Documentation | Completed documenting Marked Down File | +| Internationalization Research | 2 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/3) | In Progress | Rajiv, 2022-03-15 | - | Research | Drafted initial version on Internationalization Research | +| Home Page | 5 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/2) | In Progress | Rajiv, 2022-03-14 | - | Enhancement | Initial analysis in progress | +| Front End Responsive Frameworks Research | 3 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/13) | To do | Rajiv, 2022-03-16 | - | Research | | +| Accessibility Research | 2 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/4) | Completed | Berta, 2022-03-14 | 2022-03-15 | Research | Drafted initial version on Accessibility Research | +| Legal compliance Research | 2 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/6) | Completed | Berta, 2022-03-14 | 2022-03-15 | Research | Drafted initial version for legal compliance and privacy policy Research | +| SEO research | 2 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/5) | Completed | Tawana, 2022-03-14 | 2022-03-15 | Research | Researched and draft SEO Research - found in Wiki | +|Playwright Tests Research | 3 | [Link](https://github.com/tawana0518/mywebclass-simulation/issues/12) | In progress | Tawana, 2022-03-17 | - | Research | Continuing research on playwright testing and lighthouse reports | +To add a new task to the table, a team member should create an issue on GitHub and add the link to the table with the relevant details. By keeping track of our progress in this table, we can ensure that tasks are assigned and completed efficiently and effectively. + diff --git a/docker-compose.yml b/docker-compose.yml index 80050ddea..f8bc5479d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: "3.8" services: master_branch: development_branch: - image: kaw393939/mywebclass:development + image: tawanaarthur/project1:development container_name: development_branch pull_policy: always restart: always diff --git a/package-lock.json b/package-lock.json index ff94ff7f0..daec82f8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mywebclass.org", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mywebclass.org", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "@popperjs/core": "^2.11.6" diff --git a/package.json b/package.json index 9a0bbb78d..fd7eb9d2b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mywebclass.org", - "version": "0.1.0", + "version": "0.1.1", "description": "Help for students and teachers learning advanced technologies.", "main": "src/index.js", "directories": { @@ -25,14 +25,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/NJIT-WIS/mywebclass.git" + "url": "git+https://github.com/tawana0518/mywebclass-simulation.git" }, "author": "Keith Williams @ NJIT.EDU", "license": "MIT", "bugs": { - "url": "https://github.com/NJIT-WIS/mywebclass/issues" + "url": "https://github.com/tawana0518/mywebclass-simulation/issues" }, - "homepage": "https://github.com/NJIT-WIS/mywebclass#readme", + "homepage": "https://github.com/tawana0518/mywebclass-simulation#readme", "devDependencies": { "@playwright/test": "^1.31.1", "autoprefixer": "^10.4.13", diff --git a/readme.md b/readme.md index b85863e93..a69e96886 100644 --- a/readme.md +++ b/readme.md @@ -63,3 +63,4 @@ Finally, use Playwright to create powerful and reliable automated tests for web # ADD YOUR PROJECT LINKS BELOW THIS +[Github Pages Live Site Deployment](https://tawana0518.github.io/mywebclass-simulation/) diff --git a/src/index.html b/src/index.html index ad76fc58c..b069be521 100644 --- a/src/index.html +++ b/src/index.html @@ -1,4 +1,5 @@ + diff --git a/src/js/main.js b/src/js/main.js index 1558c49d5..c7fe348c5 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -8,6 +8,8 @@ import allPage from './allPages' import contentPage from './contentPage' document.addEventListener('DOMContentLoaded', () => { + // @Rajiv 19th March - Call the setLanguage() function when the DOM content is loaded + setLanguage() allPage.initialize() contentPage.initialize() }) @@ -109,3 +111,15 @@ document.addEventListener('DOMContentLoaded', () => { createPrivacyModal() loadGoogleAnalytics() }) + +// @Rajiv 19th March - Create a JavaScript function in the main.js file to set the language attribute dynamically based on the user's language preference: +function setLanguage () { + // Get the user's preferred language + const userLang = navigator.language || navigator.userLanguage + + // Check if the user's language is supported (in this example, we're checking for English) + const supportedLang = userLang.substring(0, 2).toLowerCase() === 'en' ? 'en' : 'en' + + // Set the 'lang' attribute of the 'html' tag to the supported language + document.documentElement.setAttribute('lang', supportedLang) +} diff --git a/src/privacy.html b/src/privacy.html index 9337f1b6c..784ac182a 100644 --- a/src/privacy.html +++ b/src/privacy.html @@ -4,7 +4,7 @@ - MyWebClass.org | Our Story + MyWebClass.org | Privacy Policy @@ -72,22 +72,19 @@

Navigation

Privacy Policy

By Author Name Last Updated: - January 1, 2022 0 + March 19, 2023 0

Privacy Policy

-

We at mywebclass.org are committed to protecting your privacy. This Privacy Policy explains what - information we collect from you when you visit our website, how we use it, and how we protect - it. By using our website, you agree to the terms of this Privacy Policy.

+

We at MyWebClass are committed to protecting your privacy. This privacy policy explains how we + collect, use, and protect your personal information when you use our website.

Information we collect

-

We may collect the following information from you when you visit our website:

+

We may collect personal information from you when you visit our website, such as:

diff --git a/src/scss/styles.scss b/src/scss/styles.scss index 309c1d9d5..259321c3e 100644 --- a/src/scss/styles.scss +++ b/src/scss/styles.scss @@ -26,4 +26,6 @@ body.banner-offset { } } + + \ No newline at end of file diff --git a/tests/bootstrap.spec.js b/tests/bootstrap.spec.js new file mode 100644 index 000000000..613c5e7b6 --- /dev/null +++ b/tests/bootstrap.spec.js @@ -0,0 +1,32 @@ +const { test, expect } = require('@playwright/test') + +test.describe('MyWebClass.org Bootstrap implementation', () => { + test.beforeEach(async ({ page }) => { + await page.goto('https://mywebclass.org') + }) + + // test('should have a responsive navigation bar', async ({ page }) => { + // const navbar = await page.waitForSelector('.navbar', { state: 'visible', timeout: 10000 }) + // expect(navbar).toBeTruthy() + // + // await page.setViewportSize({ width: 320, height: 480 }) // Simulate a mobile device + // + // const navbarToggler = await page.waitForSelector('.navbar-toggler', { state: 'visible', timeout: 10000 }) + // expect(navbarToggler).toBeTruthy() + // + // const isNavbarCollapsed = await navbarToggler.evaluate(toggler => toggler.getAttribute('aria-expanded') === 'false') + // expect(isNavbarCollapsed).toBeTruthy() + // + // await navbarToggler.click() + // const isNavbarExpanded = await navbarToggler.evaluate(toggler => toggler.getAttribute('aria-expanded') === 'true') + // expect(isNavbarExpanded).toBeTruthy() + // }) + + test('should have a footer with py-5 class for padding', async ({ page }) => { + const footer = await page.waitForSelector('footer', { state: 'visible', timeout: 10000 }) + expect(footer).toBeTruthy() + + const footerPadding = await footer.evaluate(footerElement => footerElement.classList.contains('py-5')) + expect(footerPadding).toBeTruthy() + }) +}) diff --git a/tests/mywebclass_internationalization.spec.js b/tests/mywebclass_internationalization.spec.js new file mode 100644 index 000000000..8d7389866 --- /dev/null +++ b/tests/mywebclass_internationalization.spec.js @@ -0,0 +1,26 @@ +import { test, expect } from '@playwright/test' + +test.describe('MyWebClass.org internationalization', () => { + let page + + test.beforeEach(async ({ browser }) => { + page = await browser.newPage() + await page.goto('http://localhost:3000') + }) + + test.afterEach(async () => { + await page.close() + }) + + test('should display the site in "en" when the "Accept-Language" header is set to "en"', async () => { + // Set the Accept-Language header and navigate to the website + await page.setExtraHTTPHeaders({ 'Accept-Language': 'en' }) + await page.goto('http://localhost:3000') + + // Check if the lang attribute of the HTML tag is set to "en" + const langAttribute = await page.getAttribute('html', 'lang') + expect(langAttribute).toBe('en', 'The lang attribute of the HTML tag is not set to "en".') + + // Perform any additional checks for the "en" language version of the website here, e.g., checking specific text or elements + }) +}) diff --git a/tests/mywebclass_privacy.spec.js b/tests/mywebclass_privacy.spec.js new file mode 100644 index 000000000..36b3676fd --- /dev/null +++ b/tests/mywebclass_privacy.spec.js @@ -0,0 +1,21 @@ +/* global localStorage */ +import { test, expect } from '@playwright/test' + +test('test', async ({ page }) => { + await page.goto('http://localhost:3000/') + await page.getByRole('button', { name: 'Agree', exact: true }).click() + + // Retrieve the privacyPolicyAgreed item from local storage + const privacyPolicyAgreed = await page.evaluate(() => { + return localStorage.getItem('privacyPolicyAgreed') + }) + + // Check if privacyPolicyAgreed is set in local storage + expect(privacyPolicyAgreed).toBeTruthy() + + // Click the "Content Template" link + await page.getByRole('link', { name: 'Content Template' }).click() + + // Click the "Section 3" link + await page.getByRole('link', { name: 'Section 3' }).click() +}) diff --git a/tests/mywebclass_seo.spec.js b/tests/mywebclass_seo.spec.js new file mode 100644 index 000000000..f877ee30b --- /dev/null +++ b/tests/mywebclass_seo.spec.js @@ -0,0 +1,27 @@ +import { test, expect } from '@playwright/test' + +test.describe('MyWebClass.org tests', () => { + test('SEO tests', async ({ page }) => { + await page.goto('http://localhost:3000/') + // Test for keyword research + const keywords = ['MyWebClass.org'] + const pageContent = await page.textContent('body') + const hasKeywords = keywords.every(keyword => pageContent.includes(keyword)) + expect(hasKeywords).toBeTruthy() + // Test for meta tags + const pageTitle = await page.title() + const pageMetaDescription = await page.$eval('meta[name="description"]', el => el.content) + const pageMetaKeywords = await page.$eval('meta[name="keywords"]', el => el.content) + const hasMetaTags = Boolean(pageTitle && pageMetaDescription && pageMetaKeywords) + expect(hasMetaTags).toBeTruthy() + // Test for URL structure + const pageUrl = page.url() + const pageUrlPathname = new URL(pageUrl).pathname + const hasProperUrlStructure = Boolean(pageUrl && !pageUrl.includes('%20') && pageUrlPathname === '/') + expect(hasProperUrlStructure).toBeTruthy() + // Test for fast load times + const pageLoadTime = await page.evaluate(() => window.performance.timing.domContentLoadedEventEnd - window.performance.timing.navigationStart) + const isFastLoading = pageLoadTime <= 5000 + expect(isFastLoading).toBeTruthy() + }) +})