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('/');
+ });
+});