content: package integration.auth;
  
  import integration.VertxNubesTestBase;
  import io.vertx.core.buffer.Buffer;
  import io.vertx.core.http.HttpClientRequest;
  import io.vertx.ext.unit.Async;
  import io.vertx.ext.unit.TestContext;
  import mock.controllers.auth.RedirectedController;
  import org.junit.Test;
  
  import java.util.concurrent.atomic.AtomicReference;
  
  import static io.vertx.core.http.HttpHeaders.*;
  
  public class BasicAuthTest extends VertxNubesTestBase {
  
    protected AtomicReference<String> sessionCookie = new AtomicReference<>();
  
    private static String goodUsername() {
      return "tim";
    }
  
    private static String goodPwd() {
      return "sausages";
    }
  
    private static String getOKBearer() {
      return "Basic dGltOnNhdXNhZ2Vz";
    }
  
    private static String getWrongBearer() {
      return "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==";
    }
  
    @Test
    public void test401(TestContext context) {
      Async async = context.async();
      client().getNow("/private/user", response -> {
        context.assertEquals(401, response.statusCode());
        async.complete();
      });
    }
  
    @Test
    public void testAuthorized(TestContext context) {
      Async async = context.async();
      client().get("/private/user", response -> {
        context.assertEquals(200, response.statusCode());
        async.complete();
      }).putHeader(AUTHORIZATION, getOKBearer()).end();
    }
  
    @Test
    public void testForbidden(TestContext context) {
      Async async = context.async();
      client().get("/private/admin", response -> {
        context.assertEquals(403, response.statusCode());
        async.complete();
      }).putHeader(AUTHORIZATION, getWrongBearer()).end();
    }
  
    @Test
    public void testRedirect(TestContext context) {
      Async async = context.async();
      String redirectURL = RedirectedController.REDIRECT_URL;
      String originalURL = "/auth/redirected/private";
      client().getNow(originalURL, response -> {
        context.assertEquals(302, response.statusCode());
        String setCookie = response.headers().get(SET_COOKIE);
        context.assertNotNull(setCookie);
        sessionCookie.set(setCookie);
        context.assertEquals(redirectURL, response.headers().get(LOCATION));
        client().getNow(redirectURL, loginPageResponse -> {
          context.assertEquals(200, loginPageResponse.statusCode());
          HttpClientRequest loginRequest = client().post(redirectURL, loginResponse -> {
            context.assertEquals(302, loginResponse.statusCode());
            context.assertEquals(loginResponse.headers().get(LOCATION), originalURL);
            async.complete();
          });
          String boundary = "dLV9Wyq26L_-JQxk6ferf-RT153LhOO";
          Buffer buffer = Buffer.buffer();
          String str = "--" + boundary + "\r\n" +
              "Content-Disposition: form-data; name=\"username\"\r\n\r\n" + goodUsername() + "\r\n" +
              "--" + boundary + "\r\n" +
              "Content-Disposition: form-data; name=\"password\"\r\n\r\n" + goodPwd() + "\r\n" +
              "--" + boundary + "--\r\n";
          buffer.appendString(str);
          loginRequest.putHeader("content-length", String.valueOf(buffer.length()));
          loginRequest.putHeader("content-type", "multipart/form-data; boundary=" + boundary);
          if (sessionCookie.get() != null) {
            loginRequest.putHeader(COOKIE, sessionCookie.get());
          }
          loginRequest.write(buffer);
          loginRequest.end();
        });
      });
    }
  }
  