Skip to content

Commit

Permalink
Merge pull request #47 from Abstract-Tech/feature/vertical-nav
Browse files Browse the repository at this point in the history
added e2e tests
  • Loading branch information
DJkal11 committed Oct 6, 2023
2 parents 23fd0ae + fba2ad0 commit 8a87320
Show file tree
Hide file tree
Showing 20 changed files with 1,967 additions and 0 deletions.
24 changes: 24 additions & 0 deletions env/build/openedx/e2e/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# See https://help.github.com/ignore-files/ for more about ignoring files.

# dependencies
node_modules/

# testing
/coverage
cypress/screenshots/*
!cypress/screenshots/base
cypress/videos

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
28 changes: 28 additions & 0 deletions env/build/openedx/e2e/cypress.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const { defineConfig } = require("cypress");

module.exports = defineConfig({
e2e: {
baseUrl: "http://local.overhang.io:8000/",
chromeWebSecurity: true,
trashAssetsBeforeRuns: true,
failOnStatusCode: false,
env: {
type: "actual",
STUDIO_URL: "http://studio.local.overhang.io:8001/",
LMS_URL: "http://local.overhang.io:8000/",
CMS_URL: "http://studio.local.overhang.io:8001/",
LOGIN_URL: "http://local.overhang.io:8000/user_api/v1/account/login_session/",
DASHBOARD_URL:"http://local.overhang.io:8000/dashboard",
COURSES_URL:"http://local.overhang.io:8000/courses",
staff_user: {
username: "admin",
email: "admin@example.com",
password: "admin",
},
},
projectId: "6yfi94",
setupNodeEvents(on, config) {
// implement node event listeners here
},
},
});
143 changes: 143 additions & 0 deletions env/build/openedx/e2e/cypress/e2e/1-getting-started/todo.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
/// <reference types="cypress" />

// Welcome to Cypress!
//
// This spec file contains a variety of sample tests
// for a todo list app that are designed to demonstrate
// the power of writing tests in Cypress.
//
// To learn more about how Cypress works and
// what makes it such an awesome testing tool,
// please read our getting started guide:
// https://on.cypress.io/introduction-to-cypress

describe('example to-do app', () => {
beforeEach(() => {
// Cypress starts out with a blank slate for each test
// so we must tell it to visit our website with the `cy.visit()` command.
// Since we want to visit the same URL at the start of all our tests,
// we include it in our beforeEach function so that it runs before each test
cy.visit('https://example.cypress.io/todo')
})

it('displays two todo items by default', () => {
// We use the `cy.get()` command to get all elements that match the selector.
// Then, we use `should` to assert that there are two matched items,
// which are the two default items.
cy.get('.todo-list li').should('have.length', 2)

// We can go even further and check that the default todos each contain
// the correct text. We use the `first` and `last` functions
// to get just the first and last matched elements individually,
// and then perform an assertion with `should`.
cy.get('.todo-list li').first().should('have.text', 'Pay electric bill')
cy.get('.todo-list li').last().should('have.text', 'Walk the dog')
})

it('can add new todo items', () => {
// We'll store our item text in a variable so we can reuse it
const newItem = 'Feed the cat'

// Let's get the input element and use the `type` command to
// input our new list item. After typing the content of our item,
// we need to type the enter key as well in order to submit the input.
// This input has a data-test attribute so we'll use that to select the
// element in accordance with best practices:
// https://on.cypress.io/selecting-elements
cy.get('[data-test=new-todo]').type(`${newItem}{enter}`)

// Now that we've typed our new item, let's check that it actually was added to the list.
// Since it's the newest item, it should exist as the last element in the list.
// In addition, with the two default items, we should have a total of 3 elements in the list.
// Since assertions yield the element that was asserted on,
// we can chain both of these assertions together into a single statement.
cy.get('.todo-list li')
.should('have.length', 3)
.last()
.should('have.text', newItem)
})

it('can check off an item as completed', () => {
// In addition to using the `get` command to get an element by selector,
// we can also use the `contains` command to get an element by its contents.
// However, this will yield the <label>, which is lowest-level element that contains the text.
// In order to check the item, we'll find the <input> element for this <label>
// by traversing up the dom to the parent element. From there, we can `find`
// the child checkbox <input> element and use the `check` command to check it.
cy.contains('Pay electric bill')
.parent()
.find('input[type=checkbox]')
.check()

// Now that we've checked the button, we can go ahead and make sure
// that the list element is now marked as completed.
// Again we'll use `contains` to find the <label> element and then use the `parents` command
// to traverse multiple levels up the dom until we find the corresponding <li> element.
// Once we get that element, we can assert that it has the completed class.
cy.contains('Pay electric bill')
.parents('li')
.should('have.class', 'completed')
})

context('with a checked task', () => {
beforeEach(() => {
// We'll take the command we used above to check off an element
// Since we want to perform multiple tests that start with checking
// one element, we put it in the beforeEach hook
// so that it runs at the start of every test.
cy.contains('Pay electric bill')
.parent()
.find('input[type=checkbox]')
.check()
})

it('can filter for uncompleted tasks', () => {
// We'll click on the "active" button in order to
// display only incomplete items
cy.contains('Active').click()

// After filtering, we can assert that there is only the one
// incomplete item in the list.
cy.get('.todo-list li')
.should('have.length', 1)
.first()
.should('have.text', 'Walk the dog')

// For good measure, let's also assert that the task we checked off
// does not exist on the page.
cy.contains('Pay electric bill').should('not.exist')
})

it('can filter for completed tasks', () => {
// We can perform similar steps as the test above to ensure
// that only completed tasks are shown
cy.contains('Completed').click()

cy.get('.todo-list li')
.should('have.length', 1)
.first()
.should('have.text', 'Pay electric bill')

cy.contains('Walk the dog').should('not.exist')
})

it('can delete all completed tasks', () => {
// First, let's click the "Clear completed" button
// `contains` is actually serving two purposes here.
// First, it's ensuring that the button exists within the dom.
// This button only appears when at least one task is checked
// so this command is implicitly verifying that it does exist.
// Second, it selects the button so we can click it.
cy.contains('Clear completed').click()

// Then we can make sure that there is only one element
// in the list and our element does not exist
cy.get('.todo-list li')
.should('have.length', 1)
.should('not.have.text', 'Pay electric bill')

// Finally, make sure that the clear button no longer exists.
cy.contains('Clear completed').should('not.exist')
})
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
describe("Course overview page units test", () => {
beforeEach(() => {
cy.viewport(2000,1000)

cy.login_staff();
cy.visit(`${Cypress.env("COURSES_URL")}`, {
auth: {
username: Cypress.env("staff_user").username,
password: Cypress.env("staff_user").password,
},
});


});

it("course overview units visible", function () {
cy.get("#main")
.find(".courses .courses-listing")
.then((res) => {
cy.get(res).find(".courses-listing-item").should("be.visible").should("be.exist");
});
});

it("course overview font size", function () {
cy.get(".course-title").should("have.css","font-size","18px");
cy.get(".course-date").should("have.css","font-size","14px")
cy.get(".cover-image").should("be.visible")
});

});

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
describe("Course overview page units test", () => {
beforeEach(() => {
cy.viewport(2000,1000)

cy.login_staff();
cy.visit(`${Cypress.env("DASHBOARD_URL")}`, {
auth: {
username: Cypress.env("staff_user").username,
password: Cypress.env("staff_user").password,
},
});

cy.get("body")
cy.get(".discover-new-link").first().click();
cy.get("li.courses-listing-item").first().click();

cy.get("body").then(($body) => {
// synchronously query for element
if ($body.find("div.main-cta strong").length) {
// do something
cy.get("div.main-cta strong").click();
} else {
// do something else
cy.get("div.main-cta a.register").click();
}
cy.get(".collapsible-icon button").first();
cy.get(".collapsible-body a").first().click();
});


});

it("course next/previous button units visible", function () {
cy.get(".next-btn").should("be.visible");
cy.get(".previous-btn").should("be.visible");
});



});

83 changes: 83 additions & 0 deletions env/build/openedx/e2e/cypress/e2e/courses/course-tabs.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
describe("navigate to a course tabs", () => {
beforeEach(() => {
cy.login_staff();
cy.visit(`${Cypress.env("DASHBOARD_URL")}`, {

});

// Cypress.on("uncaught:exception", (err, runnable) => {
// if (err.message.includes("Failed Element Selection")) {
// return false;
// } else if (err.message.includes(" constructor is not a constructor")) {
// return false;
// }
// else if (err.message.includes("Script error.")) {
// return false;
// }

// });

cy.get("body")
cy.get(".discover-new-link").first().click();
cy.get("li.courses-listing-item").first().click();

cy.get("body").then(($body) => {
// synchronously query for element
if ($body.find("div.main-cta strong").length) {
// do something
cy.get("div.main-cta strong").click({force: true});
} else {
// do something else
cy.get("div.main-cta a.register").click();
}

});

});

it("Check if bookmarks are present on the index page", function () {
cy.get('ul.list-unstyled li.small a').should('be.visible').each(($element) => {
cy.wrap($element).contains('a');
});
})

it("Check if the course dates are present on the index page", function () {
cy.get(".course-outline-tab").contains("Important dates");
})



it("Landing to the course index page ", function () {
cy.get("nav.nav-underline-tabs").children("a").eq(0).should("have.class", "active");
cy.get(".course-outline-tab")
.should("be.visible")
.should("be.exist");
});

it("navigate to a course progress tab, and check the section inside the page if visible and exist", function () {
cy.get("nav.nav-underline-tabs a").contains("Progress").click();
cy.get("nav.nav-underline-tabs").children("a").eq(1).should("have.class", "active");
});


it("navigate to a course Dates tab, and check the section inside the page if visible and exist", function () {
cy.get("nav.nav-underline-tabs").children("a").eq(2).click();
cy.get("nav.nav-underline-tabs").children("a").eq(2).should("have.class", "active");

});

it("navigate to a course Discussion tab, and check the section inside the page if visible and exist", function () {
cy.get("nav.nav-underline-tabs a").contains("Discussion").click();
cy.get("nav.nav-underline-tabs").children("a").eq(3).should("have.class", "active");
cy.get(".header-action-bar").find("button").should('be.visible');

});

it("navigate to a course Instructor tab, and check the section inside the page if visible and exist", function () {
cy.get("nav.nav-underline-tabs").children("a").eq(4).click();
cy.get('ol.tabs.course-tabs li.tab:last-child a').should("have.class", "active");

});

});

Loading

0 comments on commit 8a87320

Please sign in to comment.