Skip to content

Commit

Permalink
Merge branch 'feature/506398-FiltrarPorPrecioMaximo' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
“Hector” committed Nov 4, 2024
2 parents 5b9eb2d + aa51a52 commit e4113a5
Show file tree
Hide file tree
Showing 13 changed files with 684 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package es.unican.gasolineras.activities.main;

import static androidx.test.espresso.Espresso.onData;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.RootMatchers.isPlatformPopup;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.anything;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static es.unican.gasolineras.utils.MockRepositories.getTestRepository;

import android.content.Context;

import androidx.test.espresso.DataInteraction;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.platform.app.InstrumentationRegistry;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import dagger.hilt.android.testing.BindValue;
import dagger.hilt.android.testing.HiltAndroidRule;
import dagger.hilt.android.testing.HiltAndroidTest;
import dagger.hilt.android.testing.UninstallModules;
import es.unican.gasolineras.R;
import es.unican.gasolineras.injection.RepositoriesModule;
import es.unican.gasolineras.repository.IGasolinerasRepository;

@UninstallModules(RepositoriesModule.class)
@HiltAndroidTest
public class FiltrarPorPrecioMaximoUITest {
@Rule(order = 0) // the Hilt rule must execute first
public HiltAndroidRule hiltRule = new HiltAndroidRule(this);

@Rule(order = 1)
public ActivityScenarioRule<MainView> activityRule = new ActivityScenarioRule<>(MainView.class);

// I need the context to access resources, such as the json with test gas stations
final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();

// Mock repository that provides data from a JSON file instead of downloading it from the internet.
@BindValue
public final IGasolinerasRepository repository = getTestRepository(context, R.raw.gasolineras_ccaa_06);


@Before
public void inicializa(){
}

@Test
public void testFiltarGasolinerasPorPrecioMaximoCasoExito() {

//clicka en filtrar
onView(withId(R.id.menuFiltrar)).perform(click());

//clicka en el selector de combustible
onView(withId(R.id.spinnerCombustible)).perform(click());

//elige la opcion gasolina 95 E5
onData(allOf(is(instanceOf(String.class)),
is("Gasoleo_A"))).inRoot(isPlatformPopup()).perform(click());

//clicka en el campo de precio máximo
onView(withId(R.id.etPrecioMax)).perform(click());

//escribe 1.512 en el campo de precio máximo
onView(withId(R.id.etPrecioMax)).perform(typeText("1.4"));

//clicka el boton filtrar
onView(withId(R.id.btnFiltrar)).perform(click());

//comprueba la direccion de la primera gasolinera
DataInteraction g1 = onData(anything()).inAdapterView(withId(R.id.lvStations)).atPosition(0);
g1.onChildView(withId(R.id.tvAddress)).check(matches(withText("CALLE GUTIERREZ SOLANA 24, 24")));

//comprueba la direccion de la segunda gasolinera
DataInteraction g2 = onData(anything()).inAdapterView(withId(R.id.lvStations)).atPosition(1);
g2.onChildView(withId(R.id.tvAddress)).check(matches(withText("P.I. CROS km CENTRO COMERCIAL M")));
}

@Test
public void testFiltrarGasolinerasPorPrecioMaximoError(){

//clicka en filtrar
onView(withId(R.id.menuFiltrar)).perform(click());

//comprueba mensaje de error
onView(withId(R.id.tvListaVacia)).
check(matches(withText("Error: No hay ningun punto de interes añadido")));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public void testOrdenaGasolinerasCercanasCasoExito() {
onView(withId(R.id.buttonGuardar)).perform(click());

//clicka en filtrar
onView(withId(R.id.menuFiltrar)).perform(click());
onView(withId(R.id.menuOrdenar)).perform(click());

//clicka en el selector de Pto Interes
onView(withId(R.id.spinnerPtosInteres)).perform(click());
Expand All @@ -112,7 +112,7 @@ public void testOrdenaGasolinerasCercanasCasoExito() {
public void OrdenarGasolinerasCercanasNoPtoInteres(){

//clicka en filtrar
onView(withId(R.id.menuFiltrar)).perform(click());
onView(withId(R.id.menuOrdenar)).perform(click());

//comprueba mensaje de error
onView(withId(R.id.tvListaVacia)).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

import es.unican.gasolineras.model.Gasolinera;
import es.unican.gasolineras.model.PuntoInteres;
import es.unican.gasolineras.model.TipoCombustible;
import es.unican.gasolineras.repository.IGasolinerasRepository;
import es.unican.gasolineras.repository.IPuntosInteresDAO;

/**
* The Presenter-View contract for the Main activity.
Expand Down Expand Up @@ -40,7 +40,7 @@ public interface Presenter {
public void onMenuInfoClicked();

/**
*
* The presenter is informed that the Filtrar item in the menu has been clicked
*/
public void onMenuAnhadirPuntoInteresClicked();
}
Expand Down Expand Up @@ -112,14 +112,28 @@ public interface View {

/**
* La vista manda una peticion al presenter para que muestre el
* popup de filtrar.
* popup de ordenar.
*/
public void showPopUpFiltrar();
public void showPopUpOrdenar();

/**
* Informa al presenter que el boton de ordenar ha sido clickado.
*/
public void onOrdenarClicked(PuntoInteres p);



/**
* Informa al presenter que el boton de filtrar ha sido clickado.
*/
public void showAnhadirPuntoInteresActivity();

public void onFiltrarClicked(double precioMax, TipoCombustible combustible);

/**
* La vista manda una peticion al presenter para que muestre el
* popup de filtrar.
*/
public void showPopUpFiltar();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import es.unican.gasolineras.model.Gasolinera;
import es.unican.gasolineras.model.IDCCAAs;
import es.unican.gasolineras.model.PuntoInteres;
import es.unican.gasolineras.model.TipoCombustible;
import es.unican.gasolineras.repository.ICallBack;
import es.unican.gasolineras.repository.IGasolinerasRepository;

Expand All @@ -19,6 +20,14 @@ public class MainPresenter implements IMainContract.Presenter {

/** Atributo lista gasolineras */
List<Gasolinera> gasolineras;
List<Gasolinera> gasolinerasMod;

// Banderas para controlar el estado de ordenación y filtrado
private boolean estaOrdenada = false;
private boolean estaFiltrada = false;

// Variables de estado para el último punto de interés de ordenación
private PuntoInteres puntoInteresOrdenActual = null;

/**
* @see IMainContract.Presenter#init(IMainContract.View)
Expand Down Expand Up @@ -54,49 +63,79 @@ public void onMenuInfoClicked() {
public void onMenuAnhadirPuntoInteresClicked() {
view.showAnhadirPuntoInteresActivity();
}


/**
* Muestra el popup de ordenar
*/
public void onMenuOrdenarClicked() {
view.showPopUpOrdenar();
}

/**
* Loads the gas stations from the repository, and sends them to the view
* Muestra el popup de filtrar
*/
public void onMenuFiltrarClicked() {
view.showPopUpFiltar();
}



private void load() {
IGasolinerasRepository repository = view.getGasolinerasRepository();

ICallBack callBack = new ICallBack() {

@Override
public void onSuccess(List<Gasolinera> stations) {
gasolineras = stations;
view.showStations(stations);
view.showLoadCorrect(stations.size());
gasolinerasMod = new ArrayList<>(gasolineras);
estaOrdenada = false;
estaFiltrada = false;
}

@Override
public void onFailure(Throwable e) {
view.showLoadError();
view.showLoadError();
}
};
view.getPuntosInteresDAO();
repository.requestGasolineras(callBack, IDCCAAs.CANTABRIA.id);
}

/**
* Muestra el popup de filtrar
* Muestra la lista de gasolineras ordenadas por el punto de interes
* @param p el punto de interes
*/
public void onMenuFiltrarClicked() {
view.showPopUpFiltrar();
public void ordenarGasolinerasCercanasPtoInteres(PuntoInteres p) {
puntoInteresOrdenActual = p;
estaOrdenada = true;
gasolinerasMod.sort(new GasolineraDistanciaComparator(p));
view.showStations(gasolinerasMod);
}

/**
* Muestra la lista de gasolineras ordenadas por el punto de interes
* @param p el punto de interes
* Filtra la lista de gasolineras por precio máximo y tipo de combustible.
* Aplica el filtro sobre la lista original y luego la ordena si estaba previamente ordenada.
* @param precioMax el precio máximo del combustible
* @param combustible el tipo de combustible
*/
public void ordenarGasolinerasCercanasPtoInteres(PuntoInteres p) {
GasolineraDistanciaComparator comparator = new GasolineraDistanciaComparator(p);
List<Gasolinera> gasolinerasCopia = new ArrayList<>(gasolineras);
gasolinerasCopia.sort(comparator);
view.showStations(gasolinerasCopia);
public void filtraGasolinerasPorPrecioMaximo(double precioMax, TipoCombustible combustible) {
estaFiltrada = true;

List<Gasolinera> gasolinerasFiltradas = new ArrayList<>();
for (Gasolinera gasolinera : gasolineras) {
double precioCombustible = combustible.getPrecio(gasolinera);
if (precioCombustible > 0.0 && precioCombustible <= precioMax) {
gasolinerasFiltradas.add(gasolinera);
}
}

// Si estaba ordenada, aplicar el orden sobre la lista filtrada
if (estaOrdenada) {
gasolinerasFiltradas.sort(new GasolineraDistanciaComparator(puntoInteresOrdenActual));
}

// Actualizar la lista modificada y mostrar
gasolinerasMod = gasolinerasFiltradas;
view.showStations(gasolinerasMod);
}
}
Loading

0 comments on commit e4113a5

Please sign in to comment.