From db33b97b604885405262fdb7ffcb3d4bd65d3946 Mon Sep 17 00:00:00 2001 From: roostAI <108646238+roostAI@users.noreply.github.com> Date: Wed, 26 Jul 2023 16:10:36 +0000 Subject: [PATCH] Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 --- voter/src/040d2c710c.test.js | 31 +++++++ voter/src/4cbc3930cb.test.js | 55 +++++++++++ voter/src/508b7d38f7.test.js | 52 +++++++++++ voter/src/9023d0a7be.test.js | 29 ++++++ voter/src/App_94baa27ecc.test.js | 38 ++++++++ voter/src/CustomCard_4a8d7ba2ca.test.js | 54 +++++++++++ voter/src/CustomCard_9d6be392ee.test.js | 38 ++++++++ ...checkValidServiceWorker_294ace5fce.test.js | 52 +++++++++++ voter/src/jest.config.js | 8 ++ voter/src/registerValidSW_1bdeca0db3.test.js | 91 +++++++++++++++++++ voter/src/register_0e6e9ee545.test.js | 55 +++++++++++ voter/src/showResults_4a8d7ba2ca.test.js | 46 ++++++++++ voter/src/showResults_9f295132e4.test.js | 33 +++++++ 13 files changed, 582 insertions(+) create mode 100644 voter/src/040d2c710c.test.js create mode 100644 voter/src/4cbc3930cb.test.js create mode 100644 voter/src/508b7d38f7.test.js create mode 100644 voter/src/9023d0a7be.test.js create mode 100644 voter/src/App_94baa27ecc.test.js create mode 100644 voter/src/CustomCard_4a8d7ba2ca.test.js create mode 100644 voter/src/CustomCard_9d6be392ee.test.js create mode 100644 voter/src/checkValidServiceWorker_294ace5fce.test.js create mode 100644 voter/src/jest.config.js create mode 100644 voter/src/registerValidSW_1bdeca0db3.test.js create mode 100644 voter/src/register_0e6e9ee545.test.js create mode 100644 voter/src/showResults_4a8d7ba2ca.test.js create mode 100644 voter/src/showResults_9f295132e4.test.js diff --git a/voter/src/040d2c710c.test.js b/voter/src/040d2c710c.test.js new file mode 100644 index 00000000..ca84d966 --- /dev/null +++ b/voter/src/040d2c710c.test.js @@ -0,0 +1,31 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { shallow } from 'enzyme'; +import Home from './Home'; + +describe('Home component', () => { + let wrapper; + let instance; + + beforeAll(() => { + jest.useFakeTimers(); + wrapper = shallow(); + instance = wrapper.instance(); + }); + + afterEach(() => { + jest.clearAllTimers(); + }); + + test('should clear timeout on unmount', () => { + instance.componentWillUnmount(); + expect(clearTimeout).toHaveBeenCalledWith(instance.timer); + }); + + test('should not clear timeout if timer is not set', () => { + instance.timer = null; + instance.componentWillUnmount(); + expect(clearTimeout).not.toHaveBeenCalled(); + }); +}); diff --git a/voter/src/4cbc3930cb.test.js b/voter/src/4cbc3930cb.test.js new file mode 100644 index 00000000..0654b6f8 --- /dev/null +++ b/voter/src/4cbc3930cb.test.js @@ -0,0 +1,55 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { shallow } from 'enzyme'; +import Result from './Result'; + +jest.mock('node-fetch', () => require('fetch-mock-jest').sandbox()); + +const fetchMock = require('node-fetch'); + +describe('Result component', () => { + let component; + const ballot_endpoint = '//localhost:3000/ballot'; + const ec_server_endpoint = '//localhost:3000/ec-server'; + + beforeEach(() => { + component = shallow(); + fetchMock.restore(); + }); + + it('should fetch results on componentDidMount', async () => { + fetchMock.get(`http:${ballot_endpoint}`, { + results: ['result1', 'result2'], + total_votes: 100, + }); + + await component.instance().componentDidMount(); + expect(component.state('results')).toEqual(['result1', 'result2']); + expect(component.state('total_votes')).toBe(100); + }); + + it('should handle error on fetching results', async () => { + fetchMock.get(`http:${ballot_endpoint}`, 500); + + await component.instance().componentDidMount(); + expect(component.state('results')).toEqual([]); + expect(component.state('total_votes')).toBe(0); + }); + + it('should fetch candidates on componentDidMount', async () => { + fetchMock.get(`http:${ec_server_endpoint}`, { + Candidates: ['candidate1', 'candidate2'], + }); + + await component.instance().componentDidMount(); + expect(component.state('candidates')).toEqual(['candidate1', 'candidate2']); + }); + + it('should handle error on fetching candidates', async () => { + fetchMock.get(`http:${ec_server_endpoint}`, 500); + + await component.instance().componentDidMount(); + expect(component.state('candidates')).toEqual([]); + }); +}); diff --git a/voter/src/508b7d38f7.test.js b/voter/src/508b7d38f7.test.js new file mode 100644 index 00000000..bd3f1e18 --- /dev/null +++ b/voter/src/508b7d38f7.test.js @@ -0,0 +1,52 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { shallow } from 'enzyme'; +import Home from './Home'; + +describe('Home Component', () => { + let wrapper; + let mockFetch; + + beforeEach(() => { + mockFetch = jest.fn(() => Promise.resolve({ + json: () => Promise.resolve({}), + })); + global.fetch = mockFetch; + + wrapper = shallow(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('should update state when candidate_id changes', () => { + wrapper.setState({ candidate_id: '1', voter_id: '1' }); + wrapper.instance().componentDidUpdate({ candidate_id: '2' }, {}); + + expect(mockFetch).toHaveBeenCalled(); + expect(mockFetch.mock.calls[0][0]).toContain('http:'); + expect(mockFetch.mock.calls[0][1].method).toEqual('POST'); + expect(JSON.parse(mockFetch.mock.calls[0][1].body)).toEqual({ candidate_id: '1', vote: '1' }); + }); + + test('should not make a fetch call when ballot_endpoint is empty', () => { + wrapper.setState({ candidate_id: '1', voter_id: '1' }); + global.ballot_endpoint = ''; + + wrapper.instance().componentDidUpdate({ candidate_id: '2' }, {}); + + expect(mockFetch).not.toHaveBeenCalled(); + }); + + test('should update state when showResultsButton changes', () => { + jest.useFakeTimers(); + wrapper.setState({ showResultsButton: true }); + + wrapper.instance().componentDidUpdate({ showResultsButton: false }, {}); + + expect(setTimeout).toHaveBeenCalledTimes(1); + expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 3000); + }); +}); diff --git a/voter/src/9023d0a7be.test.js b/voter/src/9023d0a7be.test.js new file mode 100644 index 00000000..952b3b6c --- /dev/null +++ b/voter/src/9023d0a7be.test.js @@ -0,0 +1,29 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { shallow } from 'enzyme'; +import Result from './Result'; + +describe('Result component', () => { + let component; + + beforeEach(() => { + component = shallow(); + }); + + afterEach(() => { + component.unmount(); + }); + + it('should have correct initial state', () => { + expect(component.state()).toEqual({ + candidates: [], + results: [], + total_votes: 0, + }); + }); + + it('state should not be null', () => { + expect(component.state()).not.toBeNull(); + }); +}); diff --git a/voter/src/App_94baa27ecc.test.js b/voter/src/App_94baa27ecc.test.js new file mode 100644 index 00000000..f999ab96 --- /dev/null +++ b/voter/src/App_94baa27ecc.test.js @@ -0,0 +1,38 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from "react"; +import { render, screen } from '@testing-library/react'; +import { MemoryRouter } from 'react-router-dom'; +import App from './App'; + +describe('App', () => { + test('renders Home component when at /', () => { + render( + + + + ); + + expect(screen.getByText('Home')).toBeInTheDocument(); + }); + + test('renders Result component when at /result', () => { + render( + + + + ); + + expect(screen.getByText('Result')).toBeInTheDocument(); + }); + + test('redirects to / when visiting non-existing routes', () => { + render( + + + + ); + + expect(screen.getByText('Home')).toBeInTheDocument(); + }); +}); diff --git a/voter/src/CustomCard_4a8d7ba2ca.test.js b/voter/src/CustomCard_4a8d7ba2ca.test.js new file mode 100644 index 00000000..3f324249 --- /dev/null +++ b/voter/src/CustomCard_4a8d7ba2ca.test.js @@ -0,0 +1,54 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { shallow } from 'enzyme'; +import Result from './Result'; + +describe('Result Component', () => { + let wrapper; + let instance; + + const mockState = { + results: [ + { candidate_id: 'docker', vote_count: 5 }, + { candidate_id: 'minikube', vote_count: 3 } + ], + candidates: [ + { Name: 'docker', ImageUrl: 'docker.png' }, + { Name: 'minikube', ImageUrl: 'minikube.png' } + ], + total_votes: 8 + }; + + beforeEach(() => { + wrapper = shallow(); + instance = wrapper.instance(); + instance.setState(mockState); + }); + + test('should render without throwing an error', () => { + expect(wrapper.exists()).toBe(true); + }); + + test('should render correct number of custom cards', () => { + expect(wrapper.find('.card').length).toBe(mockState.results.length); + }); + + test('should render no votes message when no results', () => { + instance.setState({ results: [] }); + expect(wrapper.find('.heading').text()).toBe('No votes has been given'); + }); + + test('should render candidate image correctly', () => { + const firstCard = wrapper.find('.card').at(0); + expect(firstCard.find('img').prop('src')).toBe('docker.png'); + }); + + test('should render progress bar correctly', () => { + const firstCard = wrapper.find('.card').at(0); + const progress = Math.round( + (mockState.results[0].vote_count / mockState.total_votes) * 100 + ); + expect(firstCard.find('.progressbar_front').prop('style')).toHaveProperty('width', `${progress}%`); + }); +}); diff --git a/voter/src/CustomCard_9d6be392ee.test.js b/voter/src/CustomCard_9d6be392ee.test.js new file mode 100644 index 00000000..d038aaa7 --- /dev/null +++ b/voter/src/CustomCard_9d6be392ee.test.js @@ -0,0 +1,38 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { shallow } from 'enzyme'; +import CustomCard from './Result'; + +describe('CustomCard', () => { + let wrapper; + let candidate = { candidate_id: 'docker', vote_count: 50 }; + let total_votes = 100; + + beforeEach(() => { + wrapper = shallow(); + }); + + test('renders the card correctly', () => { + expect(wrapper.find('.card')).toHaveLength(1); + }); + + test('renders the correct candidate id', () => { + expect(wrapper.find('.cardContent').text()).toContain(candidate.candidate_id); + }); + + test('calculates the correct vote percentage', () => { + const votePercentage = Math.round((candidate.vote_count / total_votes) * 100); + expect(wrapper.find('.progressbar_front').prop('style')).toHaveProperty('width', `${votePercentage}%`); + expect(wrapper.find('.progressbar_back div').text()).toBe(`${votePercentage}%`); + }); + + test('renders the correct image for the candidate', () => { + expect(wrapper.find('.cardBackgroundImage img').prop('src')).toBe(docker); + }); + + test('does not render an image if the candidate id does not match', () => { + wrapper.setProps({ candidate: { candidate_id: 'unknown', vote_count: 50 } }); + expect(wrapper.find('.cardBackgroundImage img')).toHaveLength(0); + }); +}); diff --git a/voter/src/checkValidServiceWorker_294ace5fce.test.js b/voter/src/checkValidServiceWorker_294ace5fce.test.js new file mode 100644 index 00000000..76ce7c4e --- /dev/null +++ b/voter/src/checkValidServiceWorker_294ace5fce.test.js @@ -0,0 +1,52 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +jest.mock('node-fetch'); +const fetch = require('node-fetch'); +const {Response} = jest.requireActual('node-fetch'); + +const { checkValidServiceWorker, registerValidSW } = require('./serviceWorker'); + +describe('Service Worker Testing', () => { + + beforeEach(() => { + fetch.mockClear(); + }); + + test('should find valid service worker and register it', async () => { + fetch.mockReturnValue( + Promise.resolve( + new Response(JSON.stringify({}), { headers: { 'content-type': 'application/javascript' } }) + ) + ); + + const mockRegisterValidSW = jest.fn(); + registerValidSW = mockRegisterValidSW; + + await checkValidServiceWorker('swUrl', {}); + expect(mockRegisterValidSW).toHaveBeenCalled(); + }); + + test('should not find service worker and reload the page', async () => { + fetch.mockReturnValue( + Promise.resolve( + new Response(JSON.stringify({}), { status: 404 }) + ) + ); + + const mockReload = jest.fn(); + global.window.location.reload = mockReload; + + await checkValidServiceWorker('swUrl', {}); + expect(mockReload).toHaveBeenCalled(); + }); + + test('should handle when fetch fails', async () => { + fetch.mockReturnValue(Promise.reject('API is down')); + + const consoleSpy = jest.spyOn(console, 'log'); + + await checkValidServiceWorker('swUrl', {}); + expect(consoleSpy).toHaveBeenCalledWith('No internet connection found. App is running in offline mode.'); + }); + +}); diff --git a/voter/src/jest.config.js b/voter/src/jest.config.js new file mode 100644 index 00000000..498b06eb --- /dev/null +++ b/voter/src/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + testEnvironment: 'node', + testRegex: '(/__tests__/.*|(\.|/)(test|spec))\.(jsx?|tsx?)$', + moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'], + transform: { + '^.+\.(jsx?|tsx?)$': 'babel-jest', + }, + }; \ No newline at end of file diff --git a/voter/src/registerValidSW_1bdeca0db3.test.js b/voter/src/registerValidSW_1bdeca0db3.test.js new file mode 100644 index 00000000..2bec33fd --- /dev/null +++ b/voter/src/registerValidSW_1bdeca0db3.test.js @@ -0,0 +1,91 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +const registerValidSW = require('./serviceWorker'); + +global.navigator = { + serviceWorker: { + register: jest.fn(), + controller: true, + }, +}; + +describe('registerValidSW', () => { + beforeEach(() => { + global.console = { + log: jest.fn(), + error: jest.fn(), + }; + }); + + it('should register service worker and call onUpdate callback when new content is available', () => { + let config = { + onUpdate: jest.fn(), + }; + let swUrl = 'http://localhost:3000/service-worker.js'; + let mockRegistration = { + installing: { + state: 'installed', + onstatechange: null, + }, + onupdatefound: null, + }; + + navigator.serviceWorker.register.mockReturnValueOnce(Promise.resolve(mockRegistration)); + + registerValidSW(swUrl, config); + + return Promise.resolve().then(() => { + expect(navigator.serviceWorker.register).toBeCalledWith(swUrl); + expect(mockRegistration.onupdatefound).not.toBeNull(); + mockRegistration.onupdatefound(); + expect(mockRegistration.installing.onstatechange).not.toBeNull(); + mockRegistration.installing.onstatechange(); + expect(config.onUpdate).toBeCalledWith(mockRegistration); + expect(console.log).toBeCalledWith('New content is available and will be used when all tabs for this page are closed. See https:bit.ly/CRA-PWA.'); + }); + }); + + it('should register service worker and call onSuccess callback when content is cached for offline use', () => { + let config = { + onSuccess: jest.fn(), + }; + let swUrl = 'http://localhost:3000/service-worker.js'; + let mockRegistration = { + installing: { + state: 'installed', + onstatechange: null, + }, + onupdatefound: null, + }; + + navigator.serviceWorker.register.mockReturnValueOnce(Promise.resolve(mockRegistration)); + navigator.serviceWorker.controller = false; + + registerValidSW(swUrl, config); + + return Promise.resolve().then(() => { + expect(navigator.serviceWorker.register).toBeCalledWith(swUrl); + expect(mockRegistration.onupdatefound).not.toBeNull(); + mockRegistration.onupdatefound(); + expect(mockRegistration.installing.onstatechange).not.toBeNull(); + mockRegistration.installing.onstatechange(); + expect(config.onSuccess).toBeCalledWith(mockRegistration); + expect(console.log).toBeCalledWith('Content is cached for offline use.'); + }); + }); + + it('should log error when service worker registration fails', () => { + let config = {}; + let swUrl = 'http://localhost:3000/service-worker.js'; + let error = new Error('Service worker registration failed'); + + navigator.serviceWorker.register.mockReturnValueOnce(Promise.reject(error)); + + registerValidSW(swUrl, config); + + return Promise.resolve().then(() => { + expect(navigator.serviceWorker.register).toBeCalledWith(swUrl); + expect(console.error).toBeCalledWith('Error during service worker registration:', error); + }); + }); +}); diff --git a/voter/src/register_0e6e9ee545.test.js b/voter/src/register_0e6e9ee545.test.js new file mode 100644 index 00000000..4329b1a6 --- /dev/null +++ b/voter/src/register_0e6e9ee545.test.js @@ -0,0 +1,55 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +const { register } = require('./serviceWorker'); + +describe('serviceWorker', () => { + let env; + let addEventListenerMock; + let consoleLogMock; + let navigatorMock; + + beforeEach(() => { + env = process.env; + process.env = { ...env, NODE_ENV: 'production', PUBLIC_URL: 'http://localhost' }; + addEventListenerMock = jest.spyOn(window, 'addEventListener'); + consoleLogMock = jest.spyOn(console, 'log'); + navigatorMock = jest.spyOn(navigator, 'serviceWorker', 'get'); + }); + + afterEach(() => { + process.env = env; + jest.restoreAllMocks(); + }); + + test('should not register when not in production environment', () => { + process.env.NODE_ENV = 'development'; + register(); + expect(addEventListenerMock).not.toHaveBeenCalled(); + }); + + test('should not register when serviceWorker is not in navigator', () => { + navigatorMock.mockReturnValue(undefined); + register(); + expect(addEventListenerMock).not.toHaveBeenCalled(); + }); + + test('should not register when PUBLIC_URL is on a different origin', () => { + process.env.PUBLIC_URL = 'http://different-origin'; + register(); + expect(addEventListenerMock).not.toHaveBeenCalled(); + }); + + test('should register when in production environment and serviceWorker in navigator', () => { + navigatorMock.mockReturnValue({ ready: Promise.resolve() }); + register(); + expect(addEventListenerMock).toHaveBeenCalledWith('load', expect.any(Function)); + }); + + test('should log message when service worker is ready and app is running on localhost', async () => { + navigatorMock.mockReturnValue({ ready: Promise.resolve() }); + register(); + const loadListener = addEventListenerMock.mock.calls.find(([event]) => event === 'load')[1]; + await loadListener(); + expect(consoleLogMock).toHaveBeenCalled(); + }); +}); diff --git a/voter/src/showResults_4a8d7ba2ca.test.js b/voter/src/showResults_4a8d7ba2ca.test.js new file mode 100644 index 00000000..7d08da25 --- /dev/null +++ b/voter/src/showResults_4a8d7ba2ca.test.js @@ -0,0 +1,46 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { shallow } from 'enzyme'; +import Home from './Home'; + +describe('Home Component', () => { + let wrapper; + beforeEach(() => { + wrapper = shallow(); + }); + + test('renders without crashing', () => { + expect(wrapper.exists()).toBe(true); + }); + + test('renders candidates', () => { + wrapper.setState({ candidates: [{ Name: 'docker', ImageUrl: 'docker.png' }] }); + expect(wrapper.find('.cardContent').text()).toEqual('docker'); + }); + + test('renders no candidates', () => { + wrapper.setState({ candidates: [] }); + expect(wrapper.find('.cardContent').exists()).toBe(false); + }); + + test('renders show results button', () => { + wrapper.setState({ showResultsButton: true }); + expect(wrapper.find('.showResultsButton').exists()).toBe(true); + }); + + test('does not render show results button', () => { + wrapper.setState({ showResultsButton: false }); + expect(wrapper.find('.showResultsButton').exists()).toBe(false); + }); + + test('renders notification', () => { + wrapper.setState({ showNotification: true, candidate_id: 'docker' }); + expect(wrapper.find('.notificationContent').text()).toEqual('Vote registered for docker'); + }); + + test('does not render notification', () => { + wrapper.setState({ showNotification: false }); + expect(wrapper.find('.notificationPopup').exists()).toBe(false); + }); +}); diff --git a/voter/src/showResults_9f295132e4.test.js b/voter/src/showResults_9f295132e4.test.js new file mode 100644 index 00000000..2c1b9432 --- /dev/null +++ b/voter/src/showResults_9f295132e4.test.js @@ -0,0 +1,33 @@ +// Test generated by RoostGPT for test zb-js-test using AI Type Open AI and AI Model gpt-4 + +import React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { createMemoryHistory } from 'history' +import { Router } from 'react-router-dom' +import Home from './Home'; + +describe('Home Component', () => { + test('should redirect to /result when showResults is called', () => { + const history = createMemoryHistory(); + const { getByTestId } = render( + + + + ); + + fireEvent.click(getByTestId('result-button')); + + expect(history.location.pathname).toBe('/result'); + }); + + test('should stay on the same page if showResults is not called', () => { + const history = createMemoryHistory(); + const { getByTestId } = render( + + + + ); + + expect(history.location.pathname).toBe('/'); + }); +});