public void testInsertNotification() {
    ISession session = null;
    try {
      // Se intenta insertar una notificacion con una sesion invalida
      Server.getInstance().createNotification(-15, not);
      fail("se esperaba NotLoggedException");
    } catch (NotLoggedException e) {
    } catch (Exception e) {
      fail("se esperaba NotLoggedException");
    }

    try {
      // Se intenta insertar una notificacion
      session = Server.getInstance().login("emp2", "emp2");
      chiefClient.activate(IDatosPruebas.IP_ESCUCHA_CLIENTES);
      Server.getInstance().register(session.getId(), chiefClient);
      Server.getInstance().setCurrentProject(session.getId(), project.getId());
      not.getUsers().add(chief);
      Server.getInstance().createNotification(session.getId(), not);
      List<Notification> nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 1);
      assertEquals(nots.get(0), not);
      // Comprobamos que se ha avisado a los clientes del cambio del beneficiario
      Thread.sleep(100);
      assertEquals(chiefClient.getUltimoDato(), not);
    } catch (Exception e) {
      fail(e.toString());
    }
  }
  public void testGetNotificationsUser() {
    ISession session = null;
    try {
      // Se intentan obtener las notificaciones de un usuario con una sesion invalida
      Server.getInstance().getNotificationsUser(-15);
      fail("se esperaba NotLoggedException");
    } catch (NotLoggedException e) {
    } catch (Exception e) {
      fail("se esperaba NotLoggedException");
    }

    try {
      // Se intentan obtener las notificaciones de un usuario sin haber establecido el proyecto
      // actual
      session = Server.getInstance().login("emp2", "emp2");
      List<Notification> nots = Server.getInstance().getNotificationsUser(session.getId());
      assertTrue(nots.size() == 0);
    } catch (Exception e) {
      fail(e.toString());
    }

    try {
      // Se intentan obtener las notificaciones de un usuario
      not.getUsers().add(chief);
      Server.getInstance().setCurrentProject(session.getId(), project.getId());
      List<Notification> nots = Server.getInstance().getNotificationsUser(session.getId());
      assertTrue(nots.size() == 0);
      Server.getInstance().createNotification(session.getId(), not);
      nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 1);
      assertEquals(nots.get(0), not);
    } catch (Exception e) {
      fail(e.toString());
    }
  }
  public void testDeleteNotification() {
    ISession session = null;
    try {
      // Se intenta eliminar una notificacion con una sesion invalida
      Server.getInstance().deleteNotification(-15, not);
      fail("se esperaba NotLoggedException");
    } catch (NotLoggedException e) {
    } catch (Exception e) {
      fail("se esperaba NotLoggedException");
    }

    try {
      // Se intenta eliminar una notificacion con una sesion invalida
      Server.getInstance().deleteNotificationFromUser(-15, not);
      fail("se esperaba NotLoggedException");
    } catch (NotLoggedException e) {
    } catch (Exception e) {
      fail("se esperaba NotLoggedException");
    }

    try {
      session = Server.getInstance().login("emp2", "emp2");
      Server.getInstance().setCurrentProject(session.getId(), project.getId());
      List<Notification> nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 0);
      Server.getInstance().createNotification(session.getId(), not);
      nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 1);
      assertEquals(nots.get(0), not);
      // Se elimina una notificación
      Server.getInstance().deleteNotification(session.getId(), not);
      nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 0);
    } catch (Exception e) {
      fail(e.toString());
    }

    try {
      Server.getInstance().createNotification(session.getId(), not);
      not.getUsers().add(chief);
      Server.getInstance().modifyNotification(session.getId(), not);
      List<Notification> nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 1);
      assertEquals(nots.get(0), not);
      // Se elimina una notificación
      Server.getInstance().deleteNotificationFromUser(session.getId(), not);
      // Se ha lanzado el trigger de la base de datos, por lo que ya no existe esta notificacion
      nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 0);
    } catch (Exception e) {
      fail(e.toString());
    }
  }
  public void testUpdateNotification() {
    ISession session = null;
    try {
      // Se intenta modificar una notificacion con una sesion invalida
      Server.getInstance().modifyNotification(-15, not);
      fail("se esperaba NotLoggedException");
    } catch (NotLoggedException e) {
    } catch (Exception e) {
      fail("se esperaba NotLoggedException");
    }

    try {
      // Se intenta modificar una notificacion inexistente
      session = Server.getInstance().login("emp2", "emp2");
      Server.getInstance().modifyNotification(session.getId(), not);
      fail("se esperaba NonExistentNotificationException");
    } catch (NonExistentNotificationException e) {
    } catch (Exception e) {
      fail("se esperaba NonExistentNotificationException");
    }

    try {
      // Se intenta cambiar el estado de la notificación sin estar logueado
      Server.getInstance().modifyNotificationState(-15, not);
      Server.getInstance().getNotificationsUser(session.getId());
      fail("se esperaba NotLoggedException");
    } catch (NotLoggedException e) {
    } catch (Exception e) {
      fail("se esperaba NotLoggedException");
    }

    try {
      // Se intenta insertar una notificacion
      Server.getInstance().setCurrentProject(session.getId(), project.getId());
      Server.getInstance().createNotification(session.getId(), not);
      List<Notification> nots = Server.getInstance().getNotificationsProject(session.getId());
      assertTrue(nots.size() == 1);
      assertEquals(nots.get(0), not);
      // Se añade un usuario a la notificacion y se actualiza
      not.getUsers().add(chief);
      not.getUsers().add(employee);
      Server.getInstance().modifyNotification(session.getId(), not);
      nots = Server.getInstance().getNotificationsUser(session.getId());
      assertTrue(nots.size() == 1);
      assertEquals(nots.get(0), not);
      // Se modifica el estado de la notificacion para este usuario
      not.setState("Read");
      Server.getInstance().modifyNotificationState(session.getId(), not);
      nots = Server.getInstance().getNotificationsUser(session.getId());
      assertTrue(nots.size() == 1);
      assertEquals(nots.get(0), not);
      // Se comprueba que no ha afectado al otro usuario el cambio de estado
      session = Server.getInstance().login("emp1", "emp1");
      Server.getInstance().setCurrentProject(session.getId(), project.getId());
      nots = Server.getInstance().getNotificationsUser(session.getId());
      assertTrue(nots.size() == 1);
      assertFalse(nots.get(0).getState().startsWith("R"));
    } catch (Exception e) {
      fail(e.toString());
    }
  }