package com.nimbits.it.ha;
import com.google.common.base.Optional;
import com.nimbits.client.io.Nimbits;
import com.nimbits.client.model.point.Point;
import com.nimbits.client.model.point.PointModel;
import com.nimbits.client.model.user.User;
import com.nimbits.client.model.user.UserModel;
import com.nimbits.client.model.webhook.DataChannel;
import com.nimbits.client.model.webhook.HttpMethod;
import com.nimbits.client.model.webhook.WebHook;
import com.nimbits.client.model.webhook.WebHookModel;
import com.nimbits.it.AbstractBaseNimbitsTest;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.After;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static junit.framework.TestCase.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* proves that different users with entities of the same name only get their entity
*
*/
public class UsersWithSameNameEntityTest extends AbstractBaseNimbitsTest {
List<Pair<String, String>> emails = new ArrayList<>();
List<User> users = new ArrayList<>();
List<Pair<User, Nimbits>> clients = new ArrayList<>();
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
public void testScenario() {
int count = 2;
String commonPointName = UUID.randomUUID().toString();
String commonHost = "http://test.com";
for (int i = 0; i < count; i++) {
emails.add(Pair.of(
String.format("%s@nimbits.com",
UUID.randomUUID().toString()),
UUID.randomUUID().toString()));
}
for (Pair<String, String> pair : emails) {
users.add(
adminClient.addUser(new UserModel.Builder().email(pair.getLeft()).password(pair.getRight()).create() )
);
}
assertEquals(count, users.size());
for (Pair<String, String> pair : emails) {
Nimbits userClient = new Nimbits.Builder()
.email(pair.getLeft())
.instance(host)
.token(pair.getRight()).create();
User user = userClient.getMe();
assertEquals(pair.getLeft(), user.getEmail().getValue());
Point sameNamePoint = userClient.addPoint(user, new PointModel.Builder()
.name(commonPointName).create());
Point uniquePoint = userClient.addPoint(user, new PointModel.Builder()
.name(String.valueOf(user.getEmail().hashCode())).create());
WebHook webHook = userClient.addWebHook(user, new WebHookModel.Builder()
.pathChannel(DataChannel.number)
.method(HttpMethod.GET)
.enabled(true)
.name(commonPointName)
.url(String.format("%s/%s", commonHost, user.getId()))
.create()
);
log(String.format("Added %s %s", sameNamePoint.getName(), uniquePoint.getName()) );
log(String.format("Added Hook: %s %s", webHook.getUrl(), user.getId()) );
clients.add(Pair.of(user, userClient));
}
for (Pair<User, Nimbits> clientPair : clients) {
Nimbits client = clientPair.getRight();
User user = clientPair.getKey();
Optional<Point> optional = client.findPointByName(commonPointName);
assertTrue(optional.isPresent());
Point foo = optional.get();
assertEquals(user.getId(), foo.getParent());
assertEquals(commonPointName, foo.getName().getValue());
Optional<WebHook> webHook = client.findWebHook(commonPointName);
assertTrue(webHook.isPresent());
assertEquals(webHook.get().getUrl().getUrl(), String.format("%s/%s", commonHost, user.getId()));
}
}
@Test
public void testAbsentIfNotFound() {
Optional<Point> optional = adminClient.findPointByName(UUID.randomUUID().toString());
assertFalse(optional.isPresent());
}
}