// Path: src/main/java/pl/setblack/pongi/Server.java
// public class Server {
// 
//     private final UsersService usersService;
//     private final GamesService gamesService;
//     private final ScoresService scoresService;
// 
//     private final RatpackServer ratpackServer;
// 
//     public Server(UsersService usersService, GamesService gamesService, ScoresService scoresService) {
//         this.usersService = usersService;
//         this.gamesService = gamesService;
//         this.scoresService = scoresService;
//         ratpackServer =
//                 Try.of(() -> createDefaultServer(
//                         defineApi()))
//                         .onFailure(this::handleError).get();
//     }
// 
//     public void start() {
//         Try.run(() -> this.ratpackServer.start()).onFailure(System.out::println);
// 
//     }
// 
//     public void stop() {
//         Try.run(() -> this.ratpackServer.stop());
//     }
// 
// 
//     public static RatpackServer createUnconfiguredServer(Action<Chain> handlers) {
//         return createDefaultServer(makeApi(handlers), x -> x);
//     }
// 
//     private static RatpackServer createDefaultServer(Action<Chain> handlers) {
//         return createDefaultServer(makeApi(handlers).append(serveFiles()), Server::configuration);
//     }
// 
// 
//     private static Action<Chain> makeApi(Action<Chain> handlers) {
//         return chain -> chain.prefix("api", handlers);
//     }
// 
//     private static Action<Chain> serveFiles() {
//         return chain -> chain
//                 .files(fileHandlerSpec -> fileHandlerSpec
//                         .dir("src/main/webapp")
//                         .indexFiles("index.html")
//                 );
//     }
// 
//     private static RatpackServer createDefaultServer(Action<Chain> handlers,
//                                                      Function1<RatpackServerSpec, RatpackServerSpec> configuration) {
//         try {
//             return RatpackServer.of(server -> configuration.apply(createEmptyServer(server))
//                     .handlers(chain ->
//                             handlers.execute(chain.all(RequestLogger.ncsa()))
//                     )
//             );
//         } catch (Exception e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
// 
//     private Action<Chain> defineApi() {
//         return apiChain -> apiChain
//                 .insert(usersService.usersApi())
//                 .insert(gamesService.gamesApi())
//                 .prefix("score", scoresService.scores());
//     }
// 
//     private static RatpackServerSpec createEmptyServer(RatpackServerSpec initial)
//             throws Exception {
//         return initial
//                 .registryOf(r -> r.add(JsonMapping.getJsonMapping()));
//     }
// 
//     private static RatpackServerSpec configuration(RatpackServerSpec server) {
//         final Path currentRelativePath = Paths.get("").toAbsolutePath();
//         try {
//             return server.serverConfig(
//                     scb ->
//                             scb
//                                     .baseDir(currentRelativePath)
//                                     .publicAddress(new URI("http://0.0.0.0"))
//                                     .port(9000)
//                                     .threads(4)
//             );
//         } catch (Exception e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
// 
//     private void handleError(final Throwable t) {
//         System.err.println(t);
//     }
// 
// }
// 
// Path: src/main/java/pl/setblack/pongi/users/repo/SessionsRepo.java
// public class SessionsRepo {
//     private AtomicReference<HashMap<String, Session>> activeSesssions =
//             new AtomicReference<>(HashMap.empty());
// 
//     private final Clock clock;
// 
//     public SessionsRepo(Clock clock) {
//         this.clock = clock;
//     }
// 
// 
//     public Session startSession(String userId) {
//         final UUID uuid = UUID.randomUUID();
//         final LocalDateTime now = LocalDateTime.now(this.clock);
//         final LocalDateTime expirationTime = now.plusDays(1);
//         final Session sess = new Session(userId, uuid, expirationTime);
//         this.activeSesssions.updateAndGet(map -> map.put(uuid.toString(), sess));
//         return sess;
//     }
// 
//     public Option<Session> getSession(final String uuid) {
//         return this.activeSesssions.get().get(uuid);
//     }
// 
// }
// 
// Path: src/main/java/pl/setblack/pongi/users/repo/UsersRepositoryInMemory.java
// public class UsersRepositoryInMemory implements UsersRepository, Serializable {
//     private static final long serialVersionUID = 1L;
// 
//     private volatile HashMap<String, UserData> allUsers = HashMap.empty();
// 
// 
//     public RegUserStatus addUser(final String login, final String pass) {
//         if (!allUsers.containsKey(login)) {
//             allUsers = allUsers.put(login, new UserData(login, pass));
//             return new RegUserStatus(Option.none());
//         } else {
//             return new RegUserStatus(Option.some("user existed"));
//         }
//     }
// 
//     public boolean login(final String login, final String password) {
//         return allUsers.get(login).map(userData -> userData
//                 .hashedPassword
//                 .equals(password))
//                 .getOrElse(false);
// 
//     }
// 
// }


import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import pl.setblack.pongi.Server;
import pl.setblack.pongi.users.repo.SessionsRepo;
import pl.setblack.pongi.users.repo.UsersRepositoryInMemory;
import ratpack.test.embed.EmbeddedApp;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
package pl.setblack.pongi.users;








class UsersServiceTest {
    private final Clock clock = Clock.fixed(Instant.parse("2007-12-03T10:15:30.00Z"), ZoneId.of("GMT"));


// Path: src/main/java/pl/setblack/pongi/Server.java
// public class Server {
// 
//     private final UsersService usersService;
//     private final GamesService gamesService;
//     private final ScoresService scoresService;
// 
//     private final RatpackServer ratpackServer;
// 
//     public Server(UsersService usersService, GamesService gamesService, ScoresService scoresService) {
//         this.usersService = usersService;
//         this.gamesService = gamesService;
//         this.scoresService = scoresService;
//         ratpackServer =
//                 Try.of(() -> createDefaultServer(
//                         defineApi()))
//                         .onFailure(this::handleError).get();
//     }
// 
//     public void start() {
//         Try.run(() -> this.ratpackServer.start()).onFailure(System.out::println);
// 
//     }
// 
//     public void stop() {
//         Try.run(() -> this.ratpackServer.stop());
//     }
// 
// 
//     public static RatpackServer createUnconfiguredServer(Action<Chain> handlers) {
//         return createDefaultServer(makeApi(handlers), x -> x);
//     }
// 
//     private static RatpackServer createDefaultServer(Action<Chain> handlers) {
//         return createDefaultServer(makeApi(handlers).append(serveFiles()), Server::configuration);
//     }
// 
// 
//     private static Action<Chain> makeApi(Action<Chain> handlers) {
//         return chain -> chain.prefix("api", handlers);
//     }
// 
//     private static Action<Chain> serveFiles() {
//         return chain -> chain
//                 .files(fileHandlerSpec -> fileHandlerSpec
//                         .dir("src/main/webapp")
//                         .indexFiles("index.html")
//                 );
//     }
// 
//     private static RatpackServer createDefaultServer(Action<Chain> handlers,
//                                                      Function1<RatpackServerSpec, RatpackServerSpec> configuration) {
//         try {
//             return RatpackServer.of(server -> configuration.apply(createEmptyServer(server))
//                     .handlers(chain ->
//                             handlers.execute(chain.all(RequestLogger.ncsa()))
//                     )
//             );
//         } catch (Exception e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
// 
//     private Action<Chain> defineApi() {
//         return apiChain -> apiChain
//                 .insert(usersService.usersApi())
//                 .insert(gamesService.gamesApi())
//                 .prefix("score", scoresService.scores());
//     }
// 
//     private static RatpackServerSpec createEmptyServer(RatpackServerSpec initial)
//             throws Exception {
//         return initial
//                 .registryOf(r -> r.add(JsonMapping.getJsonMapping()));
//     }
// 
//     private static RatpackServerSpec configuration(RatpackServerSpec server) {
//         final Path currentRelativePath = Paths.get("").toAbsolutePath();
//         try {
//             return server.serverConfig(
//                     scb ->
//                             scb
//                                     .baseDir(currentRelativePath)
//                                     .publicAddress(new URI("http://0.0.0.0"))
//                                     .port(9000)
//                                     .threads(4)
//             );
//         } catch (Exception e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
// 
//     private void handleError(final Throwable t) {
//         System.err.println(t);
//     }
// 
// }
// 
// Path: src/main/java/pl/setblack/pongi/users/repo/SessionsRepo.java
// public class SessionsRepo {
//     private AtomicReference<HashMap<String, Session>> activeSesssions =
//             new AtomicReference<>(HashMap.empty());
// 
//     private final Clock clock;
// 
//     public SessionsRepo(Clock clock) {
//         this.clock = clock;
//     }
// 
// 
//     public Session startSession(String userId) {
//         final UUID uuid = UUID.randomUUID();
//         final LocalDateTime now = LocalDateTime.now(this.clock);
//         final LocalDateTime expirationTime = now.plusDays(1);
//         final Session sess = new Session(userId, uuid, expirationTime);
//         this.activeSesssions.updateAndGet(map -> map.put(uuid.toString(), sess));
//         return sess;
//     }
// 
//     public Option<Session> getSession(final String uuid) {
//         return this.activeSesssions.get().get(uuid);
//     }
// 
// }
// 
// Path: src/main/java/pl/setblack/pongi/users/repo/UsersRepositoryInMemory.java
// public class UsersRepositoryInMemory implements UsersRepository, Serializable {
//     private static final long serialVersionUID = 1L;
// 
//     private volatile HashMap<String, UserData> allUsers = HashMap.empty();
// 
// 
//     public RegUserStatus addUser(final String login, final String pass) {
//         if (!allUsers.containsKey(login)) {
//             allUsers = allUsers.put(login, new UserData(login, pass));
//             return new RegUserStatus(Option.none());
//         } else {
//             return new RegUserStatus(Option.some("user existed"));
//         }
//     }
// 
//     public boolean login(final String login, final String password) {
//         return allUsers.get(login).map(userData -> userData
//                 .hashedPassword
//                 .equals(password))
//                 .getOrElse(false);
// 
//     }
// 
// }


// Path: src/test/java/pl/setblack/pongi/users/UsersServiceTest.java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import pl.setblack.pongi.Server;
import pl.setblack.pongi.users.repo.SessionsRepo;
import pl.setblack.pongi.users.repo.UsersRepositoryInMemory;
import ratpack.test.embed.EmbeddedApp;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;

package pl.setblack.pongi.users;








class UsersServiceTest {
    private final Clock clock = Clock.fixed(Instant.parse("2007-12-03T10:15:30.00Z"), ZoneId.of("GMT"));


    @Test