auth e2e test

This commit is contained in:
Nuwan Chathuranga 2021-10-13 16:25:02 +05:30 committed by Nuwan
parent 697ac3e74d
commit 918788f643
40 changed files with 135 additions and 85 deletions

2
jam-ui/.gitignore vendored
View File

@ -19,6 +19,8 @@
.env.test.local .env.test.local
.env.production.local .env.production.local
.cypress.env.json
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*

6
jam-ui/cypress.env.json Normal file
View File

@ -0,0 +1,6 @@
{
"baseUrl": "http://beta.jamkazam.local:4000",
"legacyBaseUrl": "http://www.jamkazam.local:3000",
"apiBaseUrl": "http://www.jamkazam.local:3000/api"
}

View File

@ -1,6 +1,7 @@
{ {
"baseUrl": "http://beta.jamkazam.local:3000", "baseUrl": "http://beta.jamkazam.local:4000",
"env": { "env": {
"apiBaseUrl": "http://www.jamkazam.local:4000/api" "legacyBaseUrl": "http://www.jamkazam.local:3000",
"apiBaseUrl": "http://www.jamkazam.local:3000/api"
} }
} }

View File

@ -0,0 +1,84 @@
/// <reference types="cypress" />
import {email} from 'chance';
describe('sign up and sign in', () => {
it('redirects to rails app', () => {
cy.visit('/')
cy.contains('Signin to begin')
cy.contains('Please sign in to your jamkazam account')
cy.get('.btn').contains('Sign in').click()
//cy.visit(Cypress.env('baseUrl'))
//legacy app sign in page
cy.url().should('eq', `${Cypress.env('legacyBaseUrl')}/signin`)
//cy.get('a.show-signup-dialog').first().click()
//cy.get('a.signup-email').first().click()
//cy.url().should('eq', `${Cypress.env('legacyBaseUrl')}/signup`)
//legacy app sign up page
})
// it('signs up', () => {
// cy.visit(`${Cypress.env('legacyBaseUrl')}/signup`)
// cy.get('#jam_ruby_user_first_name').type('David')
// cy.get('#jam_ruby_user_last_name').type('Miller')
// cy.get('#jam_ruby_user_email').type(chance.email() )
// cy.get('#jam_ruby_user_password').type('jam123')
// cy.get('#jam_ruby_user_password_confirmation').type('jam123')
// cy.get('#jam_ruby_user_terms_of_service').check()
// cy.get('#create-account-submit').click()
// })
// it('access dashboard', () => {
// cy.visit(Cypress.env('baseUrl'))
// cy.contains('Dashboard')
// })
})
describe.only('Dashboard', () => {
before(() => {
cy.visit(`${Cypress.env('legacyBaseUrl')}/signin`)
cy.get('.signin-form').first().within(() => {
cy.get('#session_email').type('nuwan@jamkazam.com')
cy.get('#session_password').type('jam123')
cy.get('input.signin-submit').click()
})
})
beforeEach(() => {
// before each test, we can automatically preserve the
// 'session_id' and 'remember_token' cookies. this means they
// will not be cleared before the NEXT test starts.
//
// the name of your cookies will likely be different
// this is an example
Cypress.Cookies.preserveOnce('session_id', 'remember_token')
})
it('is on dashboard', () => {
cy.visit(Cypress.env('baseUrl'))
cy.contains('Dashboard')
})
})
// describe('with authenticated user', () => {
// beforeEach(() => {
// cy.visit(`${Cypress.env('legacyBaseUrl')}/signin`)
// cy.get('.signin-form').first().within(() => {
// cy.get('#session_email').type('nuwan@jamkazam.com')
// cy.get('#session_password').type('jam123')
// cy.get('input.signin-submit').click()
// })
// })
// it('user in legacy app', () => {
// cy.url().should('contain', 'client')
// cy.visit(Cypress.env('baseUrl'))
// cy.contains('Dashboard')
// })
// })

View File

@ -4379,6 +4379,11 @@
"supports-color": "^5.3.0" "supports-color": "^5.3.0"
} }
}, },
"chance": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/chance/-/chance-1.1.8.tgz",
"integrity": "sha512-v7fi5Hj2VbR6dJEGRWLmJBA83LJMS47pkAbmROFxHWd9qmE1esHRZW8Clf1Fhzr3rjxnNZVCjOEv/ivFxeIMtg=="
},
"change-emitter": { "change-emitter": {
"version": "0.1.6", "version": "0.1.6",
"resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz",

View File

@ -20,6 +20,7 @@
"@reduxjs/toolkit": "^1.6.1", "@reduxjs/toolkit": "^1.6.1",
"attr-accept": "^2.2.2", "attr-accept": "^2.2.2",
"bootstrap": "^4.5.3", "bootstrap": "^4.5.3",
"chance": "^1.1.8",
"chart.js": "^2.9.3", "chart.js": "^2.9.3",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"echarts": "^4.9.0", "echarts": "^4.9.0",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -102,4 +102,9 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: cover; object-fit: cover;
}
.swiper-person-card{
box-shadow: none !important;
border: solid 1px #eee;
} }

View File

@ -1,4 +1,4 @@
import React from 'react' import React from 'react';
import { Card, CardBody, Row, Col } from 'reactstrap'; import { Card, CardBody, Row, Col } from 'reactstrap';
import Logo from '../navbar/Logo'; import Logo from '../navbar/Logo';
import Section from '../common/Section'; import Section from '../common/Section';
@ -8,14 +8,16 @@ function JKLoginRequest() {
<Section className="py-0"> <Section className="py-0">
<Row className="flex-center min-vh-100 py-6"> <Row className="flex-center min-vh-100 py-6">
<Col sm={10} md={8} lg={6} xl={5} className="col-xxl-4"> <Col sm={10} md={8} lg={6} xl={5} className="col-xxl-4">
<Logo width={250}/> <Logo width={250} />
<Card> <Card>
<CardBody className="fs--1 font-weight-normal p-5"> <CardBody className="fs--1 font-weight-normal p-5">
<Row className="justify-content-center"> <Row className="justify-content-center">
<h3 className="mt-3 mt-md-4 font-weight-normal fs-2">Signin to begin</h3> <h3 className="mt-3 mt-md-4 font-weight-normal fs-2">Signin to begin</h3>
<p>Please login to your jamkazam account before accessing this interface.</p> <p>Please sign in to your jamkazam account</p>
</Row>
<Row className="justify-content-center">
<a className="btn btn-primary" href={`${process.env.REACT_APP_LEGACY_BASE_URL}/signin`}> <a className="btn btn-primary" href={`${process.env.REACT_APP_LEGACY_BASE_URL}/signin`}>
Signin Sign in
</a> </a>
</Row> </Row>
</CardBody> </CardBody>
@ -23,7 +25,7 @@ function JKLoginRequest() {
</Col> </Col>
</Row> </Row>
</Section> </Section>
) );
} }
export default JKLoginRequest export default JKLoginRequest;

View File

@ -1,58 +0,0 @@
import React, { useEffect, useState } from 'react';
import { useAuth } from '../../context/AuthContext';
import { getCurrentUser } from '../../helpers/rest';
import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
import { Link } from 'react-router-dom';
import JKCurrentUserAvatar from './JKCurrentUserAvatar'
const JKNavbarTopCurrentUser = () => {
const { currentUser } = useAuth();
const [dropdownOpen, setDropdownOpen] = useState(false);
const toggle = () => setDropdownOpen(prevState => !prevState);
// const fetchCurrentUser = () => {
// getCurrentUser()
// .then(resp => {
// if (resp.ok) {
// return resp.json();
// }
// })
// .then(data => {
// console.log('CURRENT_USER', data);
// setCurrentUser(data);
// })
// .catch(error => console.log(error));
// };
const handleLogout = () => {};
// useEffect(() => {
// fetchCurrentUser();
// }, []);
return (
<div>
{currentUser &&
<Dropdown isOpen={dropdownOpen} toggle={toggle} data-testid="navbarTopProfileDropdown">
<DropdownToggle nav={true}>
<JKCurrentUserAvatar />
<span className="d-none d-lg-inline navbar-text">
{currentUser.name}
</span>
</DropdownToggle>
<DropdownMenu right={true}>
<DropdownItem tag={Link} to="/pages/settings">
My Profile
</DropdownItem>
<DropdownItem onClick={handleLogout}>Sign out</DropdownItem>
</DropdownMenu>
</Dropdown>
}
</div>
);
};
export default JKNavbarTopCurrentUser;

View File

@ -3,6 +3,7 @@ import React, { useState, useEffect } from 'react';
import { Link, useHistory } from 'react-router-dom'; import { Link, useHistory } from 'react-router-dom';
import { DropdownItem, DropdownMenu, DropdownToggle, Dropdown } from 'reactstrap'; import { DropdownItem, DropdownMenu, DropdownToggle, Dropdown } from 'reactstrap';
import { useAuth } from '../../context/AuthContext'; import { useAuth } from '../../context/AuthContext';
import JKProfileAvatar from '../profile/JKProfileAvatar';
const ProfileDropdown = () => { const ProfileDropdown = () => {
const [dropdownOpen, setDropdownOpen] = useState(false); const [dropdownOpen, setDropdownOpen] = useState(false);
@ -13,21 +14,18 @@ const ProfileDropdown = () => {
const handleLogout = () => { const handleLogout = () => {
setCurrentUser(null); setCurrentUser(null);
//localStorage.setItem('user', null);
// removeCookie("remember_token", {
// domain: ".jamkazam.local"
// });
// history.push('/authentication/basic/logout');
console.log("signout..."); console.log("signout...");
} }
return ( return (
// <Avatar src={team3} /> <>
<Dropdown <Dropdown
nav nav
inNavbar inNavbar
data-testid="navbarTopProfileDropdown"
isOpen={dropdownOpen} isOpen={dropdownOpen}
toggle={toggle} toggle={toggle}
onMouseOver={() => { onMouseOver={() => {
@ -40,7 +38,10 @@ const ProfileDropdown = () => {
}} }}
> >
<DropdownToggle nav className="pr-0"> <DropdownToggle nav className="pr-0">
{currentUser && currentUser.name} <JKProfileAvatar url={currentUser.photo_url} className="d-block d-lg-none d-xl-none" />
<span className="d-none d-lg-block">
{currentUser && currentUser.name}
</span>
</DropdownToggle> </DropdownToggle>
<DropdownMenu right className="dropdown-menu-card"> <DropdownMenu right className="dropdown-menu-card">
<div className="bg-white rounded-soft py-2"> <div className="bg-white rounded-soft py-2">
@ -48,11 +49,12 @@ const ProfileDropdown = () => {
My Profile My Profile
</DropdownItem> </DropdownItem>
<DropdownItem onClick={handleLogout}> <DropdownItem onClick={handleLogout}>
Logout Sign out
</DropdownItem> </DropdownItem>
</div> </div>
</DropdownMenu> </DropdownMenu>
</Dropdown> </Dropdown>
</>
); );
}; };

View File

@ -44,7 +44,7 @@ const JKPeopleSwiper = ({ people, goNextPage }) => {
> >
{people.map((person, index) => ( {people.map((person, index) => (
<SwiperSlide key={person.id}> <SwiperSlide key={person.id}>
<Card> <Card className="swiper-person-card">
<CardHeader className="bg-200"> <CardHeader className="bg-200">
<div className="avatar avatar-xl d-inline-block me-2 mr-2"> <div className="avatar avatar-xl d-inline-block me-2 mr-2">
<JKProfileAvatar url={person.photo_url} size="xl"/> <JKProfileAvatar url={person.photo_url} size="xl"/>

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import defaultAvatarUrl from '../../assets/img/team/avatar.png'; import defaultAvatarUrl from '../../assets/img/team/avatar.png';
import Avatar from '../common/Avatar'; import Avatar from '../common/Avatar';
const JKProfileAvatar = ({ url, size }) => { const JKProfileAvatar = ({ url, size, className }) => {
const avatarUrl = () => { const avatarUrl = () => {
if (url) { if (url) {
return url; return url;
@ -12,7 +12,7 @@ const JKProfileAvatar = ({ url, size }) => {
} }
}; };
return <Avatar src={avatarUrl()} size={size} />; return <Avatar src={avatarUrl()} size={size} className={className} />;
}; };
JKProfileAvatar.propTypes = { JKProfileAvatar.propTypes = {