Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

514 division transformation #1475

Merged
merged 2 commits into from
Sep 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/transformers/lib/transformations/division.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ defmodule Transformers.Division do
{:ok, dividend} <- resolve_payload_field(payload, dividend),
{:ok, divisor} <- resolve_divisor(payload, divisor),
{:ok, quotient} <- {:ok, D.div(D.new(dividend), D.new(divisor))} do
{:ok, payload |> Map.put(target_field_name, quotient)}
{:ok, payload |> Map.put(target_field_name, D.to_float(quotient))}
else
{:error, reason} -> {:error, reason}
end
Expand Down
17 changes: 10 additions & 7 deletions apps/transformers/lib/transformations/multiplication.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,28 @@ defmodule Transformers.Multiplication do
alias Transformers.FieldFetcher
alias Transformers.Validations.NotBlank
alias Transformers.Validations.ValidationStatus
alias Decimal, as: D

@multiplicands "multiplicands"
@target_field "targetField"

@impl Transformation
def transform(payload, parameters) do
with {:ok, [multiplicands, target_field_name]} <- validate(parameters),
{:ok, resolved_multiplicands} <- resolve_multiplicand_fields(payload, multiplicands) do
{:ok,
payload
|> Map.put(
target_field_name,
Enum.reduce(resolved_multiplicands, 1, fn multiplicand, acc -> multiplicand * acc end)
)}
{:ok, resolved_multiplicands} <- resolve_multiplicand_fields(payload, multiplicands),
product <- multiply_multiplicands(resolved_multiplicands) do
{:ok, payload |> Map.put(target_field_name, D.to_float(product))}
else
{:error, reason} -> {:error, reason}
end
end

defp multiply_multiplicands(resolved_multiplicands) do
Enum.reduce(resolved_multiplicands, 1, fn multiplicand, acc ->
D.mult(D.new(multiplicand), D.new(acc))
end)
end

defp resolve_multiplicand_fields(payload, multiplicands) do
numbers =
Enum.reduce_while(multiplicands, [], fn multiplicand, acc ->
Expand Down
2 changes: 1 addition & 1 deletion apps/transformers/mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Transformers.MixProject do
def project do
[
app: :transformers,
version: "1.0.6",
version: "1.0.7",
build_path: "../../_build",
config_path: "../../config/config.exs",
deps_path: "../../deps",
Expand Down
15 changes: 7 additions & 8 deletions apps/transformers/test/unit/transformations/division_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ defmodule Transformers.DivisionTest do
use Checkov

alias Transformers.Division
alias Decimal, as: D

describe "The division transform" do
test "returns payload with target field equal to the quotient of a dividend and divisor" do
Expand All @@ -18,7 +17,7 @@ defmodule Transformers.DivisionTest do
{:ok, transformed_payload} = Division.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "output_number")
assert actual_target_field == D.new(5)
assert actual_target_field == 5
end

test "returns payload with target field equal to the quotient of a single input dividend variable and divisor constant" do
Expand All @@ -33,7 +32,7 @@ defmodule Transformers.DivisionTest do
{:ok, transformed_payload} = Division.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "output_number")
assert actual_target_field == D.new(4)
assert actual_target_field == 4
end

test "returns payload with target field with a specified target field name" do
Expand All @@ -48,7 +47,7 @@ defmodule Transformers.DivisionTest do
{:ok, transformed_payload} = Division.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "some_other_output_number")
assert actual_target_field == D.new(4)
assert actual_target_field == 4
end

test "returns payload with target field equal to the quotient of single input dividend constant and single divisor variables" do
Expand All @@ -63,7 +62,7 @@ defmodule Transformers.DivisionTest do
{:ok, transformed_payload} = Division.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "output_number")
assert actual_target_field == D.new(4)
assert actual_target_field == 4
end

test "returns payload with a decimal in the target field equal to the quotient of dividend decimal constant and divisor decimal constant" do
Expand All @@ -78,7 +77,7 @@ defmodule Transformers.DivisionTest do
{:ok, transformed_payload} = Division.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "output_number")
assert actual_target_field == D.new(4.1)
assert actual_target_field == 4.1
end

test "returns input fields along with output fields" do
Expand All @@ -93,7 +92,7 @@ defmodule Transformers.DivisionTest do
{:ok, transformed_payload} = Division.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "output_number")
assert actual_target_field == D.new(14)
assert actual_target_field == 14
{:ok, source_field1} = Map.fetch(transformed_payload, "input_number")
assert source_field1 == 3
end
Expand All @@ -110,7 +109,7 @@ defmodule Transformers.DivisionTest do
{:ok, transformed_payload} = Division.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "output_number")
assert actual_target_field == D.new(3)
assert actual_target_field == 3
{:ok, foo_field} = Map.fetch(transformed_payload, "foo")
assert foo_field == 8
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,20 @@ defmodule Transformers.MultiplicationTest do
assert source_field2 == 6
end

test "returns payload with target field a product of decimal values" do
params = %{
"multiplicands" => [12.5433, 2.33],
"targetField" => "output_number"
}

message_payload = %{}

{:ok, transformed_payload} = Transformers.Multiplication.transform(message_payload, params)

{:ok, actual_target_field} = Map.fetch(transformed_payload, "output_number")
assert actual_target_field == 29.225889
end

test "returns an error if a field in the multiplicand doesnt exist" do
params = %{
"multiplicands" => ["some_other_input_number", "bar"],
Expand Down