Merge branch 'feature/client_printExport' into 'main'

Print/Export functionality

See merge request cse1105/2025-2026/teams/csep-team-76!19
This commit is contained in:
Zhongheng Liu 2025-12-19 23:28:49 +01:00
commit 4fc4ca7327
2 changed files with 137 additions and 0 deletions

View file

@ -0,0 +1,67 @@
package client.utils;
import commons.Recipe;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class PrintExportService {
/**
* Builds the String with all the recipe data in a human-readable format and returns said string
* @param recipe - Recipe Object that needs to be converted
* @return - String Result that is the converted recipe object
*/
public static String buildRecipeText(Recipe recipe){
String result = "Title: " + recipe.getName() + "\nRecipe ID: " + recipe.getId() + "\n" +
"Ingredients: "; //Starts the string with name and recipe ID
for(int i =0; i<recipe.getIngredients().size();i++){ // For loop adding ingredients one by one
result += recipe.getIngredients().get(i) + ", ";
}
result += "\nSteps:\n";
for(int i =0; i<recipe.getPreparationSteps().size();i++){ // Preparation Steps separated by new lines
result += (i+1) + ": " + recipe.getPreparationSteps().get(i) + "\n";
}
return result;
}
/**
* Method that checks if the directory path of the selected directory is valid and throws and error
* if not valid
* @param path - Path to directory
*/
public static void validateFolder(Path path){
if (path == null) { //Null path value
throw new IllegalArgumentException("Path is empty");
}
if(!Files.exists(path)){ //If Folder doesn't exist
throw new IllegalArgumentException("Folder does not exist");
}
if(!Files.isDirectory(path)){ // If folder is not directory
throw new IllegalArgumentException("Given path is not a folder");
}
}
/**
* Method that exports a plain-text String of recipe data, into a newly created file from
* a selected directory provided as a path to the method and names said file based on the
* nameOfFile param
* @param recipeData - String containing recipe data that will be written to file
* @param dirFilePath - Path to Folder
* @param nameOfFile - Name of file to be created
*/
public static void exportToFile(String recipeData, Path dirFilePath, String nameOfFile){
validateFolder(dirFilePath); //runs validate Folder method to check if Directory path is valid
Path filePath = dirFilePath.resolve(nameOfFile); //Creates a file with name provided in directory and stores path in PATH object
try {
Files.writeString(filePath, recipeData); // Writes the recipe data into the File.
}
catch (IOException e){
System.err.println("An error occurred while writing to the file");
}
}
}

View file

@ -0,0 +1,70 @@
package client.scenes;
import client.utils.PrintExportService;
import client.utils.ServerUtils;
import commons.Recipe;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
public class PrintExportTest {
static ServerUtils dv = new ServerUtils();
@BeforeEach
public void setup(){
Assumptions.assumeTrue(dv.isServerAvailable(), "Server not available");
}
@Test
public void buildRecipeTextTest(){
List<String> ingredients = new ArrayList<>();
ingredients.add("Banana");
ingredients.add("Bread");
final long testRecipeId = 1234L;
List<String> preparationSteps = new ArrayList<>();
preparationSteps.add("Mix Ingredients");
preparationSteps.add("Heat in Oven");
Recipe recipe1 = new Recipe(testRecipeId, "Banana Bread", ingredients, preparationSteps);
assertEquals("""
Title: Banana Bread
Recipe ID: 1234
Ingredients: Banana, Bread,\s
Steps:
1: Mix Ingredients
2: Heat in Oven
""", PrintExportService.buildRecipeText(recipe1));
}
@TempDir
Path tempDir;
@Test
public void validateFolderWithValidFolderTest(){
assertDoesNotThrow(() -> PrintExportService.validateFolder(tempDir));
}
@Test
public void validateFolderWithNullPathTest(){
IllegalArgumentException i = assertThrows(IllegalArgumentException.class,
()->PrintExportService.validateFolder(null));
assertEquals("Path is empty", i.getMessage());
}
@Test
public void validateFolderWithFilePathTest() throws IOException {
Path filePath = Files.createFile(tempDir.resolve("TestFile"));
IllegalArgumentException i = assertThrows(IllegalArgumentException.class,
()->PrintExportService.validateFolder(filePath));
assertEquals("Given path is not a folder", i.getMessage());
}
}