From 4276dc15b12c322083778c0c2b341dd31bece5ac Mon Sep 17 00:00:00 2001
From: Andreas Svanberg <andreass@dsv.su.se>
Date: Mon, 17 Feb 2025 15:32:38 +0100
Subject: [PATCH] Infrastructure for creating individual populators for
 specific test cases.

---
 .../se/su/dsv/scipro/testdata/BaseData.java   | 19 +++++++++++++++++++
 .../se/su/dsv/scipro/testdata/Factory.java    | 12 ++++++++++++
 .../scipro/testdata/TestDataPopulator.java    | 11 +++++++++++
 3 files changed, 42 insertions(+)
 create mode 100644 test-data/src/main/java/se/su/dsv/scipro/testdata/BaseData.java
 create mode 100644 test-data/src/main/java/se/su/dsv/scipro/testdata/Factory.java
 create mode 100644 test-data/src/main/java/se/su/dsv/scipro/testdata/TestDataPopulator.java

diff --git a/test-data/src/main/java/se/su/dsv/scipro/testdata/BaseData.java b/test-data/src/main/java/se/su/dsv/scipro/testdata/BaseData.java
new file mode 100644
index 0000000000..1dd6b18132
--- /dev/null
+++ b/test-data/src/main/java/se/su/dsv/scipro/testdata/BaseData.java
@@ -0,0 +1,19 @@
+package se.su.dsv.scipro.testdata;
+
+import se.su.dsv.scipro.system.ProjectType;
+
+/// All the base test data that can be re-used in different test cases.
+///
+/// **Do not modify any of this data.** There are many
+/// [TestDataPopulator]s that rely on this data to be in a specific state.
+///
+/// In addition to the data that is available here there is also much additional
+/// data that has been created;
+///
+///   - A grading report template for each [ProjectType]
+///
+public interface BaseData {
+    ProjectType bachelor();
+    ProjectType magister();
+    ProjectType master();
+}
diff --git a/test-data/src/main/java/se/su/dsv/scipro/testdata/Factory.java b/test-data/src/main/java/se/su/dsv/scipro/testdata/Factory.java
new file mode 100644
index 0000000000..4a9ae43a77
--- /dev/null
+++ b/test-data/src/main/java/se/su/dsv/scipro/testdata/Factory.java
@@ -0,0 +1,12 @@
+package se.su.dsv.scipro.testdata;
+
+import se.su.dsv.scipro.system.User;
+
+/**
+ * A factory to help with repetitive tasks when populating test data.
+ */
+public interface Factory {
+    User createAuthor(String firstName);
+    User createSupervisor(String firstName);
+    User createReviewer(String firstName);
+}
diff --git a/test-data/src/main/java/se/su/dsv/scipro/testdata/TestDataPopulator.java b/test-data/src/main/java/se/su/dsv/scipro/testdata/TestDataPopulator.java
new file mode 100644
index 0000000000..41d250ac71
--- /dev/null
+++ b/test-data/src/main/java/se/su/dsv/scipro/testdata/TestDataPopulator.java
@@ -0,0 +1,11 @@
+package se.su.dsv.scipro.testdata;
+
+public interface TestDataPopulator {
+    /**
+     * Add test data to the system to help with testing a specific feature.
+     *
+     * @param baseData the base data already populated
+     * @param factory helper object to make repetitive tasks easier (such as creating users)
+     */
+    void populate(BaseData baseData, Factory factory);
+}