From 2713f57c255a93dcef342ddede2fffec874a7f45 Mon Sep 17 00:00:00 2001 From: Ajo George <97509993+ajogseneca@users.noreply.github.com> Date: Tue, 19 Nov 2024 16:21:04 -0500 Subject: [PATCH 1/4] Fix added for issue #154 --- _layouts/blog-post.html | 67 +++++++++++++++++++++++++++++++ _posts/2024-10-14-blog_2.markdown | 2 +- _posts/2024-10-15-blog_3.markdown | 2 +- _posts/2024-10-16-blog_1.markdown | 2 +- 4 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 _layouts/blog-post.html diff --git a/_layouts/blog-post.html b/_layouts/blog-post.html new file mode 100644 index 0000000..4f07ed6 --- /dev/null +++ b/_layouts/blog-post.html @@ -0,0 +1,67 @@ + + + + {% include header.html %} + + + + {% include nav.html %} +
+

{{ page.title }}

+

Published on {{ page.date | date: "%B %d, %Y" }} · Reading Time: {{ page.reading_time }} minutes

+
+
+
+
+ {% if page.image %} + Blog Image + {% endif %} +
+
+

{{ content }}

+
+
+
+ {% include footer.html %} + + + \ No newline at end of file diff --git a/_posts/2024-10-14-blog_2.markdown b/_posts/2024-10-14-blog_2.markdown index bab770e..aabca16 100644 --- a/_posts/2024-10-14-blog_2.markdown +++ b/_posts/2024-10-14-blog_2.markdown @@ -1,5 +1,5 @@ --- -layout: default +layout: blog-post title: "The Future of Remote Work Technology" date: 2024-10-14 image: ../assets/images/blog/blog2.png diff --git a/_posts/2024-10-15-blog_3.markdown b/_posts/2024-10-15-blog_3.markdown index 4820383..888b976 100644 --- a/_posts/2024-10-15-blog_3.markdown +++ b/_posts/2024-10-15-blog_3.markdown @@ -1,5 +1,5 @@ --- -layout: default +layout: blog-post title: "The Importance of Cybersecurity in the Digital Age" date: 2024-10-15 image: ../assets/images/blog/blog1.png diff --git a/_posts/2024-10-16-blog_1.markdown b/_posts/2024-10-16-blog_1.markdown index 9be2486..b02da54 100644 --- a/_posts/2024-10-16-blog_1.markdown +++ b/_posts/2024-10-16-blog_1.markdown @@ -1,5 +1,5 @@ --- -layout: default +layout: blog-post title: "The Rise of AI in Everyday Life" date: 2024-10-16 image: ../assets/images/blog/blog3.png From d506429df9fa46f922382f6ea21de8504c882269 Mon Sep 17 00:00:00 2001 From: Ajo George <97509993+ajogseneca@users.noreply.github.com> Date: Wed, 20 Nov 2024 03:05:09 -0500 Subject: [PATCH 2/4] Added solution for issue #155 --- _includes/nav.html | 15 +++ _layouts/create-blog.html | 250 ++++++++++++++++++++++++++++++++++++++ create-blog.markdown | 6 + 3 files changed, 271 insertions(+) create mode 100644 _layouts/create-blog.html create mode 100644 create-blog.markdown diff --git a/_includes/nav.html b/_includes/nav.html index 975df6a..39c90d2 100644 --- a/_includes/nav.html +++ b/_includes/nav.html @@ -158,6 +158,14 @@ >Blog +
  • + Create Blog Post +
  • Blog +
  • + Create Blog Post +
  • + + + {% include header.html %} + + + + {% include nav.html %} + +
    +
    +
    +
    + Create a new blog +
    +
    +
    + + +
    +
    + + +
    +
    + + + Preview + +
    +
    + +
    +
    + + +
    +

    Blog Title Preview

    +

    Your blog content will appear here...

    + +
    +
    +
    +
    + + + + {% include footer.html %} + + diff --git a/create-blog.markdown b/create-blog.markdown new file mode 100644 index 0000000..5cf5b0a --- /dev/null +++ b/create-blog.markdown @@ -0,0 +1,6 @@ +--- +layout: create-blog +title: Create Blog Post +permalink: /create-blog +--- + From 94f962ff265836af53e4d147953b918a4f2798b4 Mon Sep 17 00:00:00 2001 From: Ajo George <97509993+ajogseneca@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:36:54 -0500 Subject: [PATCH 3/4] Added test case, with python --- .gitignore | 2 + _layouts/create-blog.html | 450 +++++++++++++++++++------------------- _test/test-image.jpg | Bin 0 -> 26065 bytes _test/test_blog_form.py | 144 ++++++++++++ 4 files changed, 365 insertions(+), 231 deletions(-) create mode 100644 _test/test-image.jpg create mode 100644 _test/test_blog_form.py diff --git a/.gitignore b/.gitignore index da04610..45a7e06 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ _site vendor .DS_Store .vercel +__pycache__/ +*.pyc \ No newline at end of file diff --git a/_layouts/create-blog.html b/_layouts/create-blog.html index 13cac67..16d8dbb 100644 --- a/_layouts/create-blog.html +++ b/_layouts/create-blog.html @@ -1,250 +1,238 @@ - - {% include header.html %} - - - - {% include nav.html %} - -
    -
    -
    -
    - Create a new blog -
    -
    -
    - - -
    -
    - - -
    -
    - - - Preview - -
    -
    - -
    -
    - -
    -

    Blog Title Preview

    -

    Your blog content will appear here...

    - + /* Centered Layout Styling */ + @media (max-width: 768px) { + .container { + padding: 1rem; + } + + .card-header { + font-size: 1.5rem; + } + + .form-group input, + .form-group textarea { + font-size: 0.875rem; + } + + .preview-btn { + font-size: 0.875rem; + padding: 0.5rem 1rem; + } + + .remove-image-btn { + font-size: 0.875rem; + padding: 0.5rem 1rem; + } + } + + + {% include nav.html %}
    +
    +
    +
    Create a new blog
    +
    +
    + + +
    +
    + + +
    +
    + + + Preview + +
    +
    + +
    +
    + +
    +

    Blog Title Preview

    +

    Your blog content will appear here...

    + +
    -
    - - - - {% include footer.html %} - - + {% include footer.html %} + + \ No newline at end of file diff --git a/_test/test-image.jpg b/_test/test-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce49ad50d1b572ba282f10cee8d4e40879466d3e GIT binary patch literal 26065 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 literal 0 HcmV?d00001 diff --git a/_test/test_blog_form.py b/_test/test_blog_form.py new file mode 100644 index 0000000..3f40ddd --- /dev/null +++ b/_test/test_blog_form.py @@ -0,0 +1,144 @@ +import os +import pytest +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + +# Base URL for the application +BASE_URL = "http://localhost:4000" + +@pytest.fixture(scope="function") +def driver(): + """ + Fixture to initialize and quit the WebDriver. + """ + driver = webdriver.Chrome() # Ensure chromedriver is in PATH + driver.implicitly_wait(10) + yield driver + driver.quit() + + +def test_title_input_updates_preview(driver): + driver.get(f"{BASE_URL}/create-blog") + + # Locate and toggle the preview section + preview_btn = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.ID, "preview-btn")) + ) + preview_btn.click() # Ensure the preview section is visible + blog_preview = driver.find_element(By.CLASS_NAME, "blog-preview") + + # Wait for the preview section to be visible + WebDriverWait(driver, 5).until( + lambda d: blog_preview.is_displayed(), + message="Blog preview section did not show after clicking preview button" + ) + + # Locate title input and preview elements + title_input = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.ID, "title")) + ) + preview_title = driver.find_element(By.ID, "preview-title") + + # Test data + test_title = "Test Blog Title" + + # Enter title, clear input first, and validate the preview updates + title_input.clear() # Clear the existing text if any + title_input.send_keys(test_title) + + # Wait for the preview to update with the new title + WebDriverWait(driver, 5).until( + lambda d: preview_title.text == test_title, + message=f"Title preview did not update correctly. Expected: '{test_title}', but got: '{preview_title.text}'" + ) + + # Assertion to confirm title preview is updated + assert preview_title.text == test_title, f"Expected '{test_title}', but got '{preview_title.text}'" + + + + +def test_content_input_updates_preview(driver): + driver.get(f"{BASE_URL}/create-blog") + + # Locate and toggle the preview section + preview_btn = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.ID, "preview-btn")) + ) + preview_btn.click() # Ensure the preview section is visible + blog_preview = driver.find_element(By.CLASS_NAME, "blog-preview") + WebDriverWait(driver, 5).until( + lambda d: blog_preview.is_displayed(), + message="Blog preview section did not show after clicking preview button" + ) + + # Locate content input and preview elements + content_input = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.ID, "content")) + ) + preview_content = driver.find_element(By.ID, "preview-content") + + # Test data + test_content = "This is a test blog content." + + # Clear the input field, enter content, and validate the preview updates + content_input.clear() + content_input.send_keys(test_content) + + # Wait for the preview content to update + WebDriverWait(driver, 5).until( + lambda d: preview_content.text == test_content, + message="Content preview did not update correctly" + ) + + # Assertion to check if the content preview updates correctly + assert preview_content.text == test_content, f"Expected '{test_content}', but got '{preview_content.text}'" + + +def test_image_upload_and_preview(driver): + driver.get(f"{BASE_URL}/create-blog") + + # Locate image input and preview elements + image_input = driver.find_element(By.ID, "image") + image_preview = driver.find_element(By.ID, "image-preview") + + # Test image path + image_path = os.path.abspath("_test/test-image.jpg") # Replace with actual path + if not os.path.exists(image_path): + raise FileNotFoundError(f"Test image not found at {image_path}") + + # Upload image and validate the preview + image_input.send_keys(image_path) + WebDriverWait(driver, 5).until( + lambda d: image_preview.is_displayed(), + message="Image preview did not appear after upload" + ) + assert image_preview.is_displayed(), "Image preview did not appear after upload" + + +def test_preview_toggle(driver): + driver.get(f"{BASE_URL}/create-blog") + + # Locate preview button and blog preview section + preview_btn = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.ID, "preview-btn")) + ) + blog_preview = driver.find_element(By.CLASS_NAME, "blog-preview") + + # Toggle preview section + preview_btn.click() + WebDriverWait(driver, 5).until( + lambda d: blog_preview.is_displayed(), + message="Blog preview section did not show after clicking preview button" + ) + assert blog_preview.is_displayed(), "Blog preview section did not show after clicking preview button" + + # Hide preview section and verify + preview_btn.click() + WebDriverWait(driver, 5).until( + lambda d: not blog_preview.is_displayed(), + message="Blog preview section did not hide after clicking preview button again" + ) + assert not blog_preview.is_displayed(), "Blog preview section did not hide after clicking preview button again" From 934f6875cba84a434370d41140d7854b7fc27f2c Mon Sep 17 00:00:00 2001 From: Ajo George <97509993+ajogseneca@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:54:45 -0500 Subject: [PATCH 4/4] Added fixes for reviews and added google form and test --- _layouts/blog-post.html | 6 +- _layouts/create-blog.html | 197 ++++---------------------------------- _test/test-image.jpg | Bin 26065 -> 0 bytes _test/test_blog_form.py | 168 ++++++++------------------------ 4 files changed, 61 insertions(+), 310 deletions(-) delete mode 100644 _test/test-image.jpg diff --git a/_layouts/blog-post.html b/_layouts/blog-post.html index 4f07ed6..1faa3fc 100644 --- a/_layouts/blog-post.html +++ b/_layouts/blog-post.html @@ -22,11 +22,11 @@ /* Blog card styles */ .blog-card { background-color: rgb(255, 255, 255); - border: 2px solid #000000; + border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 1.5rem; - max-width: 800px; + width: 80%; margin: 2rem auto; } .blog-card img { @@ -64,4 +64,4 @@

    {{ page.title }}

    {% include footer.html %} - \ No newline at end of file + diff --git a/_layouts/create-blog.html b/_layouts/create-blog.html index 16d8dbb..5753a94 100644 --- a/_layouts/create-blog.html +++ b/_layouts/create-blog.html @@ -1,6 +1,8 @@ - {% include header.html %} - {% include nav.html %}
    + + {% include nav.html %} +
    -
    Create a new blog
    -
    -
    - - -
    -
    - - -
    -
    - - - Preview - -
    -
    - -
    -
    - -
    -

    Blog Title Preview

    -

    Your blog content will appear here...

    - -
    +
    Form
    + +
    - {% include footer.html %} + {% include footer.html %} - \ No newline at end of file + diff --git a/_test/test-image.jpg b/_test/test-image.jpg deleted file mode 100644 index ce49ad50d1b572ba282f10cee8d4e40879466d3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26065 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 diff --git a/_test/test_blog_form.py b/_test/test_blog_form.py index 3f40ddd..05ac936 100644 --- a/_test/test_blog_form.py +++ b/_test/test_blog_form.py @@ -1,144 +1,58 @@ -import os -import pytest +import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC -# Base URL for the application -BASE_URL = "http://localhost:4000" -@pytest.fixture(scope="function") -def driver(): - """ - Fixture to initialize and quit the WebDriver. - """ - driver = webdriver.Chrome() # Ensure chromedriver is in PATH - driver.implicitly_wait(10) - yield driver - driver.quit() +class TestGoogleForm(unittest.TestCase): + def setUp(self): + """Set up the WebDriver.""" + self.driver = webdriver.Chrome() # Ensure ChromeDriver is installed and in PATH + self.driver.maximize_window() + def test_fill_google_form(self): + """Test case for filling out the Google Form.""" + driver = self.driver -def test_title_input_updates_preview(driver): - driver.get(f"{BASE_URL}/create-blog") + + driver.get("http://localhost:4000/create-blog") - # Locate and toggle the preview section - preview_btn = WebDriverWait(driver, 10).until( - EC.element_to_be_clickable((By.ID, "preview-btn")) - ) - preview_btn.click() # Ensure the preview section is visible - blog_preview = driver.find_element(By.CLASS_NAME, "blog-preview") - - # Wait for the preview section to be visible - WebDriverWait(driver, 5).until( - lambda d: blog_preview.is_displayed(), - message="Blog preview section did not show after clicking preview button" - ) + # Switch to the iframe containing the Google Form + iframe = driver.find_element(By.TAG_NAME, "iframe") + driver.switch_to.frame(iframe) - # Locate title input and preview elements - title_input = WebDriverWait(driver, 10).until( - EC.element_to_be_clickable((By.ID, "title")) - ) - preview_title = driver.find_element(By.ID, "preview-title") + # Wait for the form to load + wait = WebDriverWait(driver, 10) - # Test data - test_title = "Test Blog Title" + # Fill out the "Title" question + title_field = wait.until( + EC.presence_of_element_located((By.CSS_SELECTOR, 'input[aria-labelledby="i1 i4"]')) + ) + title_field.send_keys("Sample Title") - # Enter title, clear input first, and validate the preview updates - title_input.clear() # Clear the existing text if any - title_input.send_keys(test_title) + # Fill out the "Content" question + content_field = wait.until( + EC.presence_of_element_located((By.CSS_SELECTOR, 'textarea[aria-labelledby="i6 i9"]')) + ) + content_field.send_keys("This is a test content for the Google Form.") - # Wait for the preview to update with the new title - WebDriverWait(driver, 5).until( - lambda d: preview_title.text == test_title, - message=f"Title preview did not update correctly. Expected: '{test_title}', but got: '{preview_title.text}'" - ) + # Submit the form + submit_button = wait.until( + EC.element_to_be_clickable((By.XPATH, '//span[contains(@class, "NPEfkd") and text()="Submit"]')) + ) + submit_button.click() - # Assertion to confirm title preview is updated - assert preview_title.text == test_title, f"Expected '{test_title}', but got '{preview_title.text}'" + # Verify submission + success_message = wait.until( + EC.presence_of_element_located((By.XPATH, '//div[contains(@class, "vHW8K") and text()="Your response has been recorded."]')) + ) + self.assertTrue(success_message.is_displayed(), "Form submission failed!") + def tearDown(self): + """Tear down the WebDriver.""" + self.driver.quit() - -def test_content_input_updates_preview(driver): - driver.get(f"{BASE_URL}/create-blog") - - # Locate and toggle the preview section - preview_btn = WebDriverWait(driver, 10).until( - EC.element_to_be_clickable((By.ID, "preview-btn")) - ) - preview_btn.click() # Ensure the preview section is visible - blog_preview = driver.find_element(By.CLASS_NAME, "blog-preview") - WebDriverWait(driver, 5).until( - lambda d: blog_preview.is_displayed(), - message="Blog preview section did not show after clicking preview button" - ) - - # Locate content input and preview elements - content_input = WebDriverWait(driver, 10).until( - EC.element_to_be_clickable((By.ID, "content")) - ) - preview_content = driver.find_element(By.ID, "preview-content") - - # Test data - test_content = "This is a test blog content." - - # Clear the input field, enter content, and validate the preview updates - content_input.clear() - content_input.send_keys(test_content) - - # Wait for the preview content to update - WebDriverWait(driver, 5).until( - lambda d: preview_content.text == test_content, - message="Content preview did not update correctly" - ) - - # Assertion to check if the content preview updates correctly - assert preview_content.text == test_content, f"Expected '{test_content}', but got '{preview_content.text}'" - - -def test_image_upload_and_preview(driver): - driver.get(f"{BASE_URL}/create-blog") - - # Locate image input and preview elements - image_input = driver.find_element(By.ID, "image") - image_preview = driver.find_element(By.ID, "image-preview") - - # Test image path - image_path = os.path.abspath("_test/test-image.jpg") # Replace with actual path - if not os.path.exists(image_path): - raise FileNotFoundError(f"Test image not found at {image_path}") - - # Upload image and validate the preview - image_input.send_keys(image_path) - WebDriverWait(driver, 5).until( - lambda d: image_preview.is_displayed(), - message="Image preview did not appear after upload" - ) - assert image_preview.is_displayed(), "Image preview did not appear after upload" - - -def test_preview_toggle(driver): - driver.get(f"{BASE_URL}/create-blog") - - # Locate preview button and blog preview section - preview_btn = WebDriverWait(driver, 10).until( - EC.element_to_be_clickable((By.ID, "preview-btn")) - ) - blog_preview = driver.find_element(By.CLASS_NAME, "blog-preview") - - # Toggle preview section - preview_btn.click() - WebDriverWait(driver, 5).until( - lambda d: blog_preview.is_displayed(), - message="Blog preview section did not show after clicking preview button" - ) - assert blog_preview.is_displayed(), "Blog preview section did not show after clicking preview button" - - # Hide preview section and verify - preview_btn.click() - WebDriverWait(driver, 5).until( - lambda d: not blog_preview.is_displayed(), - message="Blog preview section did not hide after clicking preview button again" - ) - assert not blog_preview.is_displayed(), "Blog preview section did not hide after clicking preview button again" +if __name__ == "__main__": + unittest.main()