Skip to content

Commit

Permalink
refactor: with repositories and use case
Browse files Browse the repository at this point in the history
  • Loading branch information
gabbloquet committed Mar 16, 2024
1 parent b5333b0 commit a06a39c
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.github.gabbloquet.features.rent.application;

import io.github.gabbloquet.rent.domain.CarRepository;
import io.github.gabbloquet.rent.domain.CustomerRepository;
import io.github.gabbloquet.rent.domain.model.Car;
import io.github.gabbloquet.rent.domain.model.Customer;
import io.github.gabbloquet.rent.domain.model.RentRequest;
import io.github.gabbloquet.rent.domain.model.RentalRequest;
import io.github.gabbloquet.rent.infra.InMemoryCarRepository;
import io.github.gabbloquet.rent.infra.InMemoryCustomerRepository;
import lombok.AllArgsConstructor;

public class RentRequestUseCase {

private CarRepository carRepository;
private CustomerRepository customerRepository;

public RentRequestUseCase(CarRepository carRepository, CustomerRepository customerRepository) {
this.carRepository = carRepository;
this.customerRepository = customerRepository;
}

public RentalRequest execute(RentRequest command) {
Car car = carRepository.get(command.carName());
Customer customer = customerRepository.get(command.name());
return customer.rent(car);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.github.gabbloquet.rent.domain;

import io.github.gabbloquet.rent.domain.model.Car;

public interface CarRepository {
void add(Car car);

Car get(String carName);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.github.gabbloquet.rent.domain;

import io.github.gabbloquet.rent.domain.model.Customer;

public interface CustomerRepository {
void add(Customer customer);

Customer get(String name);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.github.gabbloquet.rent.domain.model;

public record Customer(String name) {
public record Customer(String name, boolean disposablePhone, boolean provisionalNumber) {
public RentalRequest rent(Car car) {
if(car.name().contains("TWINGO")){
return new RentalRequest(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.github.gabbloquet.rent.domain.model;

public record RentRequest(String name, String carName) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.github.gabbloquet.rent.infra;

import io.github.gabbloquet.rent.domain.CarRepository;
import io.github.gabbloquet.rent.domain.model.Car;

import java.util.ArrayList;
import java.util.List;

public class InMemoryCarRepository implements CarRepository {

private final List<Car> cars = new ArrayList<>();

@Override
public void add(Car car) {
cars.add(car);
}

@Override
public Car get(String carName) {
return cars.stream().filter(car -> car.name().equals(carName)).findFirst().get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.github.gabbloquet.rent.infra;

import io.github.gabbloquet.rent.domain.CustomerRepository;
import io.github.gabbloquet.rent.domain.model.Customer;

import java.util.ArrayList;
import java.util.List;

public class InMemoryCustomerRepository implements CustomerRepository {

private final List<Customer> customers = new ArrayList<>();

@Override
public void add(Customer customer) {
customers.add(customer);
}

@Override
public Customer get(String name) {
return customers.stream()
.filter(customer -> customer.name().equals(name))
.findFirst()
.get();
}
}
Original file line number Diff line number Diff line change
@@ -1,39 +1,50 @@
package io.github.gabbloquet.features.rent.domain.specs;

import io.cucumber.java.fr.Alors;
import io.cucumber.java.fr.Et;
import io.cucumber.java.fr.Etantdonné;
import io.cucumber.java.fr.Quand;
import io.github.gabbloquet.features.rent.application.RentRequestUseCase;
import io.github.gabbloquet.rent.domain.model.RentRequest;
import io.github.gabbloquet.rent.domain.CarRepository;
import io.github.gabbloquet.rent.domain.CustomerRepository;
import io.github.gabbloquet.rent.infra.InMemoryCarRepository;
import io.github.gabbloquet.rent.domain.model.Car;
import io.github.gabbloquet.rent.domain.model.Customer;
import io.github.gabbloquet.rent.domain.model.RentalRequest;
import io.github.gabbloquet.rent.infra.InMemoryCustomerRepository;

import static org.assertj.core.api.Assertions.assertThat;

public class ValidateRentSpec {

private Customer customer;
private Car car;
private RentalRequest rentalRequest;

private final CarRepository carRepository = new InMemoryCarRepository();
private final CustomerRepository customerRepository = new InMemoryCustomerRepository();
private final RentRequestUseCase rentRequestUseCase = new RentRequestUseCase(carRepository, customerRepository);

@Etantdonné("Mr {string} propriétaire d’un téléphone jetable")
public void mr_propriétaire_d_un_téléphone_jetable(String name) {
this.customer = new Customer(name);
Customer customer = new Customer(name, true, false);
customerRepository.add(customer);
}

@Etantdonné("Mr {string} ayant un numéro provisoire")
public void mrAyantUnNumeroProvisoire(String name) {
this.customer = new Customer(name);
Customer customer = new Customer(name, false, true);
customerRepository.add(customer);
}

@Etantdonné("une {string} à {int}€ par mois")
public void une_voiture_a(String carName, int price) {
this.car = new Car(carName, price);
Car car = new Car(carName, price);
carRepository.add(car);
}

@Quand("Mr {string} demande à louer une {string}")
public void mrDemandeALouerUne(String name, String carName) {
rentalRequest = customer.rent(car);
RentRequest command = new RentRequest(name, carName);
rentalRequest = rentRequestUseCase.execute(command);
}

@Alors("sa demande de location est invalidée")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Fonctionnalité: Valider une demande de location
Et Mr Tapie est informé "Numéro de téléphone incompatible"

Scénario: Client au numéro provisoire et prix bas
Etant donné Mr "Rocancourt" ayant un numéro provisoire
Etant donné Mr "Roquancourt" ayant un numéro provisoire
Et une "TWINGO E-Tech" à 100€ par mois
Quand Mr "Roquancourt" demande à louer une "TWINGO E-Tech"
Alors sa demande de location est validée

0 comments on commit a06a39c

Please sign in to comment.