This commit is contained in:
Adrian Kumpf
2019-04-06 18:59:56 +02:00
parent a75199e84f
commit cd4a9fbbb4
10 changed files with 516 additions and 439 deletions
+2 -1
View File
@@ -33,7 +33,8 @@ defmodule TeslaMateWeb.ConnCase do
Ecto.Adapters.SQL.Sandbox.mode(TeslaMate.Repo, {:shared, self()})
end
{:ok, _} = TeslaMateWeb.Endpoint.start_link()
# TODO remove and fix
TeslaMateWeb.Endpoint.start_link()
{:ok, conn: Phoenix.ConnTest.build_conn()}
end
+57
View File
@@ -0,0 +1,57 @@
defmodule TeslaMate.LogCarTest do
use TeslaMate.DataCase, async: true
alias TeslaMate.Log.Car
alias TeslaMate.Log
@valid_attrs %{efficiency: 0.153, eid: 42, model: "M3", vid: 42}
@update_attrs %{efficiency: 0.190, model: "MS", eid: 43, vid: 43}
@invalid_attrs %{efficiency: nil, eid: nil, model: nil, vid: nil}
def car_fixture(attrs \\ %{}) do
{:ok, car} =
attrs
|> Enum.into(@valid_attrs)
|> Log.create_car()
car
end
test "list_cars/0 returns all car" do
car = car_fixture()
assert Log.list_cars() == [car]
end
test "get_car!/1 returns the car with given id" do
car = car_fixture()
assert Log.get_car!(car.id) == car
end
test "create_car/1 with valid data creates a car" do
assert {:ok, %Car{} = car} = Log.create_car(@valid_attrs)
assert car.efficiency == 0.153
assert car.eid == 42
assert car.model == "M3"
assert car.vid == 42
end
test "create_car/1 with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = Log.create_car(@invalid_attrs)
end
test "update_car/2 with valid data updates the car" do
car = car_fixture()
assert {:ok, %Car{} = car} = Log.update_car(car, @update_attrs)
assert car.efficiency == 0.190
assert car.model == "MS"
assert car.eid == 42
assert car.vid == 42
end
test "update_car/2 with invalid data returns error changeset" do
car = car_fixture()
assert {:error, %Ecto.Changeset{}} = Log.update_car(car, @invalid_attrs)
assert car == Log.get_car!(car.id)
end
end
+174
View File
@@ -0,0 +1,174 @@
defmodule TeslaMate.LogTripChargingTest do
use TeslaMate.DataCase, async: true
alias TeslaMate.Log.{Car, ChargingProcess, Charge}
alias TeslaMate.Log
def car_fixture(attrs \\ %{}) do
{:ok, car} =
attrs
|> Enum.into(%{efficiency: 0.153, eid: 42, model: "M3", vid: 42})
|> Log.create_car()
car
end
@valid_attrs %{
date: DateTime.utc_now(),
charger_power: 50,
charger_phases: 3,
charge_energy_added: 0.160,
ideal_battery_range_km: 250
}
describe "start_charging_process/2" do
@valid_pos_attrs %{date: DateTime.utc_now(), latitude: 0.0, longitude: 0.0}
test "with valid data creates a position" do
assert %Car{id: car_id} = car_fixture()
assert {:ok, charging_process_id} = Log.start_charging_process(car_id, @valid_pos_attrs)
assert cproc =
%ChargingProcess{} =
ChargingProcess
|> preload([:position])
|> Repo.get(charging_process_id)
assert cproc.car_id == car_id
assert cproc.position.latitude == @valid_pos_attrs.latitude
assert cproc.position.longitude == @valid_pos_attrs.longitude
assert cproc.position.date == DateTime.truncate(@valid_pos_attrs.date, :second)
assert %DateTime{} = cproc.start_date
end
test "with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{} = changeset} = Log.start_charging_process(nil, %{})
assert errors_on(changeset) == %{
car_id: ["can't be blank"],
position: %{
car_id: ["can't be blank"],
date: ["can't be blank"],
latitude: ["can't be blank"],
longitude: ["can't be blank"]
}
}
end
end
describe "insert_charge/2" do
test "with valid data creates a position" do
assert %Car{id: car_id} = car_fixture()
assert {:ok, charging_process_id} = Log.start_charging_process(car_id, @valid_pos_attrs)
assert {:ok, %Charge{} = charge} = Log.insert_charge(charging_process_id, @valid_attrs)
assert charge.charging_process_id == charging_process_id
assert charge.date == DateTime.truncate(@valid_attrs.date, :second)
assert charge.charger_phases == @valid_attrs.charger_phases
assert charge.charger_power == @valid_attrs.charger_power
assert charge.charge_energy_added == @valid_attrs.charge_energy_added
assert charge.ideal_battery_range_km == @valid_attrs.ideal_battery_range_km
end
test "with invalid data returns error changeset" do
assert %Car{id: car_id} = car_fixture()
assert {:ok, charging_process_id} = Log.start_charging_process(car_id, @valid_pos_attrs)
assert {:error, %Ecto.Changeset{} = changeset} =
Log.insert_charge(charging_process_id, %{charger_phases: 0})
assert errors_on(changeset) == %{
charger_phases: ["must be greater than 0"],
charge_energy_added: ["can't be blank"],
charger_power: ["can't be blank"],
date: ["can't be blank"],
ideal_battery_range_km: ["can't be blank"]
}
end
end
describe "close_charging_process/1" do
test "aggregates charging data" do
assert %Car{id: car_id} = car_fixture()
assert {:ok, charging_process_id} = Log.start_charging_process(car_id, @valid_pos_attrs)
charges = [
%{
date: "2019-04-05 16:01:27",
battery_level: 50,
charge_energy_added: 0.41,
charger_actual_current: 5,
charger_phases: 3,
charger_pilot_current: 16,
charger_power: 4,
charger_voltage: 234,
ideal_battery_range_km: 266.6,
outside_temp: 16
},
%{
date: "2019-04-05 16:02:28",
battery_level: 51,
charge_energy_added: 0.51,
charger_actual_current: 5,
charger_phases: 3,
charger_pilot_current: 16,
charger_power: 4,
charger_voltage: 234,
ideal_battery_range_km: 267.3,
outside_temp: 15.5
},
%{
date: "2019-04-05 16:04:34",
battery_level: 52,
charge_energy_added: 0.72,
charger_actual_current: 5,
charger_phases: 3,
charger_pilot_current: 16,
charger_power: 4,
charger_voltage: 234,
ideal_battery_range_km: 268.6,
outside_temp: 15
},
%{
date: "2019-04-05 16:05:40",
battery_level: 54,
charge_energy_added: 0.72,
charger_actual_current: 5,
charger_phases: 3,
charger_pilot_current: 16,
charger_power: 4,
charger_voltage: 234,
ideal_battery_range_km: 268.6,
outside_temp: 14.5
}
]
for c <- charges do
assert {:ok, %Charge{} = charge} = Log.insert_charge(charging_process_id, c)
end
assert {:ok, %ChargingProcess{} = cproc} = Log.close_charging_process(charging_process_id)
assert %DateTime{} = cproc.start_date
assert %DateTime{} = cproc.end_date
assert cproc.calculated_max_range == 497
assert cproc.charge_energy_added == 0.72
assert cproc.duration_min == 4
assert cproc.end_battery_level == 54
assert cproc.start_battery_level == 50
assert cproc.start_soc == 266.6
assert cproc.end_soc == 268.6
assert cproc.outside_temp_avg == 15.25
end
test "closes charging process with zero charges " do
assert %Car{id: car_id} = car_fixture()
assert {:ok, charging_process_id} = Log.start_charging_process(car_id, @valid_pos_attrs)
assert {:ok, %ChargingProcess{} = cproc} = Log.close_charging_process(charging_process_id)
assert %DateTime{} = cproc.start_date
assert %DateTime{} = cproc.end_date
end
end
end
+62
View File
@@ -0,0 +1,62 @@
defmodule TeslaMate.LogStateTest do
use TeslaMate.DataCase, async: true
alias TeslaMate.Log.{State, Car}
alias TeslaMate.Log
def car_fixture(attrs \\ %{}) do
{:ok, car} =
attrs
|> Enum.into(%{efficiency: 0.153, eid: 42, model: "M3", vid: 42})
|> Log.create_car()
car
end
describe "create_state/1 " do
test "with valid data creates a state" do
assert %Car{id: car_id} = car_fixture()
assert :ok = Log.start_state(car_id, :online)
assert [%State{} = state] = Repo.all(State)
assert state.car_id == car_id
assert %DateTime{} = state.start_date
assert state.end_date == nil
assert state.state == :online
end
test "does not create a new state if the state is already open" do
assert %Car{id: car_id} = car_fixture()
assert :ok = Log.start_state(car_id, :online)
assert [%State{state: :online, start_date: start_date, end_date: nil}] = Repo.all(State)
assert :ok = Log.start_state(car_id, :online)
assert [%State{state: :online, start_date: start_date, end_date: nil}] = Repo.all(State)
end
test "closes the previous state if the state changed" do
assert %Car{id: car_id} = car_fixture()
assert :ok = Log.start_state(car_id, :online)
assert [%State{state: :online, start_date: start_date, end_date: nil}] = Repo.all(State)
:timer.sleep(10)
assert :ok = Log.start_state(car_id, :offline)
assert [
%State{state: :online, start_date: ^start_date, end_date: end_date},
%State{state: :offline, start_date: end_date, end_date: nil}
] = Repo.all(State)
end
test "with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{} = changeset} = Log.start_state(404, :foo)
assert errors_on(changeset) == %{state: ["is invalid"]}
assert {:error, %Ecto.Changeset{} = changeset} = Log.start_state(404, :asleep)
assert errors_on(changeset) == %{car_id: ["does not exist"]}
end
end
end
-393
View File
@@ -1,393 +0,0 @@
defmodule TeslaMate.LogTest do
use TeslaMate.DataCase
alias TeslaMate.Log
# describe "positions" do
# alias TeslaMate.Log.Position
# @valid_attrs %{name: "some name"}
# @update_attrs %{name: "some updated name"}
# @invalid_attrs %{name: nil}
# def position_fixture(attrs \\ %{}) do
# {:ok, position} =
# attrs
# |> Enum.into(@valid_attrs)
# |> Log.create_position()
# position
# end
# test "list_positions/0 returns all positions" do
# position = position_fixture()
# assert Log.list_positions() == [position]
# end
# test "get_position!/1 returns the position with given id" do
# position = position_fixture()
# assert Log.get_position!(position.id) == position
# end
# test "create_position/1 with valid data creates a position" do
# assert {:ok, %Position{} = position} = Log.create_position(@valid_attrs)
# assert position.name == "some name"
# end
# test "create_position/1 with invalid data returns error changeset" do
# assert {:error, %Ecto.Changeset{}} = Log.create_position(@invalid_attrs)
# end
# test "update_position/2 with valid data updates the position" do
# position = position_fixture()
# assert {:ok, %Position{} = position} = Log.update_position(position, @update_attrs)
# assert position.name == "some updated name"
# end
# test "update_position/2 with invalid data returns error changeset" do
# position = position_fixture()
# assert {:error, %Ecto.Changeset{}} = Log.update_position(position, @invalid_attrs)
# assert position == Log.get_position!(position.id)
# end
# test "delete_position/1 deletes the position" do
# position = position_fixture()
# assert {:ok, %Position{}} = Log.delete_position(position)
# assert_raise Ecto.NoResultsError, fn -> Log.get_position!(position.id) end
# end
# test "change_position/1 returns a position changeset" do
# position = position_fixture()
# assert %Ecto.Changeset{} = Log.change_position(position)
# end
# end
# describe "states" do
# alias TeslaMate.Log.State
# @valid_attrs %{end_date: "2010-04-17T14:00:00Z", end_position_id: 42, start_data: "2010-04-17T14:00:00Z", start_position_id: 42, state: "some state"}
# @update_attrs %{end_date: "2011-05-18T15:01:01Z", end_position_id: 43, start_data: "2011-05-18T15:01:01Z", start_position_id: 43, state: "some updated state"}
# @invalid_attrs %{end_date: nil, end_position_id: nil, start_data: nil, start_position_id: nil, state: nil}
# def state_fixture(attrs \\ %{}) do
# {:ok, state} =
# attrs
# |> Enum.into(@valid_attrs)
# |> Log.create_state()
# state
# end
# test "list_states/0 returns all states" do
# state = state_fixture()
# assert Log.list_states() == [state]
# end
# test "get_state!/1 returns the state with given id" do
# state = state_fixture()
# assert Log.get_state!(state.id) == state
# end
# test "create_state/1 with valid data creates a state" do
# assert {:ok, %State{} = state} = Log.create_state(@valid_attrs)
# assert state.end_date == DateTime.from_naive!(~N[2010-04-17T14:00:00Z], "Etc/UTC")
# assert state.end_position_id == 42
# assert state.start_data == DateTime.from_naive!(~N[2010-04-17T14:00:00Z], "Etc/UTC")
# assert state.start_position_id == 42
# assert state.state == "some state"
# end
# test "create_state/1 with invalid data returns error changeset" do
# assert {:error, %Ecto.Changeset{}} = Log.create_state(@invalid_attrs)
# end
# test "update_state/2 with valid data updates the state" do
# state = state_fixture()
# assert {:ok, %State{} = state} = Log.update_state(state, @update_attrs)
# assert state.end_date == DateTime.from_naive!(~N[2011-05-18T15:01:01Z], "Etc/UTC")
# assert state.end_position_id == 43
# assert state.start_data == DateTime.from_naive!(~N[2011-05-18T15:01:01Z], "Etc/UTC")
# assert state.start_position_id == 43
# assert state.state == "some updated state"
# end
# test "update_state/2 with invalid data returns error changeset" do
# state = state_fixture()
# assert {:error, %Ecto.Changeset{}} = Log.update_state(state, @invalid_attrs)
# assert state == Log.get_state!(state.id)
# end
# test "delete_state/1 deletes the state" do
# state = state_fixture()
# assert {:ok, %State{}} = Log.delete_state(state)
# assert_raise Ecto.NoResultsError, fn -> Log.get_state!(state.id) end
# end
# test "change_state/1 returns a state changeset" do
# state = state_fixture()
# assert %Ecto.Changeset{} = Log.change_state(state)
# end
# end
# describe "trips" do
# alias TeslaMate.Log.Trip
# @valid_attrs %{end_date: "2010-04-17T14:00:00Z", end_position_id: 42, start_date: "2010-04-17T14:00:00Z", start_position_id: 42}
# @update_attrs %{end_date: "2011-05-18T15:01:01Z", end_position_id: 43, start_date: "2011-05-18T15:01:01Z", start_position_id: 43}
# @invalid_attrs %{end_date: nil, end_position_id: nil, start_date: nil, start_position_id: nil}
# def trip_fixture(attrs \\ %{}) do
# {:ok, trip} =
# attrs
# |> Enum.into(@valid_attrs)
# |> Log.create_trip()
# trip
# end
# test "list_trips/0 returns all trips" do
# trip = trip_fixture()
# assert Log.list_trips() == [trip]
# end
# test "get_trip!/1 returns the trip with given id" do
# trip = trip_fixture()
# assert Log.get_trip!(trip.id) == trip
# end
# test "create_trip/1 with valid data creates a trip" do
# assert {:ok, %Trip{} = trip} = Log.create_trip(@valid_attrs)
# assert trip.end_date == DateTime.from_naive!(~N[2010-04-17T14:00:00Z], "Etc/UTC")
# assert trip.end_position_id == 42
# assert trip.start_date == DateTime.from_naive!(~N[2010-04-17T14:00:00Z], "Etc/UTC")
# assert trip.start_position_id == 42
# end
# test "create_trip/1 with invalid data returns error changeset" do
# assert {:error, %Ecto.Changeset{}} = Log.create_trip(@invalid_attrs)
# end
# test "update_trip/2 with valid data updates the trip" do
# trip = trip_fixture()
# assert {:ok, %Trip{} = trip} = Log.update_trip(trip, @update_attrs)
# assert trip.end_date == DateTime.from_naive!(~N[2011-05-18T15:01:01Z], "Etc/UTC")
# assert trip.end_position_id == 43
# assert trip.start_date == DateTime.from_naive!(~N[2011-05-18T15:01:01Z], "Etc/UTC")
# assert trip.start_position_id == 43
# end
# test "update_trip/2 with invalid data returns error changeset" do
# trip = trip_fixture()
# assert {:error, %Ecto.Changeset{}} = Log.update_trip(trip, @invalid_attrs)
# assert trip == Log.get_trip!(trip.id)
# end
# test "delete_trip/1 deletes the trip" do
# trip = trip_fixture()
# assert {:ok, %Trip{}} = Log.delete_trip(trip)
# assert_raise Ecto.NoResultsError, fn -> Log.get_trip!(trip.id) end
# end
# test "change_trip/1 returns a trip changeset" do
# trip = trip_fixture()
# assert %Ecto.Changeset{} = Log.change_trip(trip)
# end
# end
# describe "charging_states" do
# alias TeslaMate.Log.ChargingProcess
# @valid_attrs %{end_date: "2010-04-17T14:00:00Z", start_date: "2010-04-17T14:00:00Z"}
# @update_attrs %{end_date: "2011-05-18T15:01:01Z", start_date: "2011-05-18T15:01:01Z"}
# @invalid_attrs %{end_date: nil, start_date: nil}
# def charging_state_fixture(attrs \\ %{}) do
# {:ok, charging_state} =
# attrs
# |> Enum.into(@valid_attrs)
# |> Log.create_charging_state()
# charging_state
# end
# test "list_charging_states/0 returns all charging_states" do
# charging_state = charging_state_fixture()
# assert Log.list_charging_states() == [charging_state]
# end
# test "get_charging_state!/1 returns the charging_state with given id" do
# charging_state = charging_state_fixture()
# assert Log.get_charging_state!(charging_state.id) == charging_state
# end
# test "create_charging_state/1 with valid data creates a charging_state" do
# assert {:ok, %ChargingProcess{} = charging_state} = Log.create_charging_state(@valid_attrs)
# assert charging_state.end_date == DateTime.from_naive!(~N[2010-04-17T14:00:00Z], "Etc/UTC")
# assert charging_state.start_date == DateTime.from_naive!(~N[2010-04-17T14:00:00Z], "Etc/UTC")
# end
# test "create_charging_state/1 with invalid data returns error changeset" do
# assert {:error, %Ecto.Changeset{}} = Log.create_charging_state(@invalid_attrs)
# end
# test "update_charging_state/2 with valid data updates the charging_state" do
# charging_state = charging_state_fixture()
# assert {:ok, %ChargingProcess{} = charging_state} = Log.update_charging_state(charging_state, @update_attrs)
# assert charging_state.end_date == DateTime.from_naive!(~N[2011-05-18T15:01:01Z], "Etc/UTC")
# assert charging_state.start_date == DateTime.from_naive!(~N[2011-05-18T15:01:01Z], "Etc/UTC")
# end
# test "update_charging_state/2 with invalid data returns error changeset" do
# charging_state = charging_state_fixture()
# assert {:error, %Ecto.Changeset{}} = Log.update_charging_state(charging_state, @invalid_attrs)
# assert charging_state == Log.get_charging_state!(charging_state.id)
# end
# test "delete_charging_state/1 deletes the charging_state" do
# charging_state = charging_state_fixture()
# assert {:ok, %ChargingProcess{}} = Log.delete_charging_state(charging_state)
# assert_raise Ecto.NoResultsError, fn -> Log.get_charging_state!(charging_state.id) end
# end
# test "change_charging_state/1 returns a charging_state changeset" do
# charging_state = charging_state_fixture()
# assert %Ecto.Changeset{} = Log.change_charging_state(charging_state)
# end
# end
# describe "charges" do
# alias TeslaMate.Log.Charge
# @valid_attrs %{battery_level: 120.5, charge_energy_added: 120.5, charger_actual_current: 42, charger_phases: 42, charger_power: 120.5, charger_voltage: 42, date: "2010-04-17T14:00:00Z", ideal_battery_range_km: 120.5, outside_temp: 120.5}
# @update_attrs %{battery_level: 456.7, charge_energy_added: 456.7, charger_actual_current: 43, charger_phases: 43, charger_power: 456.7, charger_voltage: 43, date: "2011-05-18T15:01:01Z", ideal_battery_range_km: 456.7, outside_temp: 456.7}
# @invalid_attrs %{battery_level: nil, charge_energy_added: nil, charger_actual_current: nil, charger_phases: nil, charger_power: nil, charger_voltage: nil, date: nil, ideal_battery_range_km: nil, outside_temp: nil}
# def charge_fixture(attrs \\ %{}) do
# {:ok, charge} =
# attrs
# |> Enum.into(@valid_attrs)
# |> Log.create_charge()
# charge
# end
# test "list_charges/0 returns all charges" do
# charge = charge_fixture()
# assert Log.list_charges() == [charge]
# end
# test "get_charge!/1 returns the charge with given id" do
# charge = charge_fixture()
# assert Log.get_charge!(charge.id) == charge
# end
# test "create_charge/1 with valid data creates a charge" do
# assert {:ok, %Charge{} = charge} = Log.create_charge(@valid_attrs)
# assert charge.battery_level == 120.5
# assert charge.charge_energy_added == 120.5
# assert charge.charger_actual_current == 42
# assert charge.charger_phases == 42
# assert charge.charger_power == 120.5
# assert charge.charger_voltage == 42
# assert charge.date == DateTime.from_naive!(~N[2010-04-17T14:00:00Z], "Etc/UTC")
# assert charge.ideal_battery_range_km == 120.5
# assert charge.outside_temp == 120.5
# end
# test "create_charge/1 with invalid data returns error changeset" do
# assert {:error, %Ecto.Changeset{}} = Log.create_charge(@invalid_attrs)
# end
# test "update_charge/2 with valid data updates the charge" do
# charge = charge_fixture()
# assert {:ok, %Charge{} = charge} = Log.update_charge(charge, @update_attrs)
# assert charge.battery_level == 456.7
# assert charge.charge_energy_added == 456.7
# assert charge.charger_actual_current == 43
# assert charge.charger_phases == 43
# assert charge.charger_power == 456.7
# assert charge.charger_voltage == 43
# assert charge.date == DateTime.from_naive!(~N[2011-05-18T15:01:01Z], "Etc/UTC")
# assert charge.ideal_battery_range_km == 456.7
# assert charge.outside_temp == 456.7
# end
# test "update_charge/2 with invalid data returns error changeset" do
# charge = charge_fixture()
# assert {:error, %Ecto.Changeset{}} = Log.update_charge(charge, @invalid_attrs)
# assert charge == Log.get_charge!(charge.id)
# end
# test "delete_charge/1 deletes the charge" do
# charge = charge_fixture()
# assert {:ok, %Charge{}} = Log.delete_charge(charge)
# assert_raise Ecto.NoResultsError, fn -> Log.get_charge!(charge.id) end
# end
# test "change_charge/1 returns a charge changeset" do
# charge = charge_fixture()
# assert %Ecto.Changeset{} = Log.change_charge(charge)
# end
# end
describe "car" do
alias TeslaMate.Log.Car
@valid_attrs %{efficiency: 120.5, eid: 42, model: "some model", vid: 42}
@update_attrs %{
efficiency: 456.7,
model: "some updated model",
eid: 43,
vid: 43
}
@invalid_attrs %{efficiency: nil, eid: nil, model: nil, vid: nil}
def car_fixture(attrs \\ %{}) do
{:ok, car} =
attrs
|> Enum.into(@valid_attrs)
|> Log.create_car()
car
end
test "list_cars/0 returns all car" do
car = car_fixture()
assert Log.list_cars() == [car]
end
test "get_car!/1 returns the car with given id" do
car = car_fixture()
assert Log.get_car!(car.id) == car
end
test "create_car/1 with valid data creates a car" do
assert {:ok, %Car{} = car} = Log.create_car(@valid_attrs)
assert car.efficiency == 120.5
assert car.eid == 42
assert car.model == "some model"
assert car.vid == 42
end
test "create_car/1 with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = Log.create_car(@invalid_attrs)
end
test "update_car/2 with valid data updates the car" do
car = car_fixture()
assert {:ok, %Car{} = car} = Log.update_car(car, @update_attrs)
assert car.efficiency == 456.7
assert car.model == "some updated model"
assert car.eid == 42
assert car.vid == 42
end
test "update_car/2 with invalid data returns error changeset" do
car = car_fixture()
assert {:error, %Ecto.Changeset{}} = Log.update_car(car, @invalid_attrs)
assert car == Log.get_car!(car.id)
end
end
end
+187
View File
@@ -0,0 +1,187 @@
defmodule TeslaMate.LogTripTest do
use TeslaMate.DataCase, async: true
alias TeslaMate.Log.{Car, Position, Trip}
alias TeslaMate.Log
@valid_attrs %{date: DateTime.utc_now(), latitude: 0.0, longitude: 0.0}
def car_fixture(attrs \\ %{}) do
{:ok, car} =
attrs
|> Enum.into(%{efficiency: 0.153, eid: 42, model: "M3", vid: 42})
|> Log.create_car()
car
end
test "start_trip/1 returns the trip_id" do
assert %car{id: car_id} = car_fixture()
assert {:ok, trip_id} = Log.start_trip(car_id)
assert is_number(trip_id)
end
describe "insert_position/1" do
test "with valid data creates a position" do
assert %Car{id: car_id} = car_fixture()
assert {:ok, %Position{} = position} = Log.insert_position(car_id, @valid_attrs)
assert %DateTime{} = position.date
assert position.car_id == car_id
assert position.longitude == 0.0
assert position.latitude == 0.0
end
test "cannot insert positions for trips which don't exist" do
assert %Car{id: car_id} = car_fixture()
attrs = Map.put(@valid_attrs, :trip_id, 404)
assert {:error, %Ecto.Changeset{} = changeset} = Log.insert_position(car_id, attrs)
assert errors_on(changeset) == %{trip_id: ["does not exist"]}
end
test "with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{} = changeset} = Log.insert_position(nil, %{})
assert errors_on(changeset) == %{
car_id: ["can't be blank"],
date: ["can't be blank"],
latitude: ["can't be blank"],
longitude: ["can't be blank"]
}
end
end
describe "close_trip/2" do
test "aggregates trip data" do
assert %car{id: car_id} = car_fixture()
positions = [
%{
date: "2019-04-06 10:19:02",
latitude: 50.112198,
longitude: 11.597669,
speed: 23,
power: 15,
odometer: 284.85156,
ideal_battery_range_km: 338.8,
battery_level: 68,
outside_temp: 19.2
},
%{
date: "2019-04-06 10:20:08",
latitude: 50.112214,
longitude: 11.598471,
speed: 42,
power: -4,
odometer: 285.90556,
ideal_battery_range_km: 337.8,
battery_level: 68,
outside_temp: 19.0
},
%{
date: "2019-04-06 10:21:14",
latitude: 50.112167,
longitude: 11.599395,
speed: 34,
power: -7,
odometer: 286.969561,
ideal_battery_range_km: 336.8,
battery_level: 68,
outside_temp: 21.0
},
%{
date: "2019-04-06 10:22:20",
latitude: 50.112118,
longitude: 11.599919,
speed: 21,
power: 1,
odometer: 287.00556,
ideal_battery_range_km: 335.8,
battery_level: 68,
outside_temp: 18
},
%{
date: "2019-04-06 10:23:25",
latitude: 50.11196,
longitude: 11.600445,
speed: 39,
power: 36,
odometer: 288.045561,
ideal_battery_range_km: 334.8,
battery_level: 68,
outside_temp: 18.0
}
]
assert {:ok, trip_id} = Log.start_trip(car_id)
for p <- positions do
assert {:ok, _} = Log.insert_position(car_id, Map.put(p, :trip_id, trip_id))
end
assert {:ok, trip} = Log.close_trip(trip_id)
assert {:ok, trip.end_date, 0} == DateTime.from_iso8601("2019-04-06 10:23:25Z")
assert trip.outside_temp_avg == 19.04
assert trip.speed_max == 42
assert trip.power_max == 36.0
assert trip.power_min == -7.0
assert trip.power_avg == 8.2
assert trip.start_km == 284.85156
assert trip.end_km == 288.045561
assert trip.distance == 3.1940010000000143
assert trip.start_range_km == 334.8
assert trip.end_range_km == 338.8
assert trip.duration_min == 4
assert trip.consumption_kWh == 0.612
assert trip.consumption_kWh_100km == 19.160920738597053
end
test "deletes a trip and if it has no positions" do
assert %car{id: car_id} = car_fixture()
assert {:ok, trip_id} = Log.start_trip(car_id)
assert %Trip{} = Repo.get(Trip, trip_id)
assert {:ok, _trip} = Log.close_trip(trip_id)
assert nil == Repo.get(Trip, trip_id)
end
test "deletes a trip and its position if the distance driven is 0" do
assert %car{id: car_id} = car_fixture()
positions = [
%{date: "2019-04-06 10:00:00", latitude: 0.0, longitude: 0.0, odometer: 100},
%{date: "2019-04-06 10:00:00", latitude: 0.0, longitude: 0.0, odometer: 100}
]
assert {:ok, trip_id} = Log.start_trip(car_id)
for p <- positions do
assert {:ok, _} = Log.insert_position(car_id, Map.put(p, :trip_id, trip_id))
end
assert {:ok, %Trip{distance: 0.0}} = Log.close_trip(trip_id)
assert nil == Repo.get(Trip, trip_id)
end
end
test "deletes a trip and its position if the distance attributes are nil" do
assert %car{id: car_id} = car_fixture()
positions = [
%{date: "2019-04-06 10:00:00", latitude: 0.0, longitude: 0.0},
%{date: "2019-04-06 10:00:00", latitude: 0.0, longitude: 0.0}
]
assert {:ok, trip_id} = Log.start_trip(car_id)
for p <- positions do
assert {:ok, _} = Log.insert_position(car_id, Map.put(p, :trip_id, trip_id))
end
assert {:ok, %Trip{distance: nil}} = Log.close_trip(trip_id)
assert nil == Repo.get(Trip, trip_id)
end
end
-14
View File
@@ -27,20 +27,6 @@ defmodule TeslaMate.Vehicles.VehicleTest do
assert_receive {:start_state, 999, :online}
# assert_receive {:insert_position,
# %{
# altitude: nil,
# battery_level: nil,
# date: ^now,
# ideal_battery_range_km: nil,
# latitude: 0.0,
# longitude: 0.0,
# odometer: nil,
# outside_temp: nil,
# power: nil,
# speed: nil
# }}
refute_receive _
end