BAEL-6812 Test Main Method with JUnit
- added sample to test main method with different architecture
This commit is contained in:
		
							parent
							
								
									63033cd8cf
								
							
						
					
					
						commit
						fd6b6aa6d5
					
				
							
								
								
									
										2
									
								
								testing-modules/junit-5-basics-2/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								testing-modules/junit-5-basics-2/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | ### Relevant Articles: | ||||||
|  | - [Test Main Method with JUnit](http://www.baeldung.com/junit-5) | ||||||
							
								
								
									
										60
									
								
								testing-modules/junit-5-basics-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								testing-modules/junit-5-basics-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||||
|  |          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  |          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|  |     <modelVersion>4.0.0</modelVersion> | ||||||
|  |     <parent> | ||||||
|  |         <groupId>com.baeldung</groupId> | ||||||
|  |         <artifactId>parent-modules</artifactId> | ||||||
|  |         <version>1.0.0-SNAPSHOT</version> | ||||||
|  |     </parent> | ||||||
|  | 
 | ||||||
|  |     <artifactId>junit-5-basics-2</artifactId> | ||||||
|  | 
 | ||||||
|  |     <dependencies> | ||||||
|  |         <!-- https://mvnrepository.com/artifact/commons-cli/commons-cli --> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>commons-cli</groupId> | ||||||
|  |             <artifactId>commons-cli</artifactId> | ||||||
|  |             <version>${commons-cli.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |         <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.junit.jupiter</groupId> | ||||||
|  |             <artifactId>junit-jupiter-api</artifactId> | ||||||
|  |             <version>${junit-jupiter-api.version}</version> | ||||||
|  |             <scope>test</scope> | ||||||
|  |         </dependency> | ||||||
|  |         <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core --> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.mockito</groupId> | ||||||
|  |             <artifactId>mockito-core</artifactId> | ||||||
|  |             <version>${mockito-core.version}</version> | ||||||
|  |             <scope>test</scope> | ||||||
|  |         </dependency> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     </dependencies> | ||||||
|  |     <build> | ||||||
|  |         <plugins> | ||||||
|  |             <plugin> | ||||||
|  |                 <groupId>org.apache.maven.plugins</groupId> | ||||||
|  |                 <artifactId>maven-compiler-plugin</artifactId> | ||||||
|  |                 <configuration> | ||||||
|  |                     <source>11</source> | ||||||
|  |                     <target>11</target> | ||||||
|  |                 </configuration> | ||||||
|  |             </plugin> | ||||||
|  |         </plugins> | ||||||
|  |     </build> | ||||||
|  | 
 | ||||||
|  |     <properties> | ||||||
|  |         <maven.compiler.source>11</maven.compiler.source> | ||||||
|  |         <maven.compiler.target>11</maven.compiler.target> | ||||||
|  |         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||||
|  |         <commons-cli.version>1.5.0</commons-cli.version> | ||||||
|  |         <junit-jupiter-api.version>5.10.0</junit-jupiter-api.version> | ||||||
|  |         <mockito-core.version>5.4.0</mockito-core.version> | ||||||
|  |     </properties> | ||||||
|  | 
 | ||||||
|  | </project> | ||||||
| @ -0,0 +1,63 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | import org.apache.commons.cli.CommandLine; | ||||||
|  | import org.apache.commons.cli.CommandLineParser; | ||||||
|  | import org.apache.commons.cli.DefaultParser; | ||||||
|  | import org.apache.commons.cli.Option; | ||||||
|  | import org.apache.commons.cli.Options; | ||||||
|  | import org.apache.commons.cli.ParseException; | ||||||
|  | 
 | ||||||
|  | public class Bootstrapper { | ||||||
|  |     private final InputReader inputReader; | ||||||
|  |     private final Calculator calculator; | ||||||
|  | 
 | ||||||
|  |     public Bootstrapper(InputReader inputReader, Calculator calculator) { | ||||||
|  |         this.inputReader = inputReader; | ||||||
|  |         this.calculator = calculator; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void processRequest(String[] args) { | ||||||
|  |         try { | ||||||
|  |             Options options = getOptions(); | ||||||
|  |             CommandLineParser parser = new DefaultParser(); | ||||||
|  |             CommandLine commandLine = parser.parse(options, args); | ||||||
|  | 
 | ||||||
|  |             if (commandLine.hasOption("i")) { | ||||||
|  |                 System.out.print("Option i is present. The value is: " + commandLine.getOptionValue("i") + " \n"); | ||||||
|  |                 String optionValue = commandLine.getOptionValue("i"); | ||||||
|  |                 InputType inputType = InputType.valueOf(optionValue); | ||||||
|  | 
 | ||||||
|  |                 String fileName = null; | ||||||
|  |                 if (commandLine.hasOption("f")) { | ||||||
|  |                     fileName = commandLine.getOptionValue("f"); | ||||||
|  |                 } | ||||||
|  |                 String inputString = inputReader.read(inputType, fileName); | ||||||
|  |                 int calculatedSum = calculator.calculateSum(inputString); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } catch (ParseException exception) { | ||||||
|  |             System.out.print("Parse error: " + exception.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static Options getOptions() { | ||||||
|  |         Option fileNameOption = Option.builder("f") | ||||||
|  |             .required(false) | ||||||
|  |             .desc("The file name option") | ||||||
|  |             .type(String.class) | ||||||
|  |             .build(); | ||||||
|  |         Option inputTypeOption = Option.builder("i") | ||||||
|  |             .longOpt("input") | ||||||
|  |             .required(true) | ||||||
|  |             .desc("The input type") | ||||||
|  |             .type(InputType.class) | ||||||
|  |             .hasArg() | ||||||
|  |             .build(); | ||||||
|  | 
 | ||||||
|  |         Options options = new Options(); | ||||||
|  | 
 | ||||||
|  |         options.addOption(inputTypeOption); | ||||||
|  |         options.addOption(fileNameOption); | ||||||
|  |         return options; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | import java.util.Arrays; | ||||||
|  | 
 | ||||||
|  | public class Calculator { | ||||||
|  | 
 | ||||||
|  |     public int calculateSum(String input) { | ||||||
|  |         String[] array = input.split(" "); | ||||||
|  |         int sum = Arrays.stream(array) | ||||||
|  |             .map(Integer::valueOf) | ||||||
|  |             .mapToInt(Integer::intValue) | ||||||
|  |             .sum(); | ||||||
|  |         System.out.println("Calculated sum: " + sum); | ||||||
|  |         return sum; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.net.URI; | ||||||
|  | import java.nio.file.Files; | ||||||
|  | import java.nio.file.Path; | ||||||
|  | import java.util.Scanner; | ||||||
|  | 
 | ||||||
|  | public class InputReader { | ||||||
|  | 
 | ||||||
|  |     public String read(InputType inputType, String fileName) { | ||||||
|  |         switch (inputType) { | ||||||
|  |         case FILE: | ||||||
|  |             return readFromFile(fileName); | ||||||
|  |         case CONSOLE: | ||||||
|  |             return readFromConsole(); | ||||||
|  |         default: | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private String readFromConsole() { | ||||||
|  |         System.out.println("Enter values for calculation: \n"); | ||||||
|  |         String str = new Scanner(System.in).nextLine(); | ||||||
|  | 
 | ||||||
|  |         return str; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private String readFromFile(String fileName) { | ||||||
|  |         String readString = null; | ||||||
|  |         try { | ||||||
|  |             readString = Files.readString(Path.of(URI.create(fileName))); | ||||||
|  |             System.out.println(readString); | ||||||
|  |         } catch (IOException e) { | ||||||
|  |             throw new RuntimeException(e); | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | public enum InputType { | ||||||
|  |     FILE, CONSOLE | ||||||
|  | } | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | import java.util.Arrays; | ||||||
|  | 
 | ||||||
|  | public class SimpleMain { | ||||||
|  | 
 | ||||||
|  |     public static void main(String[] args) { | ||||||
|  | 
 | ||||||
|  |         System.out.println("Received input parameters: " + Arrays.asList(args)); | ||||||
|  | 
 | ||||||
|  |         Bootstrapper bootstrapper = new Bootstrapper(new InputReader(), new Calculator()); | ||||||
|  | 
 | ||||||
|  |         bootstrapper.processRequest(args); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,118 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.net.URI; | ||||||
|  | import java.nio.file.Files; | ||||||
|  | import java.nio.file.Path; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.Scanner; | ||||||
|  | 
 | ||||||
|  | import org.apache.commons.cli.CommandLine; | ||||||
|  | import org.apache.commons.cli.CommandLineParser; | ||||||
|  | import org.apache.commons.cli.DefaultParser; | ||||||
|  | import org.apache.commons.cli.Option; | ||||||
|  | import org.apache.commons.cli.Options; | ||||||
|  | import org.apache.commons.cli.ParseException; | ||||||
|  | 
 | ||||||
|  | public class StaticMain { | ||||||
|  | 
 | ||||||
|  |     public static void main(String[] args) { | ||||||
|  | 
 | ||||||
|  |         System.out.println("Received input parameters: " + Arrays.asList(args)); | ||||||
|  | 
 | ||||||
|  |         processRequest(args); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void processRequest(String[] args) { | ||||||
|  |         try { | ||||||
|  |             Options options = getOptions(); | ||||||
|  |             CommandLineParser parser = new DefaultParser(); | ||||||
|  |             CommandLine commandLine = parser.parse(options, args); | ||||||
|  | 
 | ||||||
|  |             if (commandLine.hasOption("V")) { | ||||||
|  |                 System.out.print("Option V is present. The value is: "); | ||||||
|  |                 System.out.println(commandLine.getOptionValue("V")); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (commandLine.hasOption("i")) { | ||||||
|  |                 System.out.print("Option i is present. The value is: " + commandLine.getOptionValue("i") + " \n"); | ||||||
|  |                 String optionValue = commandLine.getOptionValue("i"); | ||||||
|  |                 InputType inputType = InputType.valueOf(optionValue); | ||||||
|  | 
 | ||||||
|  |                 String fileName = null; | ||||||
|  |                 if (commandLine.hasOption("f")) { | ||||||
|  |                     fileName = commandLine.getOptionValue("f"); | ||||||
|  |                 } | ||||||
|  |                 String inputString = read(inputType, fileName); | ||||||
|  |                 int calculatedSum = calculateSum(inputString); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } catch (ParseException exception) { | ||||||
|  |             System.out.print("Parse error: "); | ||||||
|  |             System.out.println(exception.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static Options getOptions() { | ||||||
|  | 
 | ||||||
|  |         Option inputTypeOption = Option.builder("i") | ||||||
|  |             .longOpt("input") | ||||||
|  |             .required(true) | ||||||
|  |             .desc("The input type") | ||||||
|  |             .type(InputType.class) | ||||||
|  |             .hasArg() | ||||||
|  |             .build(); | ||||||
|  |         Option fileNameOption = Option.builder("f") | ||||||
|  |             .required(false) | ||||||
|  |             .desc("The file name option") | ||||||
|  |             .type(String.class) | ||||||
|  |             .hasArg() | ||||||
|  |             .build(); | ||||||
|  | 
 | ||||||
|  |         Options options = new Options(); | ||||||
|  | 
 | ||||||
|  |         options.addOption(inputTypeOption); | ||||||
|  |         options.addOption(fileNameOption); | ||||||
|  |         return options; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static int calculateSum(String input) { | ||||||
|  |         if (input == null) { | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |         String[] array = input.split(" "); | ||||||
|  |         int sum = Arrays.stream(array) | ||||||
|  |             .map(Integer::valueOf) | ||||||
|  |             .mapToInt(Integer::intValue) | ||||||
|  |             .sum(); | ||||||
|  |         System.out.println("Calculated sum: " + sum); | ||||||
|  |         return sum; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private static String readFromConsole() { | ||||||
|  |         System.out.println("Enter values for calculation: \n"); | ||||||
|  |         return new Scanner(System.in).nextLine(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private static String readFromFile(String fileName) { | ||||||
|  |         String readString = null; | ||||||
|  |         try { | ||||||
|  |             readString = Files.readString(Path.of(URI.create(fileName))); | ||||||
|  |             System.out.println(readString); | ||||||
|  |         } catch (IOException e) { | ||||||
|  |             throw new RuntimeException(e); | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static String read(InputType inputType, String fileName) { | ||||||
|  |         switch (inputType) { | ||||||
|  |         case FILE: | ||||||
|  |             return readFromFile(fileName); | ||||||
|  |         case CONSOLE: | ||||||
|  |             return readFromConsole(); | ||||||
|  |         default: | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,100 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertTrue; | ||||||
|  | 
 | ||||||
|  | import java.io.ByteArrayInputStream; | ||||||
|  | import java.io.ByteArrayOutputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import java.io.PrintStream; | ||||||
|  | import java.nio.charset.Charset; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.AfterEach; | ||||||
|  | import org.junit.jupiter.api.BeforeEach; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | public class TestSimpleMain { | ||||||
|  |     private InputStream defaultIn; | ||||||
|  |     private PrintStream defaultOut; | ||||||
|  | 
 | ||||||
|  |     @BeforeEach | ||||||
|  |     public void setUp() { | ||||||
|  |         defaultIn = System.in; | ||||||
|  |         defaultOut = System.out; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @AfterEach | ||||||
|  |     public void tearDown() { | ||||||
|  |         System.setIn(defaultIn); | ||||||
|  |         System.setOut(defaultOut); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenArgumentAsConsoleInput_WhenReadFromSubstitutedByteStream_ThenSuccessfullyCalculate() throws IOException { | ||||||
|  |         String[] arguments = new String[] { "-i", "CONSOLE" }; | ||||||
|  | 
 | ||||||
|  |         final InputStream fips = new ByteArrayInputStream("1 2 3".getBytes()); | ||||||
|  |         final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | ||||||
|  |         final PrintStream out = new PrintStream(byteArrayOutputStream); | ||||||
|  | 
 | ||||||
|  |         System.setIn(fips); | ||||||
|  |         System.setOut(out); | ||||||
|  | 
 | ||||||
|  |         //execute | ||||||
|  |         SimpleMain.main(arguments); | ||||||
|  | 
 | ||||||
|  |         //verify | ||||||
|  |         String consoleOutput = byteArrayOutputStream.toString(Charset.defaultCharset()); | ||||||
|  |         assertTrue(consoleOutput.contains("Calculated sum: 6")); | ||||||
|  | 
 | ||||||
|  |         fips.close(); | ||||||
|  |         out.close(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenArgumentAsConsoleInput_WhenReadFromSubstitutedFileStream_ThenSuccessfullyCalculate() throws IOException { | ||||||
|  |         String[] arguments = new String[] { "-i", "CONSOLE" }; | ||||||
|  | 
 | ||||||
|  |         final InputStream fips = getClass().getClassLoader() | ||||||
|  |             .getResourceAsStream("test-input.txt"); | ||||||
|  |         final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | ||||||
|  |         final PrintStream out = new PrintStream(byteArrayOutputStream); | ||||||
|  | 
 | ||||||
|  |         System.setIn(fips); | ||||||
|  |         System.setOut(out); | ||||||
|  | 
 | ||||||
|  |         //execute | ||||||
|  |         SimpleMain.main(arguments); | ||||||
|  | 
 | ||||||
|  |         //verify | ||||||
|  |         String consoleOutput = byteArrayOutputStream.toString(Charset.defaultCharset()); | ||||||
|  |         assertTrue(consoleOutput.contains("Calculated sum: 10")); | ||||||
|  | 
 | ||||||
|  |         fips.close(); | ||||||
|  |         out.close(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenLongArgumentAsConsoleInput_WhenReadFromSubstitutedFileStream_ThenSuccessfullyCalculate() throws IOException { | ||||||
|  |         String[] arguments = new String[] { "--input", "CONSOLE" }; | ||||||
|  | 
 | ||||||
|  |         final InputStream fips = getClass().getClassLoader() | ||||||
|  |             .getResourceAsStream("test-input.txt"); | ||||||
|  |         final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | ||||||
|  |         final PrintStream out = new PrintStream(byteArrayOutputStream); | ||||||
|  | 
 | ||||||
|  |         System.setIn(fips); | ||||||
|  |         System.setOut(out); | ||||||
|  | 
 | ||||||
|  |         //execute | ||||||
|  |         SimpleMain.main(arguments); | ||||||
|  | 
 | ||||||
|  |         //verify | ||||||
|  |         String consoleOutput = byteArrayOutputStream.toString(Charset.defaultCharset()); | ||||||
|  |         assertTrue(consoleOutput.contains("Calculated sum: 10")); | ||||||
|  | 
 | ||||||
|  |         fips.close(); | ||||||
|  |         out.close(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | package com.baeldung.junit.main.test; | ||||||
|  | 
 | ||||||
|  | import java.io.ByteArrayInputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.mockito.ArgumentCaptor; | ||||||
|  | import org.mockito.MockedStatic; | ||||||
|  | import org.mockito.Mockito; | ||||||
|  | 
 | ||||||
|  | public class TestStaticMain { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenArgumentAsConsoleInput_WhenReadFromSubstitutedByteArrayInputStream_ThenSuccessfullyCalculate() throws IOException { | ||||||
|  |         String[] arguments = new String[] { "-i", "CONSOLE" }; | ||||||
|  |         try (MockedStatic<StaticMain> mockedStatic = Mockito.mockStatic(StaticMain.class, Mockito.CALLS_REAL_METHODS); | ||||||
|  |             InputStream fips = new ByteArrayInputStream("1 2 3".getBytes())) { | ||||||
|  | 
 | ||||||
|  |             final InputStream original = System.in; | ||||||
|  | 
 | ||||||
|  |             //Reassigns the "standard" input stream | ||||||
|  |             System.setIn(fips); | ||||||
|  | 
 | ||||||
|  |             ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class); | ||||||
|  | 
 | ||||||
|  |             //execute | ||||||
|  |             StaticMain.main(arguments); | ||||||
|  | 
 | ||||||
|  |             //verify | ||||||
|  |             mockedStatic.verify(() -> StaticMain.calculateSum(stringArgumentCaptor.capture())); | ||||||
|  | 
 | ||||||
|  |             System.setIn(original); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1 @@ | |||||||
|  | 4 5 1 | ||||||
| @ -27,6 +27,7 @@ | |||||||
|         <module>junit-4</module> |         <module>junit-4</module> | ||||||
|         <module>junit-5-advanced</module> |         <module>junit-5-advanced</module> | ||||||
|         <module>junit-5-basics</module> |         <module>junit-5-basics</module> | ||||||
|  |         <module>junit-5-basics-2</module> | ||||||
|         <module>junit-5</module> |         <module>junit-5</module> | ||||||
|         <module>junit5-annotations</module> |         <module>junit5-annotations</module> | ||||||
|         <module>junit5-migration</module> |         <module>junit5-migration</module> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user