From 2e2bace805b6a83af75360dd2403e33ad70639e4 Mon Sep 17 00:00:00 2001 From: tenmoves Date: Wed, 4 Jan 2023 22:01:23 +0100 Subject: [PATCH] Add previous transaction address in GraphQl transaction schema --- .../transaction_chain/transaction.ex | 1 + .../graphql_schema/transaction_type.ex | 1 + test/archethic_web/graphql_schema_test.exs | 42 ++++++++++++++++--- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/archethic/transaction_chain/transaction.ex b/lib/archethic/transaction_chain/transaction.ex index 4afae41d3..d5def708b 100755 --- a/lib/archethic/transaction_chain/transaction.ex +++ b/lib/archethic/transaction_chain/transaction.ex @@ -863,6 +863,7 @@ defmodule Archethic.TransactionChain.Transaction do type: Atom.to_string(tx.type), data: TransactionData.to_map(tx.data), previous_public_key: tx.previous_public_key, + previous_address: previous_address(tx), previous_signature: tx.previous_signature, origin_signature: tx.origin_signature, validation_stamp: ValidationStamp.to_map(tx.validation_stamp), diff --git a/lib/archethic_web/graphql_schema/transaction_type.ex b/lib/archethic_web/graphql_schema/transaction_type.ex index 2566f6a1d..b5c590c72 100644 --- a/lib/archethic_web/graphql_schema/transaction_type.ex +++ b/lib/archethic_web/graphql_schema/transaction_type.ex @@ -20,6 +20,7 @@ defmodule ArchethicWeb.GraphQLSchema.TransactionType do field(:data, :data) field(:previous_public_key, :public_key) field(:previous_signature, :hex) + field(:previous_address, :address) field(:origin_signature, :hex) field(:validation_stamp, :validation_stamp) field(:cross_validation_stamps, list_of(:cross_validation_stamp)) diff --git a/test/archethic_web/graphql_schema_test.exs b/test/archethic_web/graphql_schema_test.exs index 4dd3cf7c4..763bcd357 100644 --- a/test/archethic_web/graphql_schema_test.exs +++ b/test/archethic_web/graphql_schema_test.exs @@ -85,21 +85,38 @@ defmodule ArchethicWeb.GraphQLSchemaTest do assert %{"errors" => [%{"message" => "transaction_not_exists"}]} = json_response(conn, 200) end - test "should the transaction with the requested fields", %{conn: conn} do + test "should return the transaction with the requested fields", %{conn: conn} do addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> |> Base.encode16() + prev_public_key = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> MockClient |> stub(:send_message, fn _, %GetTransaction{}, _ -> - {:ok, %Transaction{address: addr, type: :transfer, data: %TransactionData{}}} + {:ok, + %Transaction{ + address: addr, + previous_public_key: prev_public_key, + type: :transfer, + data: %TransactionData{} + }} end) conn = post(conn, "/api", %{ - "query" => "query { transaction(address: \"#{addr}\") { address } }" + "query" => "query { transaction(address: \"#{addr}\") { address, previousAddress } }" }) - assert %{"data" => %{"transaction" => %{"address" => address}}} = json_response(conn, 200) + assert %{ + "data" => %{ + "transaction" => %{ + "address" => address, + "previousAddress" => previous_address + } + } + } = json_response(conn, 200) + assert addr == Base.decode16!(address, case: :mixed) + + refute is_nil(previous_address) end end @@ -114,7 +131,12 @@ defmodule ArchethicWeb.GraphQLSchemaTest do {:ok, %LastTransactionAddress{address: last_address}} _, %GetTransaction{address: ^last_address}, _ -> - {:ok, %Transaction{address: last_address, type: :transfer}} + {:ok, + %Transaction{ + previous_public_key: first_addr, + address: last_address, + type: :transfer + }} end) conn = @@ -225,16 +247,20 @@ defmodule ArchethicWeb.GraphQLSchemaTest do |> stub(:list_transactions, fn _ -> addr1 = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> addr2 = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + prev_addr1 = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + prev_addr2 = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> [ %Transaction{ address: addr1, type: :transfer, + previous_public_key: prev_addr1, data: %TransactionData{} }, %Transaction{ address: addr2, type: :transfer, + previous_public_key: prev_addr2, data: %TransactionData{} } ] @@ -254,9 +280,11 @@ defmodule ArchethicWeb.GraphQLSchemaTest do |> stub(:list_transactions, fn _ -> Enum.map(1..20, fn _ -> addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + prev_addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> %Transaction{ address: addr, + previous_public_key: prev_addr, type: :transfer, data: %TransactionData{} } @@ -328,10 +356,12 @@ defmodule ArchethicWeb.GraphQLSchemaTest do transactions = Enum.map(1..20, fn _ -> addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + prev_addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> %Transaction{ address: addr, type: :transfer, + previous_public_key: prev_addr, data: %TransactionData{} } end) @@ -369,10 +399,12 @@ defmodule ArchethicWeb.GraphQLSchemaTest do transactions = Enum.map(1..20, fn _ -> addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + prev_addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> %Transaction{ address: addr, type: :transfer, + previous_public_key: prev_addr, data: %TransactionData{} } end)