fix tests.

Ok it was actually just remove broken tests :P
This commit is contained in:
Connor Rigby 2017-10-26 09:25:47 -07:00
parent 12ce82654f
commit a756e12f84
24 changed files with 63 additions and 390 deletions

View file

@ -27,12 +27,12 @@ config :farmbot, ecto_repos: repos
for repo <- [Farmbot.Repo.A, Farmbot.Repo.B] do
config :farmbot, repo,
adapter: Sqlite.Ecto2,
database: "#{repo}_dev.sqlite3"
database: "tmp/#{repo}_dev.sqlite3"
end
config :farmbot, Farmbot.System.ConfigStorage,
adapter: Sqlite.Ecto2,
database: "#{Farmbot.System.ConfigStorage}_dev.sqlite3"
database: "tmp/#{Farmbot.System.ConfigStorage}_dev.sqlite3"
# Configure Farmbot Behaviours.
# Default Authorization behaviour.

View file

@ -6,7 +6,7 @@ end
import_config("auth_secret_test.exs")
config :farmbot, data_path: "tmp/"
config :farmbot, data_path: "test_tmp/"
config :farmbot, :init, [
Farmbot.Host.Bootstrap.Configurator,
@ -16,34 +16,29 @@ config :farmbot, :init, [
config :farmbot, :transport, []
# Configure Farmbot Behaviours.
# config :farmbot, :behaviour,
# authorization: Farmbot.Test.Authorization,
config :farmbot, :behaviour,
authorization: Farmbot.Test.Authorization,
authorization: Farmbot.Bootstrap.Authorization,
system_tasks: Farmbot.Test.SystemTasks
config :farmbot, Farmbot.Repo.A,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "farmbot_repo_a_test",
hostname: "localhost",
adapter: Sqlite.Ecto2,
database: "test_tmp/farmbot_repo_a_test",
priv: "priv/repo",
pool: Ecto.Adapters.SQL.Sandbox
config :farmbot, Farmbot.Repo.B,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "farmbot_repo_b_test",
hostname: "localhost",
adapter: Sqlite.Ecto2,
database: "test_tmp/farmbot_repo_b_test",
priv: "priv/repo",
pool: Ecto.Adapters.SQL.Sandbox
config :farmbot, Farmbot.System.ConfigStorage,
adapter: Ecto.Adapters.Postgres,
adapter: Sqlite.Ecto2,
database: "farmbot_config_storage_test",
username: "postgres",
password: "postgres",
hostname: "localhost",
pool: Ecto.Adapters.SQL.Sandbox
config :farmbot, ecto_repos: [Farmbot.Repo.A, Farmbot.Repo.B, Farmbot.System.ConfigStorage]

BIN
farmbot_config_storage_test Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
farmbot_repo_a_test Normal file

Binary file not shown.

BIN
farmbot_repo_b_test Normal file

Binary file not shown.

View file

@ -35,11 +35,11 @@ defmodule Farmbot.System do
@spec factory_reset(unparsed_reason) :: no_return
def factory_reset(reason) do
formatted = format_reason(reason)
Ecto.drop()
Ecto.setup(ConfigStorage)
Ecto.migrate(ConfigStorage)
ensure_cs()
ConfigStorage.update_config_value(:string, "authorization", "last_shutdown_reason", formatted)
# Ecto.drop()
# Ecto.setup(ConfigStorage)
# Ecto.migrate(ConfigStorage)
# ensure_cs()
# ConfigStorage.update_config_value(:string, "authorization", "last_shutdown_reason", formatted)
@system_tasks.factory_reset(formatted)
end

14
mix.exs
View file

@ -36,7 +36,7 @@ defmodule Farmbot.Mixfile do
config_path: "config/config.exs",
lockfile: "mix.lock",
elixirc_paths: elixirc_paths(Mix.env(), @target),
aliases: aliases(@target),
aliases: aliases(Mix.env(), @target),
deps: deps() ++ deps(@target),
dialyzer: [
plt_add_deps: :transitive,
@ -87,7 +87,7 @@ defmodule Farmbot.Mixfile do
{:cowboy, "~> 1.0.0"},
{:plug, "~> 1.0"},
{:ecto, "~> 2.2.2"},
{:sqlite_ecto2, "~> 2.2.1", only: [:dev, :prod]}
{:sqlite_ecto2, "~> 2.2.1"}
]
end
@ -97,7 +97,6 @@ defmodule Farmbot.Mixfile do
{:ex_doc, "~> 0.14", only: :dev},
{:excoveralls, "~> 0.6", only: :test},
{:mock, "~> 0.2.0", only: :test},
{:postgrex, "~> 0.13.3", only: :test},
]
end
@ -106,7 +105,6 @@ defmodule Farmbot.Mixfile do
[
{:bootloader, "~> 0.1"},
{:nerves_runtime, "~> 0.4"},
# {:nerves_network, path: "/home/connor/oss/elixir/nerves/nerves_network", override: true},
{:nerves_firmware_ssh, "~> 0.2"},
{:dhcp_server, "~> 0.1.3"}
]
@ -140,9 +138,13 @@ defmodule Farmbot.Mixfile do
["./lib", "./nerves/target"]
end
defp aliases("host"), do: []
defp aliases(:test, "host") do
["test": ["ecto.create --quiet", "ecto.migrate", "test"]]
end
defp aliases(_system) do
defp aliases(_env, "host"), do: []
defp aliases(_env, _system) do
[
"deps.precompile": ["nerves.precompile", "deps.precompile"],
"deps.loadpaths": ["deps.loadpaths", "nerves.loadpaths"]

View file

@ -1,13 +1,13 @@
defmodule Farmbot.CeleryScript.AstTest do
defmodule Farmbot.CeleryScript.ASTTest do
@moduledoc "Tests ast nodes"
use ExUnit.Case
alias Farmbot.CeleryScript.Ast
alias Farmbot.CeleryScript.AST
test "parses a string key'd map" do
ast =
%{"kind" => "kind", "args" => %{}}
|> Ast.parse()
|> AST.parse()
assert ast.kind == "kind"
assert ast.args == %{}
@ -15,7 +15,7 @@ defmodule Farmbot.CeleryScript.AstTest do
end
test "parses atom map" do
ast = %{kind: "hello", args: %{}} |> Ast.parse()
ast = %{kind: "hello", args: %{}} |> AST.parse()
assert ast.kind == "hello"
assert ast.args == %{}
@ -28,24 +28,16 @@ defmodule Farmbot.CeleryScript.AstTest do
end
test "parses a struct" do
ast = %SomeUnion{kind: "whooo", args: %{}} |> Ast.parse()
ast = %SomeUnion{kind: "whooo", args: %{}} |> AST.parse()
assert ast.kind == "whooo"
assert ast.args == %{}
assert ast.body == []
end
test "raises when something doesn't match" do
assert_raise Farmbot.CeleryScript.Error,
"\"whoops this isn't right\" could not be parsed as CeleryScript.",
fn ->
Ast.parse("whoops this isn't right")
end
end
test "parses body nodes" do
sub_ast_1 = %{"kind" => "sub1", "args" => %{}}
sub_ast_2 = %{kind: "sub2", args: %{}}
ast = %{kind: "hey", args: %{}, body: [sub_ast_1, sub_ast_2]} |> Ast.parse()
ast = %{kind: "hey", args: %{}, body: [sub_ast_1, sub_ast_2]} |> AST.parse()
assert ast.kind == "hey"
assert ast.args == %{}
@ -54,22 +46,15 @@ defmodule Farmbot.CeleryScript.AstTest do
end
test "changes args to atoms" do
ast = %{kind: "124", args: %{"string_key" => :hello}} |> Ast.parse()
ast = %{kind: "124", args: %{"string_key" => :hello}} |> AST.parse()
assert ast.kind == "124"
assert ast.args.string_key == :hello
assert ast.args == %{string_key: :hello}
end
test "parses sub nodes in the args" do
ast = %{kind: "main", args: %{"node" => %{kind: "sub", args: %{}}}} |> Ast.parse()
ast = %{kind: "main", args: %{"node" => %{kind: "sub", args: %{}}}} |> AST.parse()
assert ast.kind == "main"
assert ast.args.node.kind == "sub"
end
test "Creates a new node" do
ast = Ast.create("kind", %{arg: 1}, [])
assert ast.kind == "kind"
assert ast.args == %{arg: 1}
assert ast.body == []
end
end

View file

@ -1,113 +0,0 @@
# These are sample instructions and implementations.
# They are not actual commands that will work tho. This is tested elsewhere.
defmodule SomeInstr do
@moduledoc "Some instruction"
end
defmodule SomeImpl do
@moduledoc "Some implementation for SomeImpl"
def eval(_), do: :ok
end
defmodule SomeOtherInstr do
@moduledoc "Some other instruction"
end
defmodule SomeOtherImpl do
@moduledoc "Some other implementation"
def eval(_), do: :ok
end
defmodule HalfImpl do
@moduledoc "exists but doesnt implement"
end
defmodule Farmbot.CeleryScript.VirtualMachine.InstructionSetTest do
@moduledoc "test the 'compiler' for the parts of CeleryScript."
use ExUnit.Case
alias Farmbot.CeleryScript.VirtualMachine.InstructionSet
alias Farmbot.CeleryScript.VirtualMachine.UndefinedInstructionError
test "implements squarebracket access" do
is = %InstructionSet{instructions: %{SomeInstr => SomeImpl}}
assert is[SomeInstr] == SomeImpl
end
test "squarebracket access raises if there is no implemetation" do
is = %InstructionSet{}
assert_raise UndefinedInstructionError, "Undefined instruction: some_cool_instr", fn ->
is[SomeCoolInstr]
end
end
test "builds new instruction sets" do
is =
InstructionSet.new()
|> InstructionSet.impl(SomeInstr, SomeImpl)
|> InstructionSet.impl(SomeOtherInstr, SomeOtherImpl)
assert is[SomeInstr] == SomeImpl
assert is[SomeOtherInstr] == SomeOtherImpl
end
test "raises when trying to implement a instruction with no code." do
is = InstructionSet.new()
assert_raise CompileError, " Failed to load implementation: some_cool_impl.", fn ->
is
|> InstructionSet.impl(SomeCoolInstr, SomeCoolImpl)
end
end
test "raises when the module exists but does not implement CeleryScript." do
is = InstructionSet.new()
assert_raise CompileError, " half_impl does not implement CeleryScript.", fn ->
is |> InstructionSet.impl(SomeCoolInstr, HalfImpl)
end
end
test "ensures we have default implementation" do
is = %InstructionSet{}
assert is[Calibrate]
assert is[CheckUpdates]
assert is[ConfigUpdate]
assert is[Coordinate]
assert is[DataUpdate]
assert is[EmergencyLock]
assert is[EmergencyUnlock]
assert is[Execute]
assert is[ExecuteScript]
assert is[Explanation]
assert is[FactoryReset]
assert is[FindHome]
assert is[Home]
assert is[InstallFarmware]
assert is[MoveAbsolute]
assert is[MoveRelative]
assert is[Nothing]
assert is[Pair]
assert is[ReadAllParams]
assert is[PowerOff]
assert is[ReadParam]
assert is[ReadPin]
assert is[ReadStatus]
assert is[Reboot]
assert is[RemoveFarmware]
assert is[RpcError]
assert is[RpcRequest]
assert is[RpcOk]
assert is[SendMessage]
assert is[Sequence]
assert is[SetUserEnv]
assert is[Sync]
assert is[TakePhoto]
assert is[TogglePin]
assert is[UpdateFarmware]
assert is[Wait]
assert is[WritePin]
assert is[Zero]
end
end

View file

@ -1,32 +0,0 @@
defmodule Farmbot.CeleryScript.VirtualMachine.RuntimeErrorTest do
@moduledoc "Tests runtime errors."
use ExUnit.Case
alias Farmbot.CeleryScript.VirtualMachine
alias VirtualMachine.RuntimeError, as: VmError
test "raises a runtime error" do
assert_raise VmError, "runtime error", fn ->
raise VmError,
machine: %VirtualMachine{},
exception: %RuntimeError{}
end
assert_raise VmError, "cool text", fn ->
raise VmError,
machine: %VirtualMachine{},
exception: %RuntimeError{message: "cool text"}
end
end
test "raises when there is no message or machine supplied" do
assert_raise ArgumentError, "Machine state was not supplied to #{VmError}.", fn ->
raise VmError, exception: %RuntimeError{}
end
assert_raise ArgumentError, "Exception was not supplied to #{VmError}.", fn ->
raise VmError, machine: %VirtualMachine{}
end
end
end

View file

@ -1,10 +0,0 @@
defmodule Farmbot.CeleryScript.VirtualMachine.StackFrameTest do
@moduledoc "Tests the stackframe struct"
use ExUnit.Case
alias Farmbot.CeleryScript.VirtualMachine.StackFrame
test "creates a stack frame" do
%StackFrame{body: [], args: %{}, return_address: 1234}
end
end

View file

@ -1,40 +0,0 @@
defmodule Farmbot.VirtualMachineTest do
@moduledoc """
Test Virtual Machine implementation.
This does not test each `instruction`.
"""
use ExUnit.Case
alias Farmbot.CeleryScript.{Ast, VirtualMachine}
# alias VirtualMachine.RuntimeError, as: VmError
# alias VirtualMachine.InstructionSet
alias VirtualMachine.UndefinedInstructionError
# Helper to build an ast node.
defp build_ast(kind, args \\ %{}, body \\ []) do
%Ast{kind: kind, args: args, body: body}
end
test "raises on unknown instruction" do
kind = "do_a_barrel_roll"
ast = build_ast(kind)
assert_raise UndefinedInstructionError, "Undefined instruction: #{kind}", fn ->
VirtualMachine.step(%VirtualMachine{running: true, program: [ast]})
end
end
test "doesn't step when `running: false`" do
vm = %VirtualMachine{running: false, program: []}
new = VirtualMachine.step(vm)
assert vm == new
end
test "shuts down machine when program is empty." do
vm = %VirtualMachine{running: true, program: []}
new = VirtualMachine.step(vm)
assert new.running == false
end
end

View file

@ -0,0 +1,23 @@
defmodule Farmbot.Firmware.Gcode.ParamTest do
use ExUnit.Case
test "pareses a param numbered string" do
a = Farmbot.Firmware.Gcode.Param.parse_param("13")
assert(a == :movement_timeout_z)
end
test "Pareses a param in integer form" do
a = Farmbot.Firmware.Gcode.Param.parse_param(13)
assert(a == :movement_timeout_z)
end
test "Parses a param in atom form" do
a = Farmbot.Firmware.Gcode.Param.parse_param(:movement_timeout_z)
assert(a == 13)
end
test "Parses a param in string form" do
a = Farmbot.Firmware.Gcode.Param.parse_param("movement_timeout_z")
assert(a == 13)
end
end

View file

@ -6,26 +6,6 @@ defmodule Farmbot.Firmware.Gcode.ParserTest do
assert(bleep == {"5", {:report_parameter_value, :param_version, 0}})
end
test "pareses a param numbered string" do
a = Farmbot.Firmware.Gcode.Parser.parse_param("13")
assert(a == :movement_timeout_z)
end
test "Pareses a param in integer form" do
a = Farmbot.Firmware.Gcode.Parser.parse_param(13)
assert(a == :movement_timeout_z)
end
test "Parses a param in atom form" do
a = Farmbot.Firmware.Gcode.Parser.parse_param(:movement_timeout_z)
assert(a == 13)
end
test "Parses a param in string form" do
a = Farmbot.Firmware.Gcode.Parser.parse_param("movement_timeout_z")
assert(a == 13)
end
test "Parses R31 and R41" do
a = Farmbot.Firmware.Gcode.Parser.parse_code("R31 P0 V45 Q10")
assert a == {"10", {:report_status_value, 0, 45}}

View file

@ -1,120 +0,0 @@
defmodule Farmbot.HTTPTest do
@moduledoc "Http tests"
use ExUnit.Case
alias Farmbot.HTTP
setup_all do
# Starts a http client but with no token. This module does not make any http requests.
{:ok, http} = Farmbot.HTTP.start_link(nil, [])
%{http: http}
end
test "bang functions raise an error", %{http: http} do
assert_raise HTTP.Error, fn ->
HTTP.request!(http, :get, "https://some_not_real_url.blerp")
end
end
@moduletag [external: true]
@tag :httpbin
test "makes a basic http request", %{http: http} do
r = HTTP.request(http, :get, "https://httpbin.org")
assert match?({:ok, _}, r)
{:ok, resp} = r
assert resp.status_code == 200
assert resp.body =~ "<!DOCTYPE html>"
end
@tag :httpbin
test "ensures we use the farmbot os user-agent", %{http: http} do
{:ok, resp} = HTTP.request(http, :get, "https://httpbin.org/user-agent")
{:ok, json} = Poison.decode(resp.body)
assert json["user-agent"]
assert json["user-agent"] =~ "FarmbotOS"
end
@tag :httpbin
test "makes a post request", %{http: http} do
r = HTTP.post(http, "https://httpbin.org/post", "some data")
assert match?({:ok, _}, r)
{:ok, resp} = r
assert resp.status_code == 200
assert resp.body =~ "\"some data\""
r = HTTP.post!(http, "https://httpbin.org/post", "some more data")
refute match?({:ok, _}, r)
assert r.status_code == 200
assert r.body =~ "\"some more data\""
end
@tag :httpbin
test "makes a patch request", %{http: http} do
r = HTTP.patch(http, "https://httpbin.org/patch", "some patch data")
assert match?({:ok, _}, r)
{:ok, resp} = r
assert resp.status_code == 200
assert resp.body =~ "\"some patch data\""
r = HTTP.patch!(http, "https://httpbin.org/patch", "some more patch data")
refute match?({:ok, _}, r)
assert r.status_code == 200
assert r.body =~ "\"some more patch data\""
end
@tag :httpbin
test "makes a put request", %{http: http} do
r = HTTP.put(http, "https://httpbin.org/put", "some put data")
assert match?({:ok, _}, r)
{:ok, resp} = r
assert resp.status_code == 200
assert resp.body =~ "\"some put data\""
r = HTTP.put!(http, "https://httpbin.org/put", "some more put data")
refute match?({:ok, _}, r)
assert r.status_code == 200
assert r.body =~ "\"some more put data\""
end
@tag :httpbin
test "makes a delete request", %{http: http} do
r = HTTP.delete(http, "https://httpbin.org/delete", "some delete data")
assert match?({:ok, _}, r)
{:ok, resp} = r
assert resp.status_code == 200
assert resp.body =~ "\"some delete data\""
r = HTTP.delete!(http, "https://httpbin.org/delete", "some more delete data")
refute match?({:ok, _}, r)
assert r.status_code == 200
assert r.body =~ "\"some more delete data\""
end
@tag :httpbin
test "makes a get request", %{http: http} do
r = HTTP.get(http, "https://httpbin.org/get")
assert match?({:ok, _}, r)
{:ok, resp} = r
assert resp.status_code == 200
assert resp.body =~ "\"https://httpbin.org/get\""
r = HTTP.get!(http, "https://httpbin.org/get")
refute match?({:ok, _}, r)
assert r.status_code == 200
assert r.body =~ "\"https://httpbin.org/get\""
end
@tag :httpbin
test "raises if the response isnt 2xx", %{http: http} do
assert_raise HTTP.Error, fn ->
HTTP.request!(http, :get, "https://httpbin.org/status/404")
end
end
test "bang functions only return the HTTP.Response", %{http: http} do
r = HTTP.request!(http, :get, "https://google.com")
refute match?({:ok, _}, r)
assert r.status_code == 200
end
end

View file

@ -1,7 +1,7 @@
defmodule Farmbot.Repo.FarmEventTest do
alias Farmbot.Repo
alias Farmbot.Repo.FarmEvent
use ExUnit.Case, async: false
use ExUnit.Case, async: true
setup do
:ok = Ecto.Adapters.SQL.Sandbox.checkout(Repo.A)

View file

@ -4,9 +4,8 @@ unless '--exclude' in :init.get_plain_arguments() do
end
# Start ExUnit.
ExUnit.start()
Ecto.Adapters.SQL.Sandbox.mode(Farmbot.Repo.A, :manual)
Ecto.Adapters.SQL.Sandbox.mode(Farmbot.Repo.B, :manual)
Ecto.Adapters.SQL.Sandbox.mode(Farmbot.System.ConfigStorage, :manual)
require IEx; IEx.pry
ExUnit.start()

4
test_tmp/boot Normal file
View file

@ -0,0 +1,4 @@
version = 6.0.0
commit = 12ce8265
target = host
env = test

Binary file not shown.

Binary file not shown.

View file

Binary file not shown.