diff --git a/Backend.Tests/Models/Banner.cs b/Backend.Tests/Models/BannerTests.cs
similarity index 100%
rename from Backend.Tests/Models/Banner.cs
rename to Backend.Tests/Models/BannerTests.cs
diff --git a/Backend/Repositories/ProjectRepository.cs b/Backend/Repositories/ProjectRepository.cs
index 0903f591a4..e2f26d9037 100644
--- a/Backend/Repositories/ProjectRepository.cs
+++ b/Backend/Repositories/ProjectRepository.cs
@@ -9,7 +9,7 @@
namespace BackendFramework.Repositories
{
- /// Atomic database functions for s
+ /// Atomic database functions for s.
[ExcludeFromCodeCoverage]
public class ProjectRepository : IProjectRepository
{
diff --git a/Backend/Repositories/SemanticDomainRepository.cs b/Backend/Repositories/SemanticDomainRepository.cs
index 9caa434b94..1f8bdef46a 100644
--- a/Backend/Repositories/SemanticDomainRepository.cs
+++ b/Backend/Repositories/SemanticDomainRepository.cs
@@ -1,4 +1,5 @@
using System;
+using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using BackendFramework.Interfaces;
using BackendFramework.Models;
@@ -8,6 +9,8 @@
namespace BackendFramework.Repositories
{
+ /// Atomic database functions for the SemanticDomainTree and SemanticDomains collections.
+ [ExcludeFromCodeCoverage]
public class SemanticDomainRepository : ISemanticDomainRepository
{
private ISemanticDomainContext _context;
diff --git a/Backend/Repositories/UserEditRepository.cs b/Backend/Repositories/UserEditRepository.cs
index 16655b237a..46b1918415 100644
--- a/Backend/Repositories/UserEditRepository.cs
+++ b/Backend/Repositories/UserEditRepository.cs
@@ -8,7 +8,7 @@
namespace BackendFramework.Repositories
{
- /// Atomic database functions for s
+ /// Atomic database functions for s.
[ExcludeFromCodeCoverage]
public class UserEditRepository : IUserEditRepository
{
diff --git a/Backend/Repositories/UserRepository.cs b/Backend/Repositories/UserRepository.cs
index dd121f3115..b259574b51 100644
--- a/Backend/Repositories/UserRepository.cs
+++ b/Backend/Repositories/UserRepository.cs
@@ -9,7 +9,7 @@
namespace BackendFramework.Repositories
{
- /// Atomic database functions for s
+ /// Atomic database functions for s.
[ExcludeFromCodeCoverage]
public class UserRepository : IUserRepository
{
diff --git a/Backend/Repositories/UserRoleRepository.cs b/Backend/Repositories/UserRoleRepository.cs
index 6f80f92c9d..a00fa60f08 100644
--- a/Backend/Repositories/UserRoleRepository.cs
+++ b/Backend/Repositories/UserRoleRepository.cs
@@ -9,7 +9,7 @@
namespace BackendFramework.Repositories
{
- /// Atomic database functions for s
+ /// Atomic database functions for s.
[ExcludeFromCodeCoverage]
public class UserRoleRepository : IUserRoleRepository
{
diff --git a/Backend/Repositories/WordRepository.cs b/Backend/Repositories/WordRepository.cs
index 1034ad1192..0423ff8a5d 100644
--- a/Backend/Repositories/WordRepository.cs
+++ b/Backend/Repositories/WordRepository.cs
@@ -9,7 +9,7 @@
namespace BackendFramework.Repositories
{
- /// Atomic database functions for s
+ /// Atomic database functions for s.
[ExcludeFromCodeCoverage]
public class WordRepository : IWordRepository
{
diff --git a/README.md b/README.md
index 3d00bc6d02..79dbc73d02 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,23 @@
# The Combine
[![Frontend Actions Status][github-actions-frontend-badge]][github-actions]
-[![Frontend Coverage][frontend-codecov-badge]][codecov]
+[![Frontend Coverage][frontend-codecov-badge]][codecov-frontend]
+
[![Backend Actions Status][github-actions-backend-badge]][github-actions]
-[![Backend Coverage][backend-codecov-badge]][codecov]
-[![Python Actions Status][github-actions-python-badge]][github-actions]
+[![Backend Coverage][backend-codecov-badge]][codecov-backend]
+
[![CodeQL Actions Status][github-actions-codeql-badge]][github-actions]
+[![Python Actions Status][github-actions-python-badge]][github-actions]
[![OSSF Scorecard][github-actions-ossf-badge]][github-actions]
[![GitHub release][github-release-badge]][github-version] [![GitHub version][github-version-badge]][github-version]
-![Localization][localization-badge] [![GitHub][github-license-badge]][github-license]
+[![Localization][localization-badge]][localization-crowdin] [![GitHub][github-license-badge]][github-license]
[![GitHub contributors][github-contribs-badge]][github-contribs]
[github-actions-frontend-badge]: https://github.com/sillsdev/TheCombine/workflows/frontend/badge.svg
[frontend-codecov-badge]: https://codecov.io/gh/sillsdev/TheCombine/branch/master/graph/badge.svg?flag=frontend
-[codecov]: https://codecov.io/gh/sillsdev/TheCombine
+[codecov-frontend]: https://app.codecov.io/gh/sillsdev/TheCombine/tree/master/src
+[codecov-backend]: https://app.codecov.io/gh/sillsdev/TheCombine/tree/master/Backend
[github-actions-backend-badge]: https://github.com/sillsdev/TheCombine/workflows/backend/badge.svg
[backend-codecov-badge]: https://codecov.io/gh/sillsdev/TheCombine/branch/master/graph/badge.svg?flag=backend
[github-actions-python-badge]: https://github.com/sillsdev/TheCombine/workflows/python/badge.svg
@@ -22,7 +25,8 @@
[github-actions-ossf-badge]:
https://github.com/sillsdev/TheCombine/workflows/Scorecards%20supply-chain%20security/badge.svg
[github-actions]: https://github.com/sillsdev/TheCombine/actions
-[localization-badge]: https://img.shields.io/badge/localization-En%20Es%20Fr-blue
+[localization-badge]: https://img.shields.io/badge/localization-Ar%20En%20Es%20Fr%20Pt-blue
+[localization-crowdin]: https://crowdin.com/project/the-combine
[github-version-badge]: https://img.shields.io/github/package-json/v/sillsdev/TheCombine
[github-release-badge]: https://img.shields.io/github/v/release/sillsdev/TheCombine
[github-version]: https://github.com/sillsdev/TheCombine/releases
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 0000000000..c1e6c4af15
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,6 @@
+ignore:
+ - "src/api"
+ - "src/resources"
+ - "src/types"
+ - "**/*Mock.ts"
+ - "**/*Types.ts"
diff --git a/src/backend/index.ts b/src/backend/index.ts
index 571136dbde..09ef83e2b2 100644
--- a/src/backend/index.ts
+++ b/src/backend/index.ts
@@ -27,10 +27,10 @@ import * as LocalStorage from "backend/localStorage";
import history, { Path } from "browserHistory";
import authHeader from "components/Login/AuthHeaders";
import { errorToast } from "components/Toast/SwalToast";
-import { convertGoalToEdit } from "types/goalUtilities";
import { Goal, GoalStep } from "types/goals";
import { RuntimeConfig } from "types/runtimeConfig";
import { Bcp47Code } from "types/writingSystem";
+import { convertGoalToEdit } from "utilities/goalUtilities";
export const baseURL = `${RuntimeConfig.getInstance().baseUrl()}`;
const apiBaseURL = `${baseURL}/v1`;
diff --git a/src/components/App/App.test.tsx b/src/components/App/App.test.tsx
index e6793aca65..6e96f54517 100644
--- a/src/components/App/App.test.tsx
+++ b/src/components/App/App.test.tsx
@@ -5,7 +5,7 @@ import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
import thunk from "redux-thunk";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { defaultState } from "components/App/DefaultState";
import App from "components/App/component";
diff --git a/src/components/AppBar/tests/AppBarComponent.test.tsx b/src/components/AppBar/tests/AppBarComponent.test.tsx
index 0a5a7d41bb..ed2049a25d 100644
--- a/src/components/AppBar/tests/AppBarComponent.test.tsx
+++ b/src/components/AppBar/tests/AppBarComponent.test.tsx
@@ -2,7 +2,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Path } from "browserHistory";
import { defaultState } from "components/App/DefaultState";
diff --git a/src/components/AppBar/tests/UserMenu.test.tsx b/src/components/AppBar/tests/UserMenu.test.tsx
index 58dd285c6b..c344fe3a2c 100644
--- a/src/components/AppBar/tests/UserMenu.test.tsx
+++ b/src/components/AppBar/tests/UserMenu.test.tsx
@@ -3,7 +3,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Path } from "browserHistory";
import UserMenu, { getIsAdmin, UserMenuList } from "components/AppBar/UserMenu";
diff --git a/src/components/DataEntry/DataEntryHeader/tests/DataEntryHeader.test.tsx b/src/components/DataEntry/DataEntryHeader/tests/DataEntryHeader.test.tsx
index 188ba4df6d..3b929b6571 100644
--- a/src/components/DataEntry/DataEntryHeader/tests/DataEntryHeader.test.tsx
+++ b/src/components/DataEntry/DataEntryHeader/tests/DataEntryHeader.test.tsx
@@ -2,7 +2,7 @@ import { Provider } from "react-redux";
import renderer, { ReactTestInstance } from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { SemanticDomainFull } from "api";
import DataEntryHeader from "components/DataEntry/DataEntryHeader/DataEntryHeader";
diff --git a/src/components/DataEntry/DataEntryTable/DataEntryTable.tsx b/src/components/DataEntry/DataEntryTable/DataEntryTable.tsx
index a78e94ae3e..41278df3bc 100644
--- a/src/components/DataEntry/DataEntryTable/DataEntryTable.tsx
+++ b/src/components/DataEntry/DataEntryTable/DataEntryTable.tsx
@@ -35,8 +35,8 @@ import Recorder from "components/Pronunciations/Recorder";
import { Hash } from "types/hash";
import theme from "types/theme";
import { newSense, simpleWord } from "types/word";
-import { firstGlossText } from "types/wordUtilities";
import { defaultWritingSystem, newWritingSystem } from "types/writingSystem";
+import { firstGlossText } from "utilities/wordUtilities";
export const exitButtonId = "exit-to-domain-tree";
diff --git a/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/DeleteEntry.test.tsx b/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/DeleteEntry.test.tsx
index 5a693710fc..64a8530149 100644
--- a/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/DeleteEntry.test.tsx
+++ b/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/DeleteEntry.test.tsx
@@ -1,6 +1,6 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import DeleteEntry from "components/DataEntry/DataEntryTable/EntryCellComponents/DeleteEntry";
diff --git a/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/EntryNote.test.tsx b/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/EntryNote.test.tsx
index 83c290f505..bfe5e16b09 100644
--- a/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/EntryNote.test.tsx
+++ b/src/components/DataEntry/DataEntryTable/EntryCellComponents/tests/EntryNote.test.tsx
@@ -1,7 +1,7 @@
import { AddComment, Comment } from "@mui/icons-material";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import EntryNote from "components/DataEntry/DataEntryTable/EntryCellComponents/EntryNote";
diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/NewEntry.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/NewEntry.tsx
index 5658fac068..5543e68541 100644
--- a/src/components/DataEntry/DataEntryTable/NewEntry/NewEntry.tsx
+++ b/src/components/DataEntry/DataEntryTable/NewEntry/NewEntry.tsx
@@ -16,8 +16,8 @@ import Pronunciations from "components/Pronunciations/PronunciationsComponent";
import Recorder from "components/Pronunciations/Recorder";
import theme from "types/theme";
import { newSense, newWord } from "types/word";
-import { firstGlossText } from "types/wordUtilities";
-import { LevenshteinDistance } from "utilities";
+import { LevenshteinDistance } from "utilities/utilities";
+import { firstGlossText } from "utilities/wordUtilities";
const idAffix = "new-entry";
diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx
index 7e256ce124..124cd8702f 100644
--- a/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx
+++ b/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx
@@ -13,7 +13,7 @@ import { Word } from "api/models";
import DomainCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DomainCell";
import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes";
import theme from "types/theme";
-import { firstGlossText } from "types/wordUtilities";
+import { firstGlossText } from "utilities/wordUtilities";
interface SenseDialogProps {
selectedWord: Word;
diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/tests/NewEntry.test.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/tests/NewEntry.test.tsx
index 36e92971e8..93037c1fe7 100644
--- a/src/components/DataEntry/DataEntryTable/NewEntry/tests/NewEntry.test.tsx
+++ b/src/components/DataEntry/DataEntryTable/NewEntry/tests/NewEntry.test.tsx
@@ -1,6 +1,6 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import NewEntry from "components/DataEntry/DataEntryTable/NewEntry/NewEntry";
import { newSemanticDomain } from "types/semanticDomain";
diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx
index 2bd5e9127b..99afd4e31b 100644
--- a/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx
+++ b/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx
@@ -3,7 +3,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Word } from "api/models";
import {
diff --git a/src/components/DataEntry/DataEntryTable/RecentEntry/RecentEntry.tsx b/src/components/DataEntry/DataEntryTable/RecentEntry/RecentEntry.tsx
index eeb623429e..16a39823ed 100644
--- a/src/components/DataEntry/DataEntryTable/RecentEntry/RecentEntry.tsx
+++ b/src/components/DataEntry/DataEntryTable/RecentEntry/RecentEntry.tsx
@@ -12,7 +12,7 @@ import Pronunciations from "components/Pronunciations/PronunciationsComponent";
import Recorder from "components/Pronunciations/Recorder";
import theme from "types/theme";
import { newGloss } from "types/word";
-import { firstGlossText } from "types/wordUtilities";
+import { firstGlossText } from "utilities/wordUtilities";
const idAffix = "recent-entry";
diff --git a/src/components/DataEntry/DataEntryTable/RecentEntry/tests/RecentEntry.test.tsx b/src/components/DataEntry/DataEntryTable/RecentEntry/tests/RecentEntry.test.tsx
index dd1965c635..3039d05dfc 100644
--- a/src/components/DataEntry/DataEntryTable/RecentEntry/tests/RecentEntry.test.tsx
+++ b/src/components/DataEntry/DataEntryTable/RecentEntry/tests/RecentEntry.test.tsx
@@ -3,7 +3,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Word } from "api/models";
import EditTextDialog from "components/Buttons/EditTextDialog";
diff --git a/src/components/DataEntry/DataEntryTable/tests/DataEntryTable.test.tsx b/src/components/DataEntry/DataEntryTable/tests/DataEntryTable.test.tsx
index 725f4c18b1..a9b04e3983 100644
--- a/src/components/DataEntry/DataEntryTable/tests/DataEntryTable.test.tsx
+++ b/src/components/DataEntry/DataEntryTable/tests/DataEntryTable.test.tsx
@@ -1,6 +1,6 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Gloss, SemanticDomain, Sense, Word } from "api/models";
import DataEntryTable, {
@@ -18,8 +18,8 @@ import {
semDomFromTreeNode,
} from "types/semanticDomain";
import { multiSenseWord, newSense, simpleWord } from "types/word";
-import { firstGlossText } from "types/wordUtilities";
import { Bcp47Code } from "types/writingSystem";
+import { firstGlossText } from "utilities/wordUtilities";
jest.mock("@mui/material/Autocomplete", () => "div");
jest.mock("notistack", () => ({
diff --git a/src/components/GoalTimeline/GoalTimelineComponent.tsx b/src/components/GoalTimeline/GoalTimelineComponent.tsx
index 8d3ba4a114..05dcf0230a 100644
--- a/src/components/GoalTimeline/GoalTimelineComponent.tsx
+++ b/src/components/GoalTimeline/GoalTimelineComponent.tsx
@@ -5,8 +5,8 @@ import { withTranslation, WithTranslation } from "react-i18next";
import { getUserRole } from "backend";
import { getCurrentUser } from "backend/localStorage";
import GoalList from "components/GoalTimeline/GoalList";
-import { requiredPermission, goalTypeToGoal } from "types/goalUtilities";
import { Goal, GoalsState, GoalType } from "types/goals";
+import { requiredPermission, goalTypeToGoal } from "utilities/goalUtilities";
const timelineStyle = {
centerButton: {
diff --git a/src/components/GoalTimeline/Redux/GoalActions.ts b/src/components/GoalTimeline/Redux/GoalActions.ts
index 5ea6a3f787..d3c8767a61 100644
--- a/src/components/GoalTimeline/Redux/GoalActions.ts
+++ b/src/components/GoalTimeline/Redux/GoalActions.ts
@@ -13,8 +13,8 @@ import {
} from "goals/MergeDupGoal/Redux/MergeDupActions";
import { StoreState } from "types";
import { StoreStateDispatch } from "types/Redux/actions";
-import { convertEditToGoal } from "types/goalUtilities";
import { Goal, GoalStatus, GoalType } from "types/goals";
+import { convertEditToGoal } from "utilities/goalUtilities";
// Action Creators
diff --git a/src/components/GoalTimeline/tests/GoalActions.test.tsx b/src/components/GoalTimeline/tests/GoalActions.test.tsx
index acc96105b4..7e6ce59719 100644
--- a/src/components/GoalTimeline/tests/GoalActions.test.tsx
+++ b/src/components/GoalTimeline/tests/GoalActions.test.tsx
@@ -15,10 +15,10 @@ import { CreateCharInv } from "goals/CreateCharInv/CreateCharInv";
import { HandleFlags } from "goals/HandleFlags/HandleFlags";
import { MergeDups } from "goals/MergeDupGoal/MergeDups";
import { MergeDupData, MergeStepData } from "goals/MergeDupGoal/MergeDupsTypes";
-import { goalDataMock } from "goals/MergeDupGoal/Redux/tests/MockMergeDupData";
-import { maxNumSteps } from "types/goalUtilities";
+import { goalDataMock } from "goals/MergeDupGoal/Redux/tests/MergeDupDataMock";
import { Goal } from "types/goals";
import { newUser } from "types/user";
+import { maxNumSteps } from "utilities/goalUtilities";
jest.mock("goals/MergeDupGoal/Redux/MergeDupActions", () => {
const realMergeDupActions = jest.requireActual(
diff --git a/src/components/GoalTimeline/tests/GoalTimelineComponent.test.tsx b/src/components/GoalTimeline/tests/GoalTimelineComponent.test.tsx
index e03d087474..83c3373553 100644
--- a/src/components/GoalTimeline/tests/GoalTimelineComponent.test.tsx
+++ b/src/components/GoalTimeline/tests/GoalTimelineComponent.test.tsx
@@ -3,14 +3,14 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { defaultState } from "components/GoalTimeline/DefaultState";
import GoalTimelineWithTranslation, {
GoalTimeline,
} from "components/GoalTimeline/GoalTimelineComponent";
-import { goalTypeToGoal } from "types/goalUtilities";
import { Goal, GoalType } from "types/goals";
+import { goalTypeToGoal } from "utilities/goalUtilities";
// Mock out HTMLDiv.scrollIntoView function, as it fails in a testing environment
HTMLDivElement.prototype.scrollIntoView = jest.fn();
diff --git a/src/components/Login/LoginPage/tests/LoginComponent.test.tsx b/src/components/Login/LoginPage/tests/LoginComponent.test.tsx
index 23230bff86..aa6d941d22 100644
--- a/src/components/Login/LoginPage/tests/LoginComponent.test.tsx
+++ b/src/components/Login/LoginPage/tests/LoginComponent.test.tsx
@@ -1,6 +1,6 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import Login from "components/Login/LoginPage/LoginComponent";
diff --git a/src/components/Login/SignUpPage/SignUpComponent.tsx b/src/components/Login/SignUpPage/SignUpComponent.tsx
index dbc1ca731d..ca603f03ed 100644
--- a/src/components/Login/SignUpPage/SignUpComponent.tsx
+++ b/src/components/Login/SignUpPage/SignUpComponent.tsx
@@ -15,7 +15,7 @@ import LoadingDoneButton from "components/Buttons/LoadingDoneButton";
import {
meetsPasswordRequirements,
meetsUsernameRequirements,
-} from "utilities";
+} from "utilities/utilities";
const idAffix = "signUp";
diff --git a/src/components/Login/SignUpPage/tests/SignUpComponent.test.tsx b/src/components/Login/SignUpPage/tests/SignUpComponent.test.tsx
index 3c85feb00b..bba2c0b489 100644
--- a/src/components/Login/SignUpPage/tests/SignUpComponent.test.tsx
+++ b/src/components/Login/SignUpPage/tests/SignUpComponent.test.tsx
@@ -1,6 +1,6 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import SignUp from "components/Login/SignUpPage/SignUpComponent";
diff --git a/src/components/PageNotFound/tests/component.test.tsx b/src/components/PageNotFound/tests/component.test.tsx
index 59f455749d..8fc11e4481 100644
--- a/src/components/PageNotFound/tests/component.test.tsx
+++ b/src/components/PageNotFound/tests/component.test.tsx
@@ -2,7 +2,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import PageNotFound from "components/PageNotFound/component";
diff --git a/src/components/PasswordReset/ResetPage/component.tsx b/src/components/PasswordReset/ResetPage/component.tsx
index 9d5510ed7e..3b95f5336c 100644
--- a/src/components/PasswordReset/ResetPage/component.tsx
+++ b/src/components/PasswordReset/ResetPage/component.tsx
@@ -6,7 +6,7 @@ import { RouteComponentProps } from "react-router-dom";
import history, { Path } from "browserHistory";
import { RequestState } from "components/PasswordReset/Redux/ResetReduxTypes";
-import { meetsPasswordRequirements } from "utilities";
+import { meetsPasswordRequirements } from "utilities/utilities";
export interface MatchParams {
token: string;
diff --git a/src/components/PasswordReset/tests/ResetPage.test.tsx b/src/components/PasswordReset/tests/ResetPage.test.tsx
index 45d450d753..030571c848 100644
--- a/src/components/PasswordReset/tests/ResetPage.test.tsx
+++ b/src/components/PasswordReset/tests/ResetPage.test.tsx
@@ -3,7 +3,7 @@ import { RouteComponentProps } from "react-router-dom";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { resetFail } from "components/PasswordReset/Redux/ResetActions";
import { RequestState } from "components/PasswordReset/Redux/ResetReduxTypes";
diff --git a/src/components/ProjectExport/DownloadButton.tsx b/src/components/ProjectExport/DownloadButton.tsx
index 0df123ced2..d7e4ae27ba 100644
--- a/src/components/ProjectExport/DownloadButton.tsx
+++ b/src/components/ProjectExport/DownloadButton.tsx
@@ -19,7 +19,7 @@ import { ExportStatus } from "components/ProjectExport/Redux/ExportProjectReduxT
import { StoreState } from "types";
import { useAppDispatch, useAppSelector } from "types/hooks";
import { themeColors } from "types/theme";
-import { getNowDateTimeString } from "utilities";
+import { getNowDateTimeString } from "utilities/utilities";
function makeExportName(projectName: string) {
return `${projectName}_${getNowDateTimeString()}.zip`;
diff --git a/src/components/ProjectScreen/tests/ChooseProject.test.tsx b/src/components/ProjectScreen/tests/ChooseProject.test.tsx
index 156fd1fcef..092746743d 100644
--- a/src/components/ProjectScreen/tests/ChooseProject.test.tsx
+++ b/src/components/ProjectScreen/tests/ChooseProject.test.tsx
@@ -1,7 +1,7 @@
import { ListItemButton } from "@mui/material";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Project } from "api/models";
import ChooseProject from "components/ProjectScreen/ChooseProject";
diff --git a/src/components/ProjectSettings/ProjectLanguages/ProjectLanguages.tsx b/src/components/ProjectSettings/ProjectLanguages/ProjectLanguages.tsx
index a5261bfc93..67935c1727 100644
--- a/src/components/ProjectSettings/ProjectLanguages/ProjectLanguages.tsx
+++ b/src/components/ProjectSettings/ProjectLanguages/ProjectLanguages.tsx
@@ -28,8 +28,8 @@ import { getFrontierWords } from "backend";
import IconButtonWithTooltip from "components/Buttons/IconButtonWithTooltip";
import { UpperRightToastContainer } from "components/Toast/UpperRightToastContainer";
import theme from "types/theme";
-import { getAnalysisLangsFromWords } from "types/wordUtilities";
import { newWritingSystem, semDomWritingSystems } from "types/writingSystem";
+import { getAnalysisLangsFromWords } from "utilities/wordUtilities";
interface LanguageProps extends WithTranslation {
project: Project;
diff --git a/src/components/ProjectSettings/ProjectLanguages/tests/ProjectLangauges.test.tsx b/src/components/ProjectSettings/ProjectLanguages/tests/ProjectLangauges.test.tsx
index 475e1e59bd..2f2e4cd081 100644
--- a/src/components/ProjectSettings/ProjectLanguages/tests/ProjectLangauges.test.tsx
+++ b/src/components/ProjectSettings/ProjectLanguages/tests/ProjectLangauges.test.tsx
@@ -1,7 +1,7 @@
import { LanguagePicker } from "mui-language-picker";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Project, WritingSystem } from "api/models";
import ProjectLanguages from "components/ProjectSettings/ProjectLanguages/ProjectLanguages";
diff --git a/src/components/ProjectSettings/ProjectSwitch/ProjectSwitch.tsx b/src/components/ProjectSettings/ProjectSwitch/ProjectSwitch.tsx
index 47964dfb07..1e69f1e2c3 100644
--- a/src/components/ProjectSettings/ProjectSwitch/ProjectSwitch.tsx
+++ b/src/components/ProjectSettings/ProjectSwitch/ProjectSwitch.tsx
@@ -4,7 +4,7 @@ import React from "react";
import { Project } from "api/models";
import { getAllActiveProjectsByUser } from "backend";
import { getUserId } from "backend/localStorage";
-import { randomIntString } from "utilities";
+import { randomIntString } from "utilities/utilities";
interface SwitchProps {
project: Project;
diff --git a/src/components/ProjectSettings/ProjectUsers/tests/EmailInvite.test.tsx b/src/components/ProjectSettings/ProjectUsers/tests/EmailInvite.test.tsx
index 0e6e6c29e1..73536a5969 100644
--- a/src/components/ProjectSettings/ProjectUsers/tests/EmailInvite.test.tsx
+++ b/src/components/ProjectSettings/ProjectUsers/tests/EmailInvite.test.tsx
@@ -1,6 +1,6 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next.ts";
+import "tests/reactI18nextMock.ts";
import LoadingDoneButton from "components/Buttons/LoadingDoneButton";
import EmailInvite from "components/ProjectSettings/ProjectUsers/EmailInvite";
diff --git a/src/components/ProjectSettings/ProjectUsers/tests/SortOptions.test.tsx b/src/components/ProjectSettings/ProjectUsers/tests/SortOptions.test.tsx
index d293940381..fcb1c2318c 100644
--- a/src/components/ProjectSettings/ProjectUsers/tests/SortOptions.test.tsx
+++ b/src/components/ProjectSettings/ProjectUsers/tests/SortOptions.test.tsx
@@ -1,6 +1,6 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next.ts";
+import "tests/reactI18nextMock.ts";
import SortOptions, {
SortOptionsProps,
diff --git a/src/components/ProjectSettings/ProjectUsers/tests/UserList.test.tsx b/src/components/ProjectSettings/ProjectUsers/tests/UserList.test.tsx
index 4a4868593c..c23ec3fd5f 100644
--- a/src/components/ProjectSettings/ProjectUsers/tests/UserList.test.tsx
+++ b/src/components/ProjectSettings/ProjectUsers/tests/UserList.test.tsx
@@ -1,7 +1,7 @@
import { Input, ListItem } from "@mui/material";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next.ts";
+import "tests/reactI18nextMock.ts";
import { User } from "api/models";
import UserList from "components/ProjectSettings/ProjectUsers/UserList";
diff --git a/src/components/Pronunciations/tests/Pronunciations.test.tsx b/src/components/Pronunciations/tests/Pronunciations.test.tsx
index 25662a6cbf..928c8d5a20 100644
--- a/src/components/Pronunciations/tests/Pronunciations.test.tsx
+++ b/src/components/Pronunciations/tests/Pronunciations.test.tsx
@@ -3,7 +3,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import AudioPlayer from "components/Pronunciations/AudioPlayer";
import AudioRecorder from "components/Pronunciations/AudioRecorder";
diff --git a/src/components/SiteSettings/ProjectManagement/tests/ProjectManagement.test.tsx b/src/components/SiteSettings/ProjectManagement/tests/ProjectManagement.test.tsx
index 017980eea4..aeb84639ce 100644
--- a/src/components/SiteSettings/ProjectManagement/tests/ProjectManagement.test.tsx
+++ b/src/components/SiteSettings/ProjectManagement/tests/ProjectManagement.test.tsx
@@ -1,7 +1,7 @@
import { ListItem } from "@mui/material";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import ExportButton from "components/ProjectExport/ExportButton";
import ProjectButtonWithConfirmation from "components/SiteSettings/ProjectManagement/ProjectButtonWithConfirmation";
diff --git a/src/components/Statistics/tests/DomainStatistics.test.tsx b/src/components/Statistics/tests/DomainStatistics.test.tsx
index 98c84e9aaf..ac1338bc49 100644
--- a/src/components/Statistics/tests/DomainStatistics.test.tsx
+++ b/src/components/Statistics/tests/DomainStatistics.test.tsx
@@ -1,7 +1,7 @@
import { ListItem } from "@mui/material";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { SemanticDomainCount } from "api";
import DomainStatistics from "components/Statistics/DomainStatistics";
diff --git a/src/components/Statistics/tests/Statistics.test.tsx b/src/components/Statistics/tests/Statistics.test.tsx
index 3c77c92020..cb67e5c49b 100644
--- a/src/components/Statistics/tests/Statistics.test.tsx
+++ b/src/components/Statistics/tests/Statistics.test.tsx
@@ -1,7 +1,7 @@
import { StyledEngineProvider, ThemeProvider } from "@mui/material/styles";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import Statistics from "components/Statistics/Statistics";
import { newProject } from "types/project";
diff --git a/src/components/Statistics/tests/UserStatistics.test.tsx b/src/components/Statistics/tests/UserStatistics.test.tsx
index dfedb3283f..20f4a0254d 100644
--- a/src/components/Statistics/tests/UserStatistics.test.tsx
+++ b/src/components/Statistics/tests/UserStatistics.test.tsx
@@ -1,7 +1,7 @@
import { ListItem } from "@mui/material";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { SemanticDomainUserCount } from "api";
import UserStatistics from "components/Statistics/UserStatistics";
diff --git a/src/components/TreeView/tests/DomainTile.test.tsx b/src/components/TreeView/tests/DomainTile.test.tsx
index c27c9c442d..e41143326f 100644
--- a/src/components/TreeView/tests/DomainTile.test.tsx
+++ b/src/components/TreeView/tests/DomainTile.test.tsx
@@ -1,10 +1,10 @@
import { Button } from "@mui/material";
import renderer from "react-test-renderer";
-import "tests/mockReactI18next.ts";
+import "tests/reactI18nextMock.ts";
import DomainTile, { Direction } from "components/TreeView/DomainTile";
-import domMap, { mapIds } from "components/TreeView/tests/MockSemanticDomain";
+import domMap, { mapIds } from "components/TreeView/tests/SemanticDomainMock";
let tileMaster: renderer.ReactTestRenderer;
const MOCK_ANIMATE = jest.fn();
diff --git a/src/components/TreeView/tests/MockSemanticDomain.ts b/src/components/TreeView/tests/SemanticDomainMock.ts
similarity index 100%
rename from src/components/TreeView/tests/MockSemanticDomain.ts
rename to src/components/TreeView/tests/SemanticDomainMock.ts
diff --git a/src/components/TreeView/tests/TreeDepiction.test.tsx b/src/components/TreeView/tests/TreeDepiction.test.tsx
index b702cadc2c..6a3ba83513 100644
--- a/src/components/TreeView/tests/TreeDepiction.test.tsx
+++ b/src/components/TreeView/tests/TreeDepiction.test.tsx
@@ -1,12 +1,12 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next.ts";
+import "tests/reactI18nextMock.ts";
import { SemanticDomainTreeNode } from "api";
import TreeDepiction from "components/TreeView/TreeDepiction";
import testDomainMap, {
mapIds,
-} from "components/TreeView/tests/MockSemanticDomain";
+} from "components/TreeView/tests/SemanticDomainMock";
let treeMaster: renderer.ReactTestRenderer;
diff --git a/src/components/TreeView/tests/TreeSearch.test.tsx b/src/components/TreeView/tests/TreeSearch.test.tsx
index c832a2b9d9..b36db9d4af 100644
--- a/src/components/TreeView/tests/TreeSearch.test.tsx
+++ b/src/components/TreeView/tests/TreeSearch.test.tsx
@@ -4,7 +4,7 @@ import userEvent from "@testing-library/user-event";
import React from "react";
import { Key } from "ts-key-enum";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { SemanticDomainTreeNode } from "api";
import * as backend from "backend";
@@ -14,7 +14,7 @@ import TreeSearch, {
TreeSearchProps,
useTreeSearch,
} from "components/TreeView/TreeSearch";
-import domMap, { mapIds } from "components/TreeView/tests/MockSemanticDomain";
+import domMap, { mapIds } from "components/TreeView/tests/SemanticDomainMock";
import { newSemanticDomainTreeNode } from "types/semanticDomain";
// Handles
diff --git a/src/components/TreeView/tests/TreeViewComponent.test.tsx b/src/components/TreeView/tests/TreeViewComponent.test.tsx
index d687e1b34c..9e96f65418 100644
--- a/src/components/TreeView/tests/TreeViewComponent.test.tsx
+++ b/src/components/TreeView/tests/TreeViewComponent.test.tsx
@@ -3,12 +3,12 @@ import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
import thunk from "redux-thunk";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import TreeDepiction from "components/TreeView/TreeDepiction";
import TreeView from "components/TreeView/TreeViewComponent";
import { defaultState as treeViewState } from "components/TreeView/TreeViewReducer";
-import mockMap, { mapIds } from "components/TreeView/tests/MockSemanticDomain";
+import mockMap, { mapIds } from "components/TreeView/tests/SemanticDomainMock";
import { newWritingSystem } from "types/writingSystem";
let treeMaster: renderer.ReactTestRenderer;
diff --git a/src/components/TreeView/tests/TreeViewHeader.test.tsx b/src/components/TreeView/tests/TreeViewHeader.test.tsx
index 946b27a585..3276d7ef08 100644
--- a/src/components/TreeView/tests/TreeViewHeader.test.tsx
+++ b/src/components/TreeView/tests/TreeViewHeader.test.tsx
@@ -2,14 +2,14 @@ import { render } from "@testing-library/react";
import { renderHook } from "@testing-library/react-hooks";
import { Key } from "ts-key-enum";
-import "tests/mockReactI18next.ts";
+import "tests/reactI18nextMock.ts";
import {
TreeViewHeader,
TreeHeaderProps,
useTreeNavigation,
} from "components/TreeView/TreeViewHeader";
-import domMap, { mapIds } from "components/TreeView/tests/MockSemanticDomain";
+import domMap, { mapIds } from "components/TreeView/tests/SemanticDomainMock";
import { semDomFromTreeNode } from "types/semanticDomain";
// Handles
diff --git a/src/components/UserSettings/tests/AvatarUpload.test.tsx b/src/components/UserSettings/tests/AvatarUpload.test.tsx
index 5a22ed14e3..301a45b108 100644
--- a/src/components/UserSettings/tests/AvatarUpload.test.tsx
+++ b/src/components/UserSettings/tests/AvatarUpload.test.tsx
@@ -2,7 +2,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import AvatarUpload from "components/UserSettings/AvatarUpload";
diff --git a/src/goals/CharInventoryCreation/tests/CharacterInventoryComponent.test.tsx b/src/goals/CharInventoryCreation/tests/CharacterInventoryComponent.test.tsx
index 9724b2c16d..e34a1d3743 100644
--- a/src/goals/CharInventoryCreation/tests/CharacterInventoryComponent.test.tsx
+++ b/src/goals/CharInventoryCreation/tests/CharacterInventoryComponent.test.tsx
@@ -2,7 +2,7 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { Project } from "api/models";
import CharacterInventoryWithTranslate, {
diff --git a/src/goals/DefaultGoal/NextGoalScreen.tsx b/src/goals/DefaultGoal/NextGoalScreen.tsx
index 4467f6c796..920e298a2c 100644
--- a/src/goals/DefaultGoal/NextGoalScreen.tsx
+++ b/src/goals/DefaultGoal/NextGoalScreen.tsx
@@ -5,9 +5,9 @@ import { asyncAddGoal } from "components/GoalTimeline/Redux/GoalActions";
import PageNotFound from "components/PageNotFound/component";
import { MergeDupContinueDialog } from "goals/MergeDupGoal/MergeDupComponent/MergeDupContinueDialog";
import { StoreState } from "types";
-import { goalTypeToGoal } from "types/goalUtilities";
import { GoalType } from "types/goals";
import { useAppDispatch, useAppSelector } from "types/hooks";
+import { goalTypeToGoal } from "utilities/goalUtilities";
/**
* Dialog for continuing to a new goal or returning to GoalTimeline.
diff --git a/src/goals/DefaultGoal/tests/BaseGoalScreen.test.tsx b/src/goals/DefaultGoal/tests/BaseGoalScreen.test.tsx
index 53a5711fc6..c434275f15 100644
--- a/src/goals/DefaultGoal/tests/BaseGoalScreen.test.tsx
+++ b/src/goals/DefaultGoal/tests/BaseGoalScreen.test.tsx
@@ -4,7 +4,7 @@ import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
import thunk from "redux-thunk";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import { BaseGoalScreen } from "goals/DefaultGoal/BaseGoalScreen";
import { Goal } from "types/goals";
diff --git a/src/goals/DefaultGoal/tests/DisplayProgress.test.tsx b/src/goals/DefaultGoal/tests/DisplayProgress.test.tsx
index f5c8e07047..7b3fff92af 100644
--- a/src/goals/DefaultGoal/tests/DisplayProgress.test.tsx
+++ b/src/goals/DefaultGoal/tests/DisplayProgress.test.tsx
@@ -3,7 +3,7 @@ import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
import thunk from "redux-thunk";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import DisplayProgress from "goals/DefaultGoal/DisplayProgress";
import { MergeDups } from "goals/MergeDupGoal/MergeDups";
diff --git a/src/goals/MergeDupGoal/Redux/MergeDupActions.ts b/src/goals/MergeDupGoal/Redux/MergeDupActions.ts
index c3c32e931a..326a58cd10 100644
--- a/src/goals/MergeDupGoal/Redux/MergeDupActions.ts
+++ b/src/goals/MergeDupGoal/Redux/MergeDupActions.ts
@@ -39,10 +39,10 @@ import {
} from "goals/MergeDupGoal/Redux/MergeDupReduxTypes";
import { StoreState } from "types";
import { StoreStateDispatch } from "types/Redux/actions";
-import { maxNumSteps } from "types/goalUtilities";
import { GoalType } from "types/goals";
import { Hash } from "types/hash";
-import { compareFlags } from "types/wordUtilities";
+import { maxNumSteps } from "utilities/goalUtilities";
+import { compareFlags } from "utilities/wordUtilities";
// Action Creators
diff --git a/src/goals/MergeDupGoal/Redux/tests/MergeDupActions.test.tsx b/src/goals/MergeDupGoal/Redux/tests/MergeDupActions.test.tsx
index e5ca3d2f7f..94fc4b9892 100644
--- a/src/goals/MergeDupGoal/Redux/tests/MergeDupActions.test.tsx
+++ b/src/goals/MergeDupGoal/Redux/tests/MergeDupActions.test.tsx
@@ -25,7 +25,7 @@ import {
MergeTreeActionTypes,
MergeTreeState,
} from "goals/MergeDupGoal/Redux/MergeDupReduxTypes";
-import { goalDataMock } from "goals/MergeDupGoal/Redux/tests/MockMergeDupData";
+import { goalDataMock } from "goals/MergeDupGoal/Redux/tests/MergeDupDataMock";
import { GoalsState, GoalType } from "types/goals";
import {
multiSenseWord,
diff --git a/src/goals/MergeDupGoal/Redux/tests/MockMergeDupData.ts b/src/goals/MergeDupGoal/Redux/tests/MergeDupDataMock.ts
similarity index 100%
rename from src/goals/MergeDupGoal/Redux/tests/MockMergeDupData.ts
rename to src/goals/MergeDupGoal/Redux/tests/MergeDupDataMock.ts
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellColumns.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/CellColumns.tsx
index b6b62c847c..bc6701e340 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellColumns.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/CellColumns.tsx
@@ -19,7 +19,7 @@ import {
ReviewEntriesWord,
ReviewEntriesWordField,
} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes";
-import { compareFlags } from "types/wordUtilities";
+import { compareFlags } from "utilities/wordUtilities";
enum SortStyle {
// vernacular, noteText: neither have a customSort defined,
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DeleteCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DeleteCell.test.tsx
index 0062eea132..33478aeece 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DeleteCell.test.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DeleteCell.test.tsx
@@ -2,11 +2,11 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import DeleteCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DeleteCell";
import { defaultState as reviewEntriesState } from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes";
-import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords";
+import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock";
const mockStore = configureMockStore()({ reviewEntriesState });
const mockWord = mockWords()[0];
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DomainCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DomainCell.test.tsx
index b5de735773..565c2e775d 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DomainCell.test.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DomainCell.test.tsx
@@ -2,10 +2,10 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import DomainCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DomainCell";
-import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords";
+import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock";
jest.mock("components/TreeView/TreeViewComponent", () => "div");
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/FlagCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/FlagCell.test.tsx
index af7970aa1d..55db90d5a9 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/FlagCell.test.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/FlagCell.test.tsx
@@ -1,9 +1,9 @@
import renderer from "react-test-renderer";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import FlagCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/FlagCell";
-import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords";
+import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock";
const mockWord = mockWords()[1];
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/GlossCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/GlossCell.test.tsx
index 3610bc04e7..9f730d28b7 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/GlossCell.test.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/GlossCell.test.tsx
@@ -2,10 +2,10 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import GlossCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/GlossCell";
-import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords";
+import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock";
import { defaultWritingSystem } from "types/writingSystem";
// The multiline Input, TextField cause problems in the mock environment.
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes.ts b/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes.ts
index 1107cedd5f..6d4bdbab39 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes.ts
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes.ts
@@ -9,7 +9,7 @@ import {
} from "api/models";
import Recorder from "components/Pronunciations/Recorder";
import { newSense, newWord } from "types/word";
-import { cleanDefinitions, cleanGlosses } from "types/wordUtilities";
+import { cleanDefinitions, cleanGlosses } from "utilities/wordUtilities";
// These must match the ReviewEntriesWord fields for use in ReviewEntriesTable
export enum ReviewEntriesWordField {
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/CellColumns.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/CellColumns.test.tsx
index 9c192a54cd..1be69aa206 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/CellColumns.test.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/CellColumns.test.tsx
@@ -1,4 +1,4 @@
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import columns, {
ColumnTitle,
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesComponent.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesComponent.test.tsx
index f4c1664a4e..f2b4a35b16 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesComponent.test.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesComponent.test.tsx
@@ -3,12 +3,12 @@ import { Provider } from "react-redux";
import renderer from "react-test-renderer";
import configureMockStore from "redux-mock-store";
-import "tests/mockReactI18next";
+import "tests/reactI18nextMock";
import ReviewEntriesComponent from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesComponent";
import mockWords, {
mockCreateWord,
-} from "goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords";
+} from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock";
const mockGetFrontierWords = jest.fn();
const mockMaterialTable = jest.fn();
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesReducer.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesReducer.test.tsx
index 24cf181d54..4b3ca74e49 100644
--- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesReducer.test.tsx
+++ b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesReducer.test.tsx
@@ -7,7 +7,7 @@ import {
ReviewEntriesSense,
ReviewEntriesWord,
} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes";
-import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords";
+import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock";
import { newSemanticDomain } from "types/semanticDomain";
import { Bcp47Code } from "types/writingSystem";
diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords.ts b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock.ts
similarity index 100%
rename from src/goals/ReviewEntries/ReviewEntriesComponent/tests/MockWords.ts
rename to src/goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock.ts
diff --git a/src/tests/i18nMock.ts b/src/tests/i18nMock.ts
index dcc9e8c1ac..f108ddcd06 100644
--- a/src/tests/i18nMock.ts
+++ b/src/tests/i18nMock.ts
@@ -1,6 +1,6 @@
/* Adapted from https://react.i18next.com/misc/testing
* (In most cases, this isn't needed.
- * Instead you can use tests/mockReactI18next.ts to mock out i18n completely.)
+ * Instead you can use tests/reactI18nextMock.ts to mock out i18n completely.)
* For a simple i18next wrapper, add the following to a test file:
* * import { I18nextProvider } from "react-i18next";
* * import i18n from "tests/i18nMock";
diff --git a/src/tests/mockReactI18next.ts b/src/tests/reactI18nextMock.ts
similarity index 90%
rename from src/tests/mockReactI18next.ts
rename to src/tests/reactI18nextMock.ts
index 59d5d7337d..7b1f83d221 100644
--- a/src/tests/mockReactI18next.ts
+++ b/src/tests/reactI18nextMock.ts
@@ -1,4 +1,4 @@
-/* Use `import "tests/mockReactI18next.ts";` in a test file to mock i18next.
+/* Use `import "tests/reactI18nextMock.ts";` in a test file to mock i18next.
* (For testing components with `Trans`, see tests/i18nMock.ts instead.)
* This import should be placed before the other internal imports.
* It must come before any file that imports `react-i18next`. */
diff --git a/src/types/project.ts b/src/types/project.ts
index a29a9d17b6..2565188d80 100644
--- a/src/types/project.ts
+++ b/src/types/project.ts
@@ -1,6 +1,6 @@
import { AutocompleteSetting, Project } from "api/models";
import { newWritingSystem } from "types/writingSystem";
-import { randomIntString } from "utilities";
+import { randomIntString } from "utilities/utilities";
export function newProject(name = ""): Project {
return {
diff --git a/src/types/word.ts b/src/types/word.ts
index 818060c318..209e7ce942 100644
--- a/src/types/word.ts
+++ b/src/types/word.ts
@@ -10,7 +10,7 @@ import {
Status,
Word,
} from "api/models";
-import { randomIntString } from "utilities";
+import { randomIntString } from "utilities/utilities";
export function newDefinition(text = "", language = ""): Definition {
return { text, language };
diff --git a/src/types/goalUtilities.ts b/src/utilities/goalUtilities.ts
similarity index 100%
rename from src/types/goalUtilities.ts
rename to src/utilities/goalUtilities.ts
diff --git a/src/types/tests/goalUtilities.test.tsx b/src/utilities/tests/goalUtilities.test.ts
similarity index 90%
rename from src/types/tests/goalUtilities.test.tsx
rename to src/utilities/tests/goalUtilities.test.ts
index 2cae5fb9de..08f81088c8 100644
--- a/src/types/tests/goalUtilities.test.tsx
+++ b/src/utilities/tests/goalUtilities.test.ts
@@ -1,12 +1,12 @@
import { MergeUndoIds } from "api/models";
import { MergeDups } from "goals/MergeDupGoal/MergeDups";
-import { goalDataMock } from "goals/MergeDupGoal/Redux/tests/MockMergeDupData";
+import { goalDataMock } from "goals/MergeDupGoal/Redux/tests/MergeDupDataMock";
+import { Goal } from "types/goals";
import {
convertEditToGoal,
convertGoalToEdit,
maxNumSteps,
-} from "types/goalUtilities";
-import { Goal } from "types/goals";
+} from "utilities/goalUtilities";
describe("goalUtilities", () => {
describe("convertGoalToEdit, convertEditToGoal", () => {
diff --git a/src/tests/utilities.test.ts b/src/utilities/tests/utilities.test.ts
similarity index 96%
rename from src/tests/utilities.test.ts
rename to src/utilities/tests/utilities.test.ts
index 5f5df4c16e..3ea3f31ae7 100644
--- a/src/tests/utilities.test.ts
+++ b/src/utilities/tests/utilities.test.ts
@@ -1,6 +1,6 @@
-import * as utilities from "utilities";
+import * as utilities from "utilities/utilities";
-describe("utilities", () => {
+describe("utilities/utilities", () => {
describe("quicksort", () => {
const compareItem = (input: number) => {
return input;
diff --git a/src/types/tests/wordUtilities.test.tsx b/src/utilities/tests/wordUtilities.test.ts
similarity index 99%
rename from src/types/tests/wordUtilities.test.tsx
rename to src/utilities/tests/wordUtilities.test.ts
index 990ea2c778..bb96304972 100644
--- a/src/types/tests/wordUtilities.test.tsx
+++ b/src/utilities/tests/wordUtilities.test.ts
@@ -13,7 +13,7 @@ import {
firstGlossText,
getAnalysisLangsFromWords,
sep,
-} from "types/wordUtilities";
+} from "utilities/wordUtilities";
describe("wordUtilities", () => {
describe("cleanDefinitions", () => {
diff --git a/src/utilities.ts b/src/utilities/utilities.ts
similarity index 100%
rename from src/utilities.ts
rename to src/utilities/utilities.ts
diff --git a/src/types/wordUtilities.ts b/src/utilities/wordUtilities.ts
similarity index 100%
rename from src/types/wordUtilities.ts
rename to src/utilities/wordUtilities.ts