package tests;
import static org.junit.Assert.*;
import java.sql.SQLException;
import jooqdb.tables.records.UserRecord;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.jooq.tools.jdbc.MockConnection;
import org.jooq.tools.jdbc.MockDataProvider;
import org.jooq.tools.jdbc.MockExecuteContext;
import org.jooq.tools.jdbc.MockResult;
import org.junit.Before;
import org.junit.Test;
import server.DBManager;
import server.tokens.AddEventToken;
import server.tokens.RegistrationToken;
import server.tokens.UserUpdateToken;
import static jooqdb.Tables.USER;
import static jooqdb.Tables.USER_FRIENDS;
import static jooqdb.Tables.FRIEND_REQUEST_STASH;
import static jooqdb.Tables.EVENT;
public class DBManagerTest {
public class MyProvider implements MockDataProvider {
@Override
public MockResult[] execute(MockExecuteContext ctx) throws SQLException {
// You might need a DSLContext to create org.jooq.Result and org.jooq.Record objects
DSLContext create = DSL.using(SQLDialect.MYSQL);
MockResult[] mock = new MockResult[1];
// The execute context contains SQL string(s), bind values, and other meta-data
String sql = ctx.sql();
System.out.println("SQL Query: " + sql);
// Exceptions are propagated through the JDBC and jOOQ APIs
if (sql.toUpperCase().startsWith("DROP")) {
throw new SQLException("Statement not supported: " + sql);
}
// You decide, whether any given statement returns results, and how many
else if (sql.toUpperCase().startsWith("SELECT")) {
// Always return one author record
Result<UserRecord> result = create.newResult(USER);
result.add(create.newRecord(USER));
result.get(0).setValue(USER.ID, 1);
result.get(0).setValue(USER.USERNAME, "Orwell");
mock[0] = new MockResult(1, result);
}
else if (sql.toUpperCase().startsWith("INSERT")) {
mock[0] = new MockResult(1, create.newResult(USER));
}
else if (sql.toUpperCase().startsWith("UPDATE")) {
mock[0] = new MockResult(1, create.newResult(USER));
}
else if (sql.toUpperCase().startsWith("DELETE")) {
mock[0] = new MockResult(1, create.newResult(USER));
}
// You can detect batch statements easily
else if (ctx.batch()) {
// [...]
}
return mock;
}
}
MockDataProvider provider;
MockConnection connection;
DSLContext create;
@Before
public void init() {
// Initialise your data provider (implementation further down):
provider = new MyProvider();
connection = new MockConnection(provider);
// Pass the mock connection to a jOOQ DSLContext:
create = DSL.using(connection, SQLDialect.MYSQL);
}
@Test
public void testUpdateUser() {
UserUpdateToken t = new UserUpdateToken(16.23534, 11.23454);
t.id = "1";
create.update(USER)
.set(USER.LONGITUDE, t.Longitude)
.set(USER.LATITUDE, t.Latitude)
.where(USER.ID.equal(Integer.parseInt(t.id)))
.execute();
}
@Test
public void testInsertUser() {
RegistrationToken t = new RegistrationToken();
t.username = "TestUser";
t.email = "test@gmail.com";
t.password = "str0ngp4ssw0rd";
t.result = false;
byte nope = 0;
create.insertInto(USER)
//.set(USER.ID, Integer.parseInt(t.sId))
.set(USER.USERNAME, t.username)
.set(USER.EMAIL, t.email)
.set(USER.PASSWORD, t.password)
.set(USER.AVATAR, "nicolascage.png")
.set(USER.ISONLINE, nope)
.execute();
System.out.println("New User created!");
}
@Test
public void testUpdateEvent() {
String Eventname = "Test Event";
create.update(EVENT)
.set(EVENT.ATTENDEES, 2)
.where(EVENT.NAME.equal(Eventname))
.execute();
}
@Test
public void testInsertEvent() {
AddEventToken aet = new AddEventToken("Test Event", "This is a test event", 100, 14.22445, 18.23553);
create.insertInto(EVENT)
.set(EVENT.DESCRIPTION, aet.description)
.set(EVENT.NAME, aet.name)
.set(EVENT.TIME, aet.toEnd)
.set(EVENT.LATITUDE, aet.Latitude)
.set(EVENT.LONGITUDE, aet.Longitude)
.set(EVENT.ATTENDEES, 0)
.execute();
System.out.println("New Event created!");
}
@Test
public void testDeletetEvent() {
String Eventname = "Test Event";
create.delete(EVENT)
.where(EVENT.NAME.equal(Eventname))
.execute();
}
@Test
public void testCreateFriends() {
int friender_ID = 78;
int friendee_ID = 87;
byte nope = 0;
create.insertInto(USER_FRIENDS)
.set(USER_FRIENDS.FRIENDER_ID, friender_ID)
.set(USER_FRIENDS.FRIENDEE_ID, friendee_ID)
.set(USER_FRIENDS.TRACKING_FLAG, nope)
.execute();
}
@Test
public void testDeleteFriends() {
int exfriend_id = 5;
int your_id = 19;
// Delete the friend relation
create.delete(USER_FRIENDS)
.where(USER_FRIENDS.FRIENDEE_ID.equal(exfriend_id))
.and(USER_FRIENDS.FRIENDER_ID.equal(your_id))
.execute();
create.delete(USER_FRIENDS)
.where(USER_FRIENDS.FRIENDEE_ID.equal(your_id))
.and(USER_FRIENDS.FRIENDER_ID.equal(exfriend_id))
. execute();
}
@Test
public void testInsertFriendStash() {
// Get User_ID from friender
int friender_ID = 8;
// Get User_ID from friendee
int friendee_ID = 18;
create.insertInto(FRIEND_REQUEST_STASH)
.set(FRIEND_REQUEST_STASH.FRIENDER_ID, friender_ID)
.set(FRIEND_REQUEST_STASH.FRIENDEE_ID, friendee_ID)
.execute();
}
@Test
public void testDeletetFriendStash() {
int friend_id = 4;
int your_id = 293;
create.delete(FRIEND_REQUEST_STASH)
.where(FRIEND_REQUEST_STASH.FRIENDER_ID.equal(your_id))
.and(FRIEND_REQUEST_STASH.FRIENDEE_ID.equal(friend_id))
.execute();
}
@Test
public void testCalculateDistance() {
DBManager dbm = new DBManager();
assertTrue(dbm.calculateDistance(47.266667, 11.383333, 47.273333, 11.241389) > 10 &&
dbm.calculateDistance(47.266667, 11.383333, 47.273333, 11.241389) < 12);
}
}