mirror of
https://github.com/gosticks/iota.lib.java.git
synced 2025-10-16 11:45:37 +00:00
Merge pull request #76 from BartoszMiller/mocked-server-for-tests
Enable mock web server for integration tests
This commit is contained in:
commit
2397a9beaa
@ -42,5 +42,10 @@
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.jadler</groupId>
|
||||
<artifactId>jadler-all</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
72
jota/src/test/java/jota/AbstractMockServer.java
Normal file
72
jota/src/test/java/jota/AbstractMockServer.java
Normal file
@ -0,0 +1,72 @@
|
||||
package jota;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import static java.nio.charset.Charset.defaultCharset;
|
||||
import static net.jadler.Jadler.*;
|
||||
|
||||
abstract class AbstractMockServer {
|
||||
|
||||
IotaAPI iotaAPI;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
|
||||
initJadler();
|
||||
iotaAPI = new IotaAPI.Builder().protocol("http").host("localhost").port(Integer.toString(port())).build();
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
closeJadler();
|
||||
}
|
||||
|
||||
static class ApiMock {
|
||||
|
||||
enum HttpOperation {
|
||||
REQUEST, RESPONSE
|
||||
}
|
||||
|
||||
private IotaAPICommands command;
|
||||
private String requestFileName;
|
||||
private String responseFileName;
|
||||
|
||||
ApiMock command(IotaAPICommands command) {
|
||||
this.command = command;
|
||||
return this;
|
||||
}
|
||||
|
||||
ApiMock request(String requestFileName) {
|
||||
this.requestFileName = requestFileName;
|
||||
return this;
|
||||
}
|
||||
|
||||
ApiMock response(String responseFileName) {
|
||||
this.responseFileName = responseFileName;
|
||||
return this;
|
||||
}
|
||||
|
||||
void build() {
|
||||
onRequest()
|
||||
.havingMethodEqualTo("POST")
|
||||
.havingBodyEqualTo(getBody(command, requestFileName, HttpOperation.REQUEST))
|
||||
.respond()
|
||||
.withBody(getBody(command, responseFileName, HttpOperation.RESPONSE))
|
||||
.withStatus(200);
|
||||
}
|
||||
|
||||
private String getBody(IotaAPICommands command, String file, HttpOperation httpOperation) {
|
||||
try {
|
||||
String filePath = String.format("/http/%s/%s/%s.json", command.command(), httpOperation.name().toLowerCase(), file);
|
||||
return IOUtils.toString(this.getClass().getResourceAsStream(filePath), defaultCharset());
|
||||
} catch (IOException e) {
|
||||
String msg = String.format("Cannot read HTTP %s body from file [%s] for [%s] command", httpOperation.name().toLowerCase(), file, command);
|
||||
throw new IllegalArgumentException(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
31
jota/src/test/java/jota/IotaApiIntegrationTest.java
Normal file
31
jota/src/test/java/jota/IotaApiIntegrationTest.java
Normal file
@ -0,0 +1,31 @@
|
||||
package jota;
|
||||
|
||||
import jota.dto.response.GetBundleResponse;
|
||||
import jota.error.ArgumentException;
|
||||
import org.hamcrest.core.IsNull;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import static jota.IotaAPICommands.GET_TRYTES;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
public class IotaApiIntegrationTest extends AbstractMockServer {
|
||||
|
||||
@Test
|
||||
public void shouldGetBundle() throws ArgumentException, IOException {
|
||||
|
||||
// given
|
||||
new ApiMock().command(GET_TRYTES).request("requestTx1").response("responseTx1").build();
|
||||
new ApiMock().command(GET_TRYTES).request("requestTx2").response("responseTx2").build();
|
||||
new ApiMock().command(GET_TRYTES).request("requestTx3").response("responseTx3").build();
|
||||
new ApiMock().command(GET_TRYTES).request("requestTx4").response("responseTx4").build();
|
||||
|
||||
// when
|
||||
GetBundleResponse gbr = iotaAPI.getBundle("BKBALUPMEECOGEYQU9OHXTFTHV9OKEVUGHAUNNQCNETAQWIRJIKDGWSWXY9RSIMZJBPIPEIQEFEIA9999");
|
||||
|
||||
// then
|
||||
assertThat(gbr, IsNull.notNullValue());
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
{"hashes":["BKBALUPMEECOGEYQU9OHXTFTHV9OKEVUGHAUNNQCNETAQWIRJIKDGWSWXY9RSIMZJBPIPEIQEFEIA9999"],"command":"getTrytes"}
|
||||
@ -0,0 +1 @@
|
||||
{"hashes":["CTGHWLWZA9FWZOWTJ9BJEQ9NTLIOVOUISRAWVFKMRAKCFMKRXNQCC9PONVYSZDKNMKHNNFTOWLFDA9999"],"command":"getTrytes"}
|
||||
@ -0,0 +1 @@
|
||||
{"hashes":["KEJFDCZVHJK9JAFLEHAXLCWKLBIJIKUUPWALANQVOMUERPXEFGYZICXAJVYBSTHGPWNMHRLYDSI9Z9999"],"command":"getTrytes"}
|
||||
@ -0,0 +1 @@
|
||||
{"hashes":["IANTDYLIDDNHVQ9PBHXOYQXHIMEXTVBIXZMPQYDW9M9BUSKNXTJJGGVU9LSQEUOLRKNIPNJGITRFZ9999"],"command":"getTrytes"}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"trytes": [
|
||||
"999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ETLRSJITLDFNTYMK9KGFXVUUJSTIBWWCAKOKOWPLTNKNBGPTWFCFRAOKCHNWSABGJNSOFELOKIUFJSGWZ9RLPRK999999999999999999999L99999999999999999999999999KJKLFXD99999999999B99999999MRBSVKH9K9RPAYVWJHZYOHCHPGCYMSEAYPBGENGWF9DRHIEIFKXNGWWBGEPZQUGKRQKFLYFKNPHEUJXLYCTGHWLWZA9FWZOWTJ9BJEQ9NTLIOVOUISRAWVFKMRAKCFMKRXNQCC9PONVYSZDKNMKHNNFTOWLFDA9999IANTDYLIDDNHVQ9PBHXOYQXHIMEXTVBIXZMPQYDW9M9BUSKNXTJJGGVU9LSQEUOLRKNIPNJGITRFZ9999L99999999999999999999999999QGVBGTJIE999999999L99999999YHHEGMAERQZF9J9UNDYCNDXSD9P"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"trytes": [
|
||||
"DVKGD9RX9GIYAUP9JZCEREPVDCRSHNIVJWWUWDXZVYMQLPGUOVLQMRFHNIIVUVKGQ9NLNJQGAAFKLAEDXCVKEQVKHXTXZPSWIOQR9IHNZUYMXUOUTLUPBTMTDKGBY9VA9XDPNZIN99QVNDJTVNIPMNZTKEIHUGCW9BBYICHMUQVKTOFDKHQROBVQCTHMWUZOWMDWZL9PXLSEIWLTRMP9FOUWITMSMQTRUZNNVNNDHNTJJVFD9YX9MGFRJIBASTNFWUNAUUWJEISJZ9EPPENMXKDYYB9WYWGDEOCUXSFESLQQNZUADK9QPIWSZUURYENXPVCWQAZSAOFYOFXCIKWAMQEGPZOHDUYEZQJTELCGMWXUUVETESVY9BWAHIYDRENFJTWNDCAEUIJLXRNE9RXKCLAQLRGJRUMMJLWGHISTJNANDZKCNUQVPQCDNOVKASVYRBYNDAKDVBMAFWINMMKSJEJNNZ9LJMLPOUXDU9XOXB9LBIERTIDDUGESTCR9SJTGSNUCYTJXBIJYPBQKKUEWUZCIUZJAVYVJEFSFZJNRTW9NYL9BMLOKBMDRY9RCY9LWLKSNEZVDITJJOKLPGLLLRATTTCBID9XIAPNEVMHCFTIEVLHAKXBAQGVDPDTMYNEDPGAABTMYUITVLNMSAYOASXFKIQMEGEH9JLDXWAKJACAUPMWWBPVUXQLUDDKUGYQRAGOGALONZYKVZZUVEFZDUPGMYUIFKTPDKCIMSIJXUQSSIKKHO9USDIWKZNSHTPLGEXOHEZFUH9HAHSNWXNORKSFIWVUYRQFDYGQHOPLIQDMPAMVQJP9CBLN9OHFVQWDKZXUOEETKADEDTKDPKKDMMJUKSFQWDTINDNGYHLQINSUODPVVZSUNBGYOWIAILONDBIEHMWQFUEVAOLLKTKKLGWLCJDYJ9HYWDZUWDNRYHE9KJCRJUOEVGQ9ARBQWSWHYREHUHCLMFHGDVLZMRIWJQUMOVGPIHVMZTW9UGOPUCLFIDKAISPLUKEHEC99HXPWWNUPQAFW99IQVHRGKXWRYZFMYKRBLYYNMEWAINBYZHRDJBYCHGPYDMWKTIRLXXRIAFSBVZKHXDIMJVGVR99ASNYJXEOBPBWN9ZQPC9DVTNAENYBUZPBHEP9XYEKNYKQFQOLVXUINYHSH9IK9Y99JEERLAMXJBMOI9YSMRMXLVAXUWNXJQ9FNPP9FSGKEOU9XPIAIFUZF9VCNXPZS9WVFHWOPFNSZPNSETUWKOZZPLV9TPZJFGBIVST9EQJTNNQWV9HWXTYGHBFYWBVMEDDYASGXWTLIEEUDPAGZKLNSORJOZZPTNNEXCDCVGEWZLCNNK9UHGKSFQGYHJUSFXWOPVEILAVHXSRZDQFBAOSIVTXBUIMOWNSGQECU9OGXWXVMXBAKIP9YOWPJTLGAY9NHLGJNADDX9JDVDPSQFYSJAWCNNUXFFEUBWHSGQJFR9OWCQUOSTDQZFCF9ZNNWPGALGLIIHOEJLUZSNDJEZDEAQEWAWEXUZUHKQRAORIFFGAZIJDENPCYTJKCTOVABGMXYJBMYTKMIPGZASMWND99PEXUEOELIENDTN9XTDGDMTFMLRJVOYKPWEFLUNDRWIQUDXSYVO9ODZELJWLQRCCXFITKGMFKBEGBNG9L9RTROJCRLADUUXNPPDJLYOJ9YYSBNLIMJVQHJJYWMFHYIQGSDOPWQXKEVZVVSWEPYWRLVEMDDRMACVQJVXELUVDCFQXKVOQS9XZBVNX9GTOCVVNNQ9KNZMLKSUUBJCDUA9KYLKKFVBGYKSTZUTRNUAHADWJNMOVACKWKNQOFCOJQWOVQJIAARQXDHNMYOEW9KNRTUNEXECKADS9LXCZ9LQPWAXJTBXYVMHKLIQVTYLA9AEKKICSLPLZIDHFALQBZCSOVAJSMKTHEDLKTNVGEFVCAXGIKIOLUMSFWKD9USVPFGDBLWJOAOAYIFU99ZQJBLLJCTLKVGALALWEVOTFOWZ9WKSOKSUHUWEFTCWIOKJPYDYUQMTOVANFZZ9CVJEJKZQDHS9XJHQOFLPHYAMCYMMRKDMIKVJAJUCKOGLI9CC9UEPRWK9PDYFKSZYYQOPLSNGLLUWMYWQLJXFIGSBWUXXTFTPLAVTYKWUA9SLDNGWDPPIOPYKQCZDURHRLTLE9WXYQFXHZLAYQDTXMEFGPV999IMNGORSKYKSJAJBYVXNKRBNCEG9HOKLSFGSQ9OY9DTONTNTNAGTILVUZCGVYXKEHWXLNNPJ9D9SQGWBCC9IOKIP999999999999999999999999999999999999999999999999KJKLFXD99A99999999B99999999MRBSVKH9K9RPAYVWJHZYOHCHPGCYMSEAYPBGENGWF9DRHIEIFKXNGWWBGEPZQUGKRQKFLYFKNPHEUJXLYKEJFDCZVHJK9JAFLEHAXLCWKLBIJIKUUPWALANQVOMUERPXEFGYZICXAJVYBSTHGPWNMHRLYDSI9Z9999IANTDYLIDDNHVQ9PBHXOYQXHIMEXTVBIXZMPQYDW9M9BUSKNXTJJGGVU9LSQEUOLRKNIPNJGITRFZ9999999999999999999999999999999VEUBGTJIE999999999L99999999CYHSOBXMLPOIRMNPJNFQENXDKWQ"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"trytes": [
|
||||
"CPMRBNVFFVXCRYCVXDRGTJYHHSYBXRWVCYGQRWIZELWTBGWRTSOE9LETNZYKRPKZCTLMUFKASXUPETGWYN9PMJQWGUBHIDKLJWYEVJQOURFBKMPVYZONGGSM9TE9YOJIZBTLJYQHUBMAP9OE9SVMKJLWMZJACYTVGASERRZQPCGJIEXATTWCGEVDRYDSIGYEYSAPE9BEWHRXPOGEUCFJYWMTOREEFAKKQJZNRASNNPAXWVLBCBWNWOPGIICOUDDUUTUTMPZKSJXXLVIHWIRVAPBHSNODDQAEMDRGFOCOSTUYMNNLECRMYNTNMVWMHAGFLVYCGJDM9RGLSMNYPTFFS99NXREZLGUVYHXWVEYD9EWSCTQFRKMPNCJKTQLGJAOTHOWHGMWGPRSRUN9MGIAR9MHJXHAWFOQKLLA9LWLEYIFXKPMFZIKG9CGFXGDAYNXQPFLPTK9HHE9DUVNTNBXJRHJGNIQAIMLA9CWWAZWTQYSIAZGKFNUVJPLR9JRSDCOU9WAD9PISAZXN9RTZBUNQBMYEFNRCAOSXEDAGCEZFXVAFFI9QZFUWMAXJPT9MUNK9ZGPMN9HVBGCXEDOTXDHOBIYUQFDHNKDDFSQKJTKRDJKEYNLOVCXNYPMZVBDGOHBZVUKKMYXCGGQVDXLZULRP9HTOZFSJCZBGDEQYMUXOCL9UF9ZWPWNRPRMATUQCREQNWZLBXFQCQZBUYHGKEZHIURKUYJPTYGUTRRAAOVZWXZNSISKXFZYDLBBDYPEYSYPJZ9UHSHWCCHOBRBIKTSWZKKAZJ9JYSAPMPIDCZKPZADQBNLVMZTFKGVWKJWRWIYAWUICTSJNZR9SBJX9WCNEMAFKSWFFFFSVVNCFFKDRGKUTXIMCICTFVWJVAIZWSXMRPPXZCULRTQEJXMKKMVDUMSJRMDVXWUZXMGLONHPUT9SPAQRZGMWXVAGOJSTKUM99VJELECHDSGKDBBTCOXJFAIGRZGEBFZRBITHMJMODNPUHSQRNYZPMSHMEMOCFEB9VTFGOSDNWQOLBORDYGJVLEHZKFDET99GTJDD9OACHEDNPNBBILLDHTZNHBLSVADYCK9QYUZXXCBOBFYUJMMWLUBFDGAUVTHRDEXSE9WKDYTVTXAZXP9TVVCSQWNGKC9DEXJATRPTNTSWXRS9WNXMF9VYPAURDUYNRHKMCVBYR9OZN9JKJUSBOSYXXSQOBNCVDARITEOVDKJRGQQBPORFQZSAMQEKDWDUJWVA9TQETLKQUAFNQZOBKRHUSXMTMRTMCQ9PNOO9OLEQQGUTAXWBOUCNFHVJOULVXUGUZXWNPC9UWEBIPZFRDVBLLRUZJVCVFFHMGBMTUDEHFGUIATBFKBQLDPYRYACJLGCFSJNX9IEXFBHGGUCYKBRURPXUOIDMIJXSOHSBTKLRCNAYFO9TMAVFTPWSFETKJALERTUIAOIOLZZKSGEXUFEJGZRZOVSSYEPDODGPZ99S9FJSSTSRJNGNPOKJCXVTTMZWDBMVVEOLUBAKNRLPHDPBUKTQZBSZMRLEYWEQQVRYMXSWEHVPYRYODEZKIUSMQIHLG9XW9NVUJXRP9HJKXESSLMWMUWGCYSSGMJLTDJSZBKVSXFYBCASRDBJNCPCEIAQGLUETTBZFUHCLZ9MWV9NOEMDSGTYIZWUQIRSSWASTLINN9FVXLIWJBPTJBFAWZBHBXE9TH9GNBWBHXZXHZGUEYIHMOGUSIORCOLXBUQRNHFYSXAKD9TSTMFFZOOXFXD9FJVTGEQCQCXOPYDHLHKU9LJKTBVABYBHPBSPOMPUFPJPQKSDTYVVZLMAKMMMDCNTXNFREYUCOLZAB9DWAWNXQMARSVPUWIQXISWZDWGNHIMULLTLYTLFYUTLBUDEXFVCSPHZLETM9MON9NESAVUFPCPSSE9XKJZPITUGNSTOCQBTEHTIQSNBFWBOFEVZSROPFAZFENXVDMZJUAYZTTVBUBM9BYOJBPINFKXRXITVGW9QZYPJZQX9FVOVASXIBYUGNDDKZWKZCGJLLUXKDZRULUTQAQWMN9JFANYNCVBKDXTDEZXDNRNTWZQQULQQOWW9SBQQVUBLTSYRVSWHFXYUBCSLXYDNNEZVQBIUJUWWJWUEDAGTVZCYYBASKIWJKKQUJZRKQKLPFMGTMVZIXLZNXHJDEEEEQYGMFTIAITCZZXIMNGORSKYKSJAJBYVXNKRBNCEG9HOKLSFGSQ9OY9DTONTNTNAGTILVUZCGVYXKEHWXLNNPJ9D9SQGWBCC999999999999999999999999999999999999999999999999999999KJKLFXD99B99999999B99999999MRBSVKH9K9RPAYVWJHZYOHCHPGCYMSEAYPBGENGWF9DRHIEIFKXNGWWBGEPZQUGKRQKFLYFKNPHEUJXLYIANTDYLIDDNHVQ9PBHXOYQXHIMEXTVBIXZMPQYDW9M9BUSKNXTJJGGVU9LSQEUOLRKNIPNJGITRFZ9999JBXCCZEFQSYWPXIEIWVILNXKSDEUJXGB9WEZCUELELUCBMUOGFEKKCRXYPSTFNZMNPFSMHZRSTCWA9999999999999999999999999999999ANUBGTJIE999999999L99999999EVIGPYNTRUPCUXNGNBKXKLOETNE"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
{
|
||||
"trytes": [
|
||||
"I9SPAM9FOR9IOTAS9ON99999IOTASPAM9DOT9COM999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999TRANSACTION9CREATED9USING9FULL9NODE99999HTTP9COLON9SLASH9SLASH9NODE9ZERO9ONE9DOT9IOTATOKEN9DOT9NL9COLON9ONE9FOUR9TWO9SIX9FIVE999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999IOTASPAMFUND99999PIG9PAW9COX9LOW9BOO9ZIP9GUN9ELM9AID9TOD9MAY9GEE9WIG9TOO9COB9TUB9999999999999999999999999999HD999IOTASPAMFUND99999999999JKLFXD99999999999999999999SBXCPQJK9JLWITEGYDLEPAPYXFJJFTCVQ9EAUTASRZGKGKA9VZEDCCJPUJNWGAWDCGUGXSBDDVSHFDKQWYTOGOQNYFKIIDZCBJQOMNJSYVQJXDHZUOHGTUKWFHX9DTKNQJWJHCEBEVRLAGHYRZVPAMTFOBHNMA9999HCZBLBWH9OYATDBN9NXUTKMFLBROMGPNGKY9DZFHBPOLOCIMHOTSYFKADZUGQCQCVAHZKGIHVDZZ99999HD999IOTASPAMFUND9999999999PVJAGTJIE999999999MMMMMMMMMTA999IA99999999999999999999"
|
||||
]
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user