From 9669fffde304766a9b8548dfd3ce1ec1e4922a6a Mon Sep 17 00:00:00 2001 From: Stamatis Zampetakis Date: Thu, 14 Dec 2023 23:01:44 +0100 Subject: [PATCH] F!! Add auto approve reporter based on system properties The new reporter will automatically approve the changeset (copy received to approved) when a specified System property is set (to true or it is simply present). The goal is to allow to update easily all relevant files from the tests that are run, without requiring code changes but in a controlled manner (only when the user explicitly sets the property). --- ...utoApproveWhenPropertySetReporterTest.java | 50 +++++++++++++++++++ .../AutoApproveWhenPropertySetReporter.java | 45 +++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 approvaltests-tests/src/test/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporterTest.java create mode 100644 approvaltests/src/main/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporter.java diff --git a/approvaltests-tests/src/test/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporterTest.java b/approvaltests-tests/src/test/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporterTest.java new file mode 100644 index 000000000..473f71d26 --- /dev/null +++ b/approvaltests-tests/src/test/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporterTest.java @@ -0,0 +1,50 @@ +package org.approvaltests.reporters; + +import com.spun.util.io.FileUtils; +import org.approvaltests.Approvals; +import org.approvaltests.core.Options; +import org.approvaltests.namer.NamerWrapper; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class AutoApproveWhenPropertySetReporterTest +{ + @Test + void testWhenPropertyIsSet() + { + NamerWrapper namer = new NamerWrapper(Approvals.createApprovalNamer()); + cleanupFiles(namer); + System.setProperty("org.approvaltests.reporters.autoapprove", "true"); + Approvals.verify("applesauce", new Options().withReporter(new AutoApproveWhenPropertySetReporter())); + assertTrue(namer.getApprovalFile(".txt").exists()); + assertFalse(namer.getReceivedFile((".txt")).exists()); + cleanupFiles(namer); + } + @Test + void testWhenPropertyNotSet() + { + System.clearProperty("org.approvaltests.reporters.autoapprove"); + NamerWrapper namer = new NamerWrapper(Approvals.createApprovalNamer()); + cleanupFiles(namer); + try + { + Approvals.verify("applesauce", + new Options().withReporter(new AutoApproveWhenPropertySetReporter(new UseReporterTest.TestReporter(), + "org.approvaltests.reporters.autoapprove"))); + } + catch (Throwable t) + { + assertTrue(t.getMessage().startsWith("Failed Approval")); + } + assertFalse(namer.getApprovalFile(".txt").exists()); + assertTrue(namer.getReceivedFile(".txt").exists()); + cleanupFiles(namer); + } + private static void cleanupFiles(NamerWrapper namer) + { + FileUtils.delete(namer.getApprovalFile(".txt")); + FileUtils.delete(namer.getReceivedFile((".txt"))); + } +} diff --git a/approvaltests/src/main/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporter.java b/approvaltests/src/main/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporter.java new file mode 100644 index 000000000..24c985add --- /dev/null +++ b/approvaltests/src/main/java/org/approvaltests/reporters/AutoApproveWhenPropertySetReporter.java @@ -0,0 +1,45 @@ +package org.approvaltests.reporters; + +import com.spun.util.io.FileUtils; +import org.approvaltests.Approvals; +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.core.VerifyResult; + +import java.io.File; + +public class AutoApproveWhenPropertySetReporter implements ReporterWithApprovalPower +{ + private final ApprovalFailureReporter reporter; + private final String property; + private VerifyResult result; + public AutoApproveWhenPropertySetReporter() + { + this(Approvals.getReporter(), "org.approvaltests.reporters.autoapprove"); + } + public AutoApproveWhenPropertySetReporter(ApprovalFailureReporter reporter, String property) + { + this.reporter = reporter; + this.property = property; + } + @Override + public boolean report(String received, String approved) + { + String v = System.getProperty(property); + if ("".equals(v) || "true".equalsIgnoreCase(v)) + { + FileUtils.copyFile(new File(received), new File(approved)); + result = VerifyResult.SUCCESS; + } + else + { + reporter.report(received, approved); + result = VerifyResult.FAILURE; + } + return true; + } + @Override + public VerifyResult approveWhenReported() + { + return result; + } +}