Daniel Arroyo 3 years ago
parent c83acf7717
commit 9bc0bde671
  1. 3
      .gitignore
  2. 17
      README.md
  3. 6
      pom.xml
  4. 13
      src/main/java/api/menu/playa/annotation/Roles.java
  5. 48
      src/main/java/api/menu/playa/controller/LoginController.java
  6. 6
      src/main/java/api/menu/playa/controller/OrdenController.java
  7. 4
      src/main/java/api/menu/playa/dao/UsuarioDAO.java
  8. 58
      src/main/java/api/menu/playa/helper/LoginHelper.java
  9. 43
      src/main/java/api/menu/playa/helper/TokenService.java
  10. 18
      src/main/java/api/menu/playa/model/Usuario.java
  11. 88
      src/main/java/api/menu/playa/util/TokenUtils.java
  12. 14
      src/main/resources/application.properties
  13. 52
      src/main/resources/privatekey.pem
  14. 14
      src/main/resources/publickey.pem
  15. 8
      src/test/java/api/menu/playa/GreetingResourceIT.java
  16. 21
      src/test/java/api/menu/playa/GreetingResourceTest.java

3
.gitignore vendored

@ -25,4 +25,5 @@ hs_err_pid*
replay_pid* replay_pid*
target/ target/
logs/

@ -1,3 +1,15 @@
# Funcionamiento
```
compilar con ./mvnw package -Dquarkus.package.type=uber-jar
ejecutar con java
```
# api-menu-playa Project # api-menu-playa Project
This project uses Quarkus, the Supersonic Subatomic Java Framework. This project uses Quarkus, the Supersonic Subatomic Java Framework.
@ -60,3 +72,8 @@ If you want to learn more about building native executables, please consult http
Easily start your Reactive RESTful Web Services Easily start your Reactive RESTful Web Services
[Related guide section...](https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources) [Related guide section...](https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources)
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.profile=prod

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>api.menu.playa</groupId> <groupId>api.menu.playa</groupId>
<artifactId>api-menu-playa</artifactId> <artifactId>api-menu-playa</artifactId>
<version>1.1.1</version> <version>1.1.2</version>
<properties> <properties>
<compiler-plugin.version>3.10.1</compiler-plugin.version> <compiler-plugin.version>3.10.1</compiler-plugin.version>
<maven.compiler.release>11</maven.compiler.release> <maven.compiler.release>11</maven.compiler.release>
@ -62,10 +62,6 @@
<groupId>io.quarkus</groupId> <groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId> <artifactId>quarkus-smallrye-jwt</artifactId>
</dependency> </dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt-build</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

@ -0,0 +1,13 @@
package api.menu.playa.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Roles {
public String[] rols();
}

@ -1,17 +1,22 @@
package api.menu.playa.controller; package api.menu.playa.controller;
import javax.annotation.security.PermitAll; import java.util.Collections;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import org.eclipse.microprofile.jwt.JsonWebToken;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.jboss.resteasy.reactive.RestHeader;
import api.menu.playa.enums.RolesEnum;
import api.menu.playa.exceptions.NegocioException; import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.helper.LoginHelper; import api.menu.playa.helper.LoginHelper;
import api.menu.playa.vo.RegistroVO; import api.menu.playa.vo.RegistroVO;
@ -30,12 +35,14 @@ public class LoginController {
@Inject @Inject
Logger logger; Logger logger;
@Inject
JsonWebToken jwt;
@Inject @Inject
LoginHelper loginHelper; LoginHelper loginHelper;
@POST @POST
@Path("login") @Path("login")
@PermitAll
public Response login(UsuarioVO request) { public Response login(UsuarioVO request) {
try { try {
@ -51,7 +58,6 @@ public class LoginController {
@POST @POST
@Path("register") @Path("register")
@PermitAll
public Response register(RegistroVO request) { public Response register(RegistroVO request) {
try { try {
@ -68,6 +74,42 @@ public class LoginController {
} }
@GET
@Path("token")
public Response token() {
try {
String token = loginHelper.tokenGenerator("darroyo", Collections.singleton(RolesEnum.USER), 3600L, "www.vodorod.cl");
return Response.ok(new ResponseGlobal<>(0, SUCCESS, token)).build();
} catch (NegocioException e) {
return Response.ok(new ResponseGlobal<>(e.getCode(), e.getMessage())).build();
} catch (Exception e) {
return Response.ok(new ResponseGlobal<>(1, ERROR)).build();
}
}
/* @GET
@Path("valida")
public Response validaToken(@RestHeader("Authorization") String token) {
try {
String user = loginHelper.validaToken(token);
return Response.ok(new ResponseGlobal<>(0, SUCCESS, user)).build();
} catch (Exception e) {
return Response.ok(new ResponseGlobal<>(1, ERROR)).build();
}
} */
private void validacionPassword(RegistroVO request) throws NegocioException { private void validacionPassword(RegistroVO request) throws NegocioException {
if (request.getUser() == null || request.getUser().isEmpty()) { if (request.getUser() == null || request.getUser().isEmpty()) {

@ -3,6 +3,8 @@ package api.menu.playa.controller;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import org.eclipse.microprofile.jwt.JsonWebToken;
import api.menu.playa.exceptions.NegocioException; import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.helper.OrdenHelper; import api.menu.playa.helper.OrdenHelper;
import api.menu.playa.vo.CambioCantidadVO; import api.menu.playa.vo.CambioCantidadVO;
@ -32,6 +34,8 @@ public class OrdenController {
private static final String SUCCESS = "SUCCESS"; private static final String SUCCESS = "SUCCESS";
//private static final String ERROR = "ERROR"; //private static final String ERROR = "ERROR";
@Inject @Inject
OrdenHelper ordenHelper; OrdenHelper ordenHelper;
@ -39,7 +43,7 @@ public class OrdenController {
* Creacion de orden * Creacion de orden
*/ */
@RolesAllowed({"USER", "ADMIN"}) //@RolesAllowed({"USER", "ADMIN"})
@GET @GET
@Path("/create") @Path("/create")
public Response create() { public Response create() {

@ -10,6 +10,6 @@ import api.menu.playa.model.Usuario;
public interface UsuarioDAO extends JpaRepository<Usuario, Long> { public interface UsuarioDAO extends JpaRepository<Usuario, Long> {
@Query("select u from Usuario u where u.usuario = :usuario") @Query("select u from Usuario u where u.user = :usuario")
Usuario encontrarUsuario(@Param("usuario") String usuario); Optional<Usuario> encontrarUsuario(@Param("usuario") String usuario);
} }

@ -1,15 +1,27 @@
package api.menu.playa.helper; package api.menu.playa.helper;
import java.io.InputStream;
import java.security.Key; import java.security.Key;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64; import java.util.Base64;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject; import javax.inject.Inject;
import org.eclipse.microprofile.jwt.Claims;
import org.eclipse.microprofile.jwt.JsonWebToken;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.jose4j.jwk.JsonWebKey;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.keys.resolvers.JwksVerificationKeyResolver;
import api.menu.playa.dao.UsuarioDAO; import api.menu.playa.dao.UsuarioDAO;
import api.menu.playa.enums.RolesEnum; import api.menu.playa.enums.RolesEnum;
@ -18,6 +30,9 @@ import api.menu.playa.model.Usuario;
import api.menu.playa.util.TokenUtils; import api.menu.playa.util.TokenUtils;
import api.menu.playa.vo.RegistroVO; import api.menu.playa.vo.RegistroVO;
import api.menu.playa.vo.UsuarioVO; import api.menu.playa.vo.UsuarioVO;
import io.smallrye.jwt.auth.principal.DefaultJWTParser;
import io.smallrye.jwt.build.Jwt;
import io.smallrye.jwt.build.JwtSignature;
@ApplicationScoped @ApplicationScoped
public class LoginHelper { public class LoginHelper {
@ -28,18 +43,21 @@ public class LoginHelper {
@Inject @Inject
UsuarioDAO usuarioDAO; UsuarioDAO usuarioDAO;
@Inject
TokenService tokenService;
public void registrarUsuario(RegistroVO request) throws Exception { public void registrarUsuario(RegistroVO request) throws Exception {
Usuario user = usuarioDAO.encontrarUsuario(request.getUser()); Optional<Usuario> user = usuarioDAO.encontrarUsuario(request.getUser());
if (user != null) { if (user.isPresent()) {
throw new NegocioException("El usuario ya existe", 2); throw new NegocioException("El usuario ya existe", 2);
} }
Usuario usuario = new Usuario(); Usuario usuario = new Usuario();
usuario.setActivo(false); usuario.setActivo(false);
usuario.setUsuario(request.getUser()); usuario.setUser(request.getUser());
usuario.setPass(encript(request.getPass())); usuario.setPass(encript(request.getPass()));
usuario.setRol(RolesEnum.USER); usuario.setRol(RolesEnum.USER);
usuario.setNombre(request.getUser()); usuario.setNombre(request.getUser());
@ -49,12 +67,12 @@ public class LoginHelper {
public String validarUsuario(UsuarioVO request) throws Exception { public String validarUsuario(UsuarioVO request) throws Exception {
Usuario user = usuarioDAO.encontrarUsuario(request.getUser()); Optional<Usuario> user = usuarioDAO.encontrarUsuario(request.getUser());
logger.info("Usuario"); logger.info("Usuario");
logger.info(user); logger.info(user);
if (user == null) { if (user.isEmpty()) {
throw new NegocioException("Usuario no existe en el sistema", 2); throw new NegocioException("Usuario no existe en el sistema", 2);
} }
@ -63,19 +81,22 @@ public class LoginHelper {
logger.info("Password encriptado"); logger.info("Password encriptado");
logger.info(password); logger.info(password);
if (!user.getActivo()) { if (Boolean.FALSE.equals(user.get().getActivo())) {
throw new NegocioException("Usuario no se encuentra activo", 2); throw new NegocioException("Usuario no se encuentra activo", 2);
} }
if (!password.equals(user.getPass())) { if (!password.equals(user.get().getPass())) {
throw new NegocioException("Usuario o contraseña es incorrecto", 2); throw new NegocioException("Usuario o contraseña es incorrecto", 2);
} }
String token = TokenUtils.generateToken(user.getUsuario(), Collections.singleton(user.getRol()), 36000L, "https://vodorod.cl"); return tokenService.generate(user.get().getNombre(), user.get().getUser(), user.get().getFecha(), user.get().getRol());
//return TokenUtils.generateToken(user.get().getUser(), Collections.singleton(user.get().getRol()), 36000L, "https://vodorod.cl");
//String token = tokenGenerator(user);
return token;
//return tokenGenerator(user.get().getUser(), Collections.singleton(user.get().getRol()), 36000L, "https://vodorod.cl");
} }
private static String ENCRYPT_KEY = "clave-compartida-no-reveloar-nun"; private static String ENCRYPT_KEY = "clave-compartida-no-reveloar-nun";
@ -108,4 +129,21 @@ public class LoginHelper {
long currentTimeMS = System.currentTimeMillis(); long currentTimeMS = System.currentTimeMillis();
return (int) (currentTimeMS / 1000); return (int) (currentTimeMS / 1000);
} }
public String tokenGenerator(String username, Set<RolesEnum> roles, Long duration, String issuer) throws Exception {
Set<String> groups = new HashSet<>();
for (RolesEnum role : roles) groups.add(role.toString());
return Jwt.claims()
.issuer(issuer)
.issuedAt(currentTimeInSecs())
.expiresAt(currentTimeInSecs() + duration)
.groups(groups)
.claim("nombre", username).jws()
.signWithSecret("issuer11111111111111111111111111");
}
} }

@ -0,0 +1,43 @@
package api.menu.playa.helper;
import java.time.LocalDateTime;
import java.util.Arrays;
import javax.enterprise.context.RequestScoped;
import org.eclipse.microprofile.jwt.Claims;
import org.jose4j.jwt.JwtClaims;
import api.menu.playa.enums.RolesEnum;
import api.menu.playa.util.TokenUtils;
@RequestScoped
public class TokenService {
public String generate(String nombre, String username, LocalDateTime birthdate, RolesEnum rol) {
try {
System.out.println("creating account");
JwtClaims jwtClaims = new JwtClaims();
jwtClaims.setIssuer("https://vodorod.cl");
jwtClaims.setJwtId("a-123");
jwtClaims.setSubject(nombre);
jwtClaims.setClaim(Claims.upn.name(), nombre);
jwtClaims.setClaim(Claims.preferred_username.name(), username);
jwtClaims.setClaim(Claims.birthdate.name(), birthdate);
jwtClaims.setClaim(Claims.groups.name(), Arrays.asList(rol));
jwtClaims.setAudience("using-jwt");
jwtClaims.setExpirationTimeMinutesInTheFuture(720);
String token = TokenUtils.generateTokenString(jwtClaims);
System.out.println(token);
return token;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Oops!");
}
}
}

@ -25,7 +25,7 @@ public class Usuario {
private Long id; private Long id;
@Column(name = "usuario", unique = true) @Column(name = "usuario", unique = true)
private String usuario; private String user;
@Column(name = "pass") @Column(name = "pass")
private String pass; private String pass;
@ -60,14 +60,6 @@ public class Usuario {
this.pass = pass; this.pass = pass;
} }
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public RolesEnum getRol() { public RolesEnum getRol() {
return rol; return rol;
} }
@ -100,5 +92,13 @@ public class Usuario {
this.nombre = nombre; this.nombre = nombre;
} }
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
} }

@ -5,45 +5,78 @@ import java.security.KeyFactory;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64; import java.util.Base64;
import java.util.HashSet; import java.util.Map;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.ApplicationScoped;
import api.menu.playa.enums.RolesEnum; import org.eclipse.microprofile.config.ConfigProvider;
import io.smallrye.jwt.build.Jwt; import org.eclipse.microprofile.config.inject.ConfigProperty;
import io.smallrye.jwt.build.JwtClaimsBuilder; import org.eclipse.microprofile.jwt.Claims;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.NumericDate;
@ApplicationScoped @ApplicationScoped
public class TokenUtils { public class TokenUtils {
public static String generateToken(String username, Set<RolesEnum> roles, Long duration, String issuer) throws Exception { //@ConfigProperty(name = "config.private.key")
String privateKeyLocation = "/privatekey.pem"; private static String privateKey = ConfigProvider.getConfig().getValue("config.private.key",String.class);;
PrivateKey privateKey = readPrivateKey(privateKeyLocation);
private TokenUtils() {
JwtClaimsBuilder claimsBuilder = Jwt.claims(); }
public static String generateTokenString(JwtClaims claims) throws Exception {
// Use the private key associated with the public key for a valid signature
PrivateKey pk = readPrivateKey(privateKey);
return generateTokenString(pk, privateKey, claims);
}
private static String generateTokenString(PrivateKey privateKey, String kid, JwtClaims claims) throws Exception {
long currentTimeInSecs = currentTimeInSecs(); long currentTimeInSecs = currentTimeInSecs();
Set<String> groups = new HashSet<>();
for (RolesEnum role : roles) groups.add(role.toString());
claimsBuilder.issuer(issuer); claims.setIssuedAt(NumericDate.fromSeconds(currentTimeInSecs));
claimsBuilder.subject(username); claims.setClaim(Claims.auth_time.name(), NumericDate.fromSeconds(currentTimeInSecs));
claimsBuilder.issuedAt(currentTimeInSecs);
claimsBuilder.expiresAt(currentTimeInSecs + duration); for (Map.Entry<String, Object> entry : claims.getClaimsMap().entrySet()) {
claimsBuilder.groups(groups); System.out.printf("\tAdded claim: %s, value: %s\n", entry.getKey(), entry.getValue());
}
JsonWebSignature jws = new JsonWebSignature();
jws.setPayload(claims.toJson());
jws.setKey(privateKey);
jws.setKeyIdHeaderValue(kid);
jws.setHeader("typ", "JWT");
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
return claimsBuilder.jws().keyId(privateKeyLocation).sign(privateKey);
return jws.getCompactSerialization();
} }
/**
* Read a PEM encoded private key from the classpath
*
* @param pemResName - key file resource name
* @return PrivateKey
* @throws Exception on decode failure
*/
public static PrivateKey readPrivateKey(final String pemResName) throws Exception { public static PrivateKey readPrivateKey(final String pemResName) throws Exception {
try (InputStream contentIS = TokenUtils.class.getResourceAsStream(pemResName)) { InputStream contentIS = TokenUtils.class.getResourceAsStream(pemResName);
byte[] tmp = new byte[4096]; byte[] tmp = new byte[4096];
int length = contentIS.read(tmp); int length = contentIS.read(tmp);
return decodePrivateKey(new String(tmp, 0, length, "UTF-8")); return decodePrivateKey(new String(tmp, 0, length, "UTF-8"));
}
} }
/**
* Decode a PEM encoded private key string to an RSA PrivateKey
*
* @param pemEncoded - PEM string for private key
* @return PrivateKey
* @throws Exception on decode failure
*/
public static PrivateKey decodePrivateKey(final String pemEncoded) throws Exception { public static PrivateKey decodePrivateKey(final String pemEncoded) throws Exception {
byte[] encodedBytes = toEncodedBytes(pemEncoded); byte[] encodedBytes = toEncodedBytes(pemEncoded);
@ -52,12 +85,12 @@ public class TokenUtils {
return kf.generatePrivate(keySpec); return kf.generatePrivate(keySpec);
} }
public static byte[] toEncodedBytes(final String pemEncoded) { private static byte[] toEncodedBytes(final String pemEncoded) {
final String normalizedPem = removeBeginEnd(pemEncoded); final String normalizedPem = removeBeginEnd(pemEncoded);
return Base64.getDecoder().decode(normalizedPem); return Base64.getDecoder().decode(normalizedPem);
} }
public static String removeBeginEnd(String pem) { private static String removeBeginEnd(String pem) {
pem = pem.replaceAll("-----BEGIN (.*)-----", ""); pem = pem.replaceAll("-----BEGIN (.*)-----", "");
pem = pem.replaceAll("-----END (.*)----", ""); pem = pem.replaceAll("-----END (.*)----", "");
pem = pem.replaceAll("\r\n", ""); pem = pem.replaceAll("\r\n", "");
@ -65,6 +98,9 @@ public class TokenUtils {
return pem.trim(); return pem.trim();
} }
/**
* @return the current time in seconds since epoch
*/
public static int currentTimeInSecs() { public static int currentTimeInSecs() {
long currentTimeMS = System.currentTimeMillis(); long currentTimeMS = System.currentTimeMillis();
return (int) (currentTimeMS / 1000); return (int) (currentTimeMS / 1000);

@ -9,14 +9,18 @@ quarkus.http.host=0.0.0.0
quarkus.datasource.username=postgres quarkus.datasource.username=postgres
quarkus.datasource.password=13467982 quarkus.datasource.password=13467982
quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.1.17:5432/postgres?currentSchema=playa quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=playa
#quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.1.17:5432/postgres?currentSchema=playa
quarkus.datasource.users.jdbc.max-size=11 quarkus.datasource.users.jdbc.max-size=11
quarkus.datasource.jdbc.idle-removal-interval= 10 quarkus.datasource.jdbc.idle-removal-interval= 10
quarkus.datasource.inventory.jdbc.max-size=12 quarkus.datasource.inventory.jdbc.max-size=12
quarkus.hibernate-orm.database.generation=update quarkus.hibernate-orm.database.generation=update
mp.jwt.verify.publickey.location=publickey.pem
config.private.key=/privateKey.pem
mp.jwt.verify.publickey.location=publicKey.pem
mp.jwt.verify.issuer=https://vodorod.cl mp.jwt.verify.issuer=https://vodorod.cl
quarkus.smallrye-jwt.enabled=true quarkus.smallrye-jwt.enabled=true
quarkus.log.file.enable=true quarkus.log.file.enable=true
@ -32,4 +36,8 @@ quarkus.log.file.rotation.max-backup-index=30
%prod.quarkus.datasource.username=playa_tienda %prod.quarkus.datasource.username=playa_tienda
%prod.quarkus.datasource.password=ED8eqKY5ZyQAH9px %prod.quarkus.datasource.password=ED8eqKY5ZyQAH9px
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=playa %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=playa
# %prod.config.private.key=file://${CONFIG_PUBLIC_KEY:/api/tienda-playa/privateKey.pem}
# %prod.mp.jwt.verify.publickey.location=file://${CONFIG_PRIVATE_KEY:publicKey.pem}
# %prod.mp.jwt.verify.issuer=https://vodorod.cl

@ -1,28 +1,28 @@
-----BEGIN PRIVATE KEY----- -----BEGIN PRIVATE KEY-----
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
ySryjnf3b8RX4xTt8vSj7No= gs4AsuhRpozo+xSAOVuO+Mg=
-----END PRIVATE KEY----- -----END PRIVATE KEY-----

@ -1,9 +1,9 @@
-----BEGIN PUBLIC KEY----- -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvDYsBZlI5GE6M2sDyoyc MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA18OmU6OM3cJ88c3FWi+y
xs7nI7JCO7WW6Nu+BBnrHMLEC/lvAMhPtJ8hfCDx3kiYXFPlVwUt6r8YfUFyW9ph bH45cNiTntr8kHnDX3jBuP1qd9rI60CrQv43JZobQzfKmOyeibNC4R7J0LHumiCs
vfC1Z5KGSsUIA5qVc5Df9jMwiEQ5IMgWfLDnGeDo/IJLiObP6scMA/3eVtEbEeLI dpkp7qzklE1bGf7MzCuVX853Jd1GxVY64em+Uk0QciarFPMtk09JFYLj0gbNL4/P
Bgl/UmcIk3VmqWQ3TNcaRjwHoJoffmrbzVWR4/+vofo0h0w64KhkYmEIO/mDe0X0 A3mZfHKnWMtX3h5kfwSiCik9wqPBhGF1i3X2Akhw59AqK84mDtwjAT161HF5TsSX
MAWmOpaDHK6yDdmJs6O3to+IvSujEWYbgmp84lt9E0w5OoWrOsClQPqq+As7v8OM /+Up++TFsOtzLtb3ztAND+2YPFAxjiBID8m10sxqEGaErMnXJBaeQMmwDRwZwP29
Zh+fciWch/ulhUq85sbA2qA9NTizkjJ46635432c9oMRoMJTXf3McpoBDf2YX212 wFTaFWF1brp2CV+fql+U5cW0zehFzzYlKnZ9S84ANHN/Ayk2E5hvedZyULqeEUP4
FwIDAQAB 3QIDAQAB
-----END PUBLIC KEY----- -----END PUBLIC KEY-----

@ -1,8 +0,0 @@
package api.menu.playa;
import io.quarkus.test.junit.QuarkusIntegrationTest;
@QuarkusIntegrationTest
public class GreetingResourceIT extends GreetingResourceTest {
// Execute the same tests but in packaged mode.
}

@ -1,21 +0,0 @@
package api.menu.playa;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;
@QuarkusTest
public class GreetingResourceTest {
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(is("Hello from RESTEasy Reactive"));
}
}
Loading…
Cancel
Save

Powered by TurnKey Linux.