Skip to content

Commit

Permalink
test: add e2e tests for blog and visualisation pages (#168)
Browse files Browse the repository at this point in the history
* test: search function on homepage

* test: add tests for events and visualisation page

* test: add tests for visualisation page and items

* test: add tests for blog

Correct headless option to true

* test: add more tests for blog pages
  • Loading branch information
yld-weng committed Oct 8, 2021
1 parent e5d2278 commit 48bf97e
Show file tree
Hide file tree
Showing 35 changed files with 1,510 additions and 722 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -49,7 +49,7 @@
</a>&nbsp;
<a href="https://sonarcloud.io/component_measures?id=researchdata-sheffield_dataviz-hub2&metric=vulnerabilities">
<img src="https://sonarcloud.io/api/project_badges/measure?project=researchdata-sheffield_dataviz-hub2&metric=vulnerabilities" alt="Vulnerabilities" />
</a>
</a>&nbsp;
<a href="https://sonarcloud.io/dashboard?id=researchdata-sheffield_dataviz-hub2">
<img src="https://sonarcloud.io/api/project_badges/measure?project=researchdata-sheffield_dataviz-hub2&metric=alert_status" />
</a>
Expand Down
258 changes: 126 additions & 132 deletions content/docs/2021-07-21-Contribute-visualisation/index.mdx

Large diffs are not rendered by default.

Expand Up @@ -50,7 +50,7 @@ export const data = [
className="text-gray-300"
style={{ fontSize: ".82rem", lineHeight: "1.3" }}
>
HINT:{" "}
Exmaple:{" "}
<span className="text-red-300">
Policy / £0.70 MUP / Consumption (units per year) / Male drinkers
</span>{" "}
Expand Down
Expand Up @@ -171,17 +171,25 @@ const SunburstChart = () => {
consumption and harm{" "}
<span style={{ color: "#FB989F" }}>for men than women</span>
</h1>
<div style={{ height: "430px", marginBottom: "20px", zIndex: "10" }}>
<div
style={{
height: "430px",
marginTop: "20px",
zIndex: "10",
position: "relative"
}}
>
<Sunburst {...chartConfig} />
</div>
<div
style={{
position: "absolute",
right: 0,
marginRight: "1rem",
bottom: "12%",
bottom: "10%",
display: "flex",
flexDirection: "column"
flexDirection: "column",
zIndex: 20
}}
>
<OptionBtn
Expand Down
9 changes: 4 additions & 5 deletions lint-staged.config.js
@@ -1,7 +1,6 @@
module.exports = {
'*.js': ['eslint'],
'*.+(js|jsx|json|yml|yaml|css|less|scss|ts|tsx|md|graphql|mdx)': [
'prettier --write',
'git add'
"*.js": ["eslint"],
"*.+(js|jsx|json|yml|yaml|css|less|scss|ts|tsx|md|graphql|mdx)": [
"prettier --write"
]
}
};
60 changes: 32 additions & 28 deletions src/components/blog/menuCategory.jsx
@@ -1,56 +1,60 @@
import React from 'react'
import PropTypes from "prop-types"
import { Link } from "gatsby"
import kebabCase from "lodash.kebabcase"
import Flip from 'react-reveal/Flip'
import React from "react";
import PropTypes from "prop-types";
import { Link } from "gatsby";
import kebabCase from "lodash.kebabcase";
import Flip from "react-reveal/Flip";

const menuCategory = ({ pageContext, handleTagMenu, tagMenu }) => {
const buttonStyle = "bg-white text-gray-900 border-1 border-gray-100 py-2 px-3 mr-2 mt-2 rounded-sm text-sm transition duration-300 ease-in-out"
const buttonStyle =
"bg-white text-gray-900 border-1 border-gray-100 py-2 px-3 mr-2 mt-2 rounded-sm text-sm transition duration-300 ease-in-out";
const topTags = Object.entries(pageContext.countTags)
.sort((a,b) => b[1] - a[1])
.slice(0,15);
.sort((a, b) => b[1] - a[1])
.slice(0, 15);

return (
<Flip cascade top delay={1000}>
<div className="flex flex-wrap px-5 w-full mt-10" style={{maxWidth: '650px'}}>
<div
className="flex flex-wrap px-5 w-full mt-10"
style={{ maxWidth: "650px" }}
aria-label="List of categories and top tags"
>
{pageContext.categories.map((cat) => (
<Link
key={cat}
to={`/blog/category/${kebabCase(cat)}`}
activeStyle={{ color: "#00aeef" }}
key={cat}
to={`/blog/category/${kebabCase(cat)}`}
activeStyle={{ color: "#00aeef" }}
partiallyActive={true}
className={`${buttonStyle} hover:text-brand-blue hover:border-blue-300 font-semibold`}
>
{cat}
</Link>
))}
{topTags.map((tag) => (
<Link
key={tag[0]}
<Link
key={tag[0]}
to={`/blog/tag/${kebabCase(tag[0])}`}
activeStyle={{ color: "#ff79b4" }}
activeStyle={{ color: "#ff79b4" }}
partiallyActive={true}
className={`${buttonStyle} hover:text-brand-pink hover:border-pink-300`}
>
{tag[0]}
</Link>
</Link>
))}
<div
title="Click to open the menu"
<button
aria-label="Click to toggle the tag menu"
title="Click to toggle the tag menu"
onClick={() => handleTagMenu()}
className={`${buttonStyle} hover:text-white hover:bg-gray-900 hover:border-gray-900 font-bold cursor-pointer`}
>
{tagMenu ? 'CLOSE' : 'MORE'}
</div>
{tagMenu ? "CLOSE" : "MORE"}
</button>
</div>
</Flip>
)
);
};

}

export default menuCategory
export default menuCategory;

menuCategory.propTypes = {
pageContext: PropTypes.any,

}
pageContext: PropTypes.any
};
48 changes: 26 additions & 22 deletions src/components/blog/menuTag.jsx
@@ -1,26 +1,26 @@
import React, { useState } from "react"
import PropTypes from "prop-types"
import { Link } from "gatsby"
import kebabCase from "lodash.kebabcase"
import { FaTags, FaAngleDown } from "react-icons/fa"
import { FiSearch } from "react-icons/fi"
import { useLocation } from "@gatsbyjs/reach-router"
import React, { useState } from "react";
import PropTypes from "prop-types";
import { Link } from "gatsby";
import kebabCase from "lodash.kebabcase";
import { FaTags, FaAngleDown } from "react-icons/fa";
import { FiSearch } from "react-icons/fi";
import { useLocation } from "@gatsbyjs/reach-router";

const menuTag = ({ pageContext, handleTagMenu, tagMenu }) => {
const [filterTag, setfilterTag] = useState(pageContext.allTags)
const [filterTag, setfilterTag] = useState(pageContext.allTags);

var { href } = useLocation()
if (!href) href = ""
var { href } = useLocation();
if (!href) href = "";

function searchTag(e) {
// on input, show tag menu
if (tagMenu === false) handleTagMenu()
if (tagMenu === false) handleTagMenu();

let searchWord = e.target.value.toLowerCase()
let searchWord = e.target.value.toLowerCase();
let searchTagList = pageContext.allTags.filter(function (tag) {
return tag.toLowerCase().indexOf(searchWord) != -1 // returns true or false
})
setfilterTag(searchTagList)
return tag.toLowerCase().indexOf(searchWord) != -1; // returns true or false
});
setfilterTag(searchTagList);
}

return (
Expand Down Expand Up @@ -52,7 +52,10 @@ const menuTag = ({ pageContext, handleTagMenu, tagMenu }) => {
</div>
</div>
{/* tag menu */}
<div className={`${tagMenu ? `` : `hidden`} pt-4`}>
<div
className={`${tagMenu ? `` : `hidden`} pt-4`}
aria-label="Tag menu results"
>
{filterTag.map((tag) => (
<Link
key={tag}
Expand All @@ -67,7 +70,8 @@ const menuTag = ({ pageContext, handleTagMenu, tagMenu }) => {
</div>
</div>
{/* arrow button */}
<div
<button
aria-label={`${tagMenu ? "Collapse" : "Open"} tag menu`}
onClick={() => handleTagMenu()}
className="text-gray-900 flex justify-center text-2xl absolute top-0 right-0 mr-4 mt-4"
>
Expand All @@ -77,13 +81,13 @@ const menuTag = ({ pageContext, handleTagMenu, tagMenu }) => {
transition: "all .5s ease"
}}
/>
</div>
</button>
</div>
)
}
);
};

export default menuTag
export default menuTag;

menuTag.propTypes = {
pageContext: PropTypes.any
}
};
136 changes: 95 additions & 41 deletions src/components/blog/menuTagSlide.jsx
@@ -1,69 +1,123 @@
import React, {useState} from 'react'
import PropTypes from "prop-types"
import { Link } from "gatsby"
import kebabCase from "lodash.kebabcase"
import { FaTags} from "react-icons/fa"
import {FiSearch} from "react-icons/fi"
import { IoMdClose } from "react-icons/io"
import { useLocation } from "@gatsbyjs/reach-router"
import React, { useState } from "react";
import PropTypes from "prop-types";
import { Link } from "gatsby";
import kebabCase from "lodash.kebabcase";
import { FaTags } from "react-icons/fa";
import { FiSearch } from "react-icons/fi";
import { IoMdClose } from "react-icons/io";
import { useLocation } from "@gatsbyjs/reach-router";

const menuTagSlide = ({ pageContext, handleTagMenu, tagMenu }) => {
const [filterTag, setfilterTag] = useState(pageContext.allTags);
var { href } = useLocation();
if(!href) href = "";
if (!href) href = "";

function handleChange(e) {
// on input, show tag menu
if(tagMenu === false) handleTagMenu();
if (tagMenu === false) handleTagMenu();

let searchWord = e.target.value.toLowerCase();
let searchTagList = pageContext.allTags.filter(function(tag) {
let searchTagList = pageContext.allTags.filter(function (tag) {
return tag.toLowerCase().indexOf(searchWord) != -1; // returns true or false
});
setfilterTag(searchTagList)
setfilterTag(searchTagList);
}


return (

<div id="slideTagMenu" className="xl:w-1/4 2xl:w-1/5 px-5 py-1 xl:py-3 hideScrollBar text-gray-100 shadow-lg text-sm fixed top-0 right-0 min-h-100 hidden xl:flex flex-row border-l-2 border-white transition duration-500 z-50 bg-white"
style={ tagMenu ? {transform: "translateX(0%)", height: "100vh", overflowY: "scroll"} : {transform: "translateX(102%)"} }
>
<div onClick={() => handleTagMenu()} className={`${tagMenu ? 'hidden' : 'block'} absolute left-0 min-h-100 -ml-10 font-bold cursor-pointer flex flex-row items-center transition duration-500 delay-500`} style={{transform: 'translateY(-5%)'}} >
<div className="px-3 py-4 hover:bg-brand-blue bg-gray-900 transition duration-500 shadow-xl" tabIndex="0" title="Open tag menu">T<br />A<br />G</div>
</div>
<div onClick={() => handleTagMenu()} className={`${tagMenu ? 'block' : 'hidden'} absolute right-0 top-0 m-2 cursor-pointer`}>
<div className="px-3 py-3 bg-brand-blue hover:bg-gray-900 transition duration-500 font-bold" tabIndex="0" title="Close the menu"><IoMdClose /></div>
</div>

<div
id="slideTagMenu"
className="xl:w-1/4 2xl:w-1/5 px-5 py-1 xl:py-3 hideScrollBar text-gray-100 shadow-lg text-sm fixed top-0 right-0 min-h-100 hidden xl:flex flex-row border-l-2 border-white transition duration-500 z-50 bg-white"
style={
tagMenu
? {
transform: "translateX(0%)",
height: "100vh",
overflowY: "scroll"
}
: { transform: "translateX(102%)" }
}
>
<button
onClick={() => handleTagMenu()}
className={`${
tagMenu ? "hidden" : "block"
} absolute left-0 min-h-100 -ml-10 font-bold cursor-pointer flex flex-row items-center transition duration-500 delay-500`}
style={{ transform: "translateY(-5%)" }}
>
<div
className="px-3 py-4 hover:bg-brand-blue bg-gray-900 transition duration-500 shadow-xl"
title="Open tag menu"
aria-label="Open the side tag menu"
>
T<br />A<br />G
</div>
</button>
<button
onClick={() => handleTagMenu()}
className={`${
tagMenu ? "block" : "hidden"
} absolute right-0 top-0 m-2 cursor-pointer`}
title="Close the menu"
aria-label="Close the slide tag menu"
>
<div className="px-3 py-3 bg-brand-blue hover:bg-gray-900 transition duration-500 font-bold">
<IoMdClose />
</div>
</button>

{/* main tag menu */}
<div className="lg:py-2 xl:py-6">
<div>
<h1 className="inline-block text-2xl pb-2 xl:pb-5 font-semibold mr-4 text-gray-900"><FaTags style={{display: "inline-block"}} /> {href.includes("/blog/tag/") ? <Link to="/blog/#read">ALL</Link> : "Tags"}</h1>
<h1 className="inline-block text-2xl pb-2 xl:pb-5 font-semibold mr-4 text-gray-900">
<FaTags style={{ display: "inline-block" }} />{" "}
{href.includes("/blog/tag/") ? (
<Link to="/blog/#read">ALL</Link>
) : (
"Tags"
)}
</h1>
<div className="inline-block focus:outline-none text-gray-600 bg-white shadow px-2 rounded-lg mb-4 w-full">
<FiSearch className="inline-block text-center text-xl -mt-2" />
<input id="tagSearchSlide" onChange={handleChange} className="search__input py-1 pl-2 text-base focus:outline-none pr-3 text-gray-600" style={{minWidth: "5vw"}} type="text" name="search" placeholder="Search for tags" />
<input
id="tagSearchSlide"
onChange={handleChange}
className="search__input py-1 pl-2 text-base focus:outline-none pr-3 text-gray-600"
style={{ minWidth: "5vw" }}
type="text"
name="search"
placeholder="Search for tags"
/>
</div>
</div>

{filterTag.map((tag) => (
<Link key={tag} activeStyle={{ color: "white", backgroundColor: "#00aeef" }} partiallyActive={true} to={`/blog/tag/${kebabCase(tag)}`}
className="inline-block hover:bg-brand-blue hover:text-white py-1 px-2 m-1 bg-gray-50 text-gray-700 rounded-full 2xl:text-sm font-sans font-semibold"
>
{tag} ({pageContext.countTags[`${tag}`]})
</Link>
))}
<div onClick={() => handleTagMenu()} className={`${tagMenu ? 'block' : 'hidden'} cursor-pointer my-5 px-3 py-2 bg-brand-blue hover:bg-gray-900 transition duration-500 font-bold text-center`} tabIndex="0">ClOSE</div>
<div aria-label="Slide tag menu results">
{filterTag.map((tag) => (
<Link
key={tag}
activeStyle={{ color: "white", backgroundColor: "#00aeef" }}
partiallyActive={true}
to={`/blog/tag/${kebabCase(tag)}`}
className="inline-block hover:bg-brand-blue hover:text-white py-1 px-2 m-1 bg-gray-50 text-gray-700 rounded-full 2xl:text-sm font-sans font-semibold"
>
{tag} ({pageContext.countTags[`${tag}`]})
</Link>
))}
</div>
<button
onClick={() => handleTagMenu()}
className={`${
tagMenu ? "block" : "hidden"
} cursor-pointer my-5 px-3 py-2 bg-brand-blue hover:bg-gray-900 transition duration-500 font-bold text-center w-full`}
>
ClOSE
</button>
</div>
</div>

)

}
);
};

export default menuTagSlide
export default menuTagSlide;

menuTagSlide.propTypes = {
pageContext: PropTypes.any,
}
pageContext: PropTypes.any
};

0 comments on commit 48bf97e

Please sign in to comment.