Hello,
I’ve been given the task to upgrade our product from OTP R22 / Elixir 1.11 to OTP R25 / Elixir 1.13.4 (hoping for 1.14). There is a test-case that works fine on 1.11 that is failing in 1.13.
This is the code, as is the test literally blocks and does nothing.
rando_info = users.rando
users = %{users | rando: %{rando_info | sign_pair: sign_pair, public_key: public_key, key_version: 1}}
# Make export request
request_payload =
%{user_id: users.admin.user_id,
type: "export",
device_id: users.admin.device.id,
data: %{until: NaiveDateTime.to_iso8601(NaiveDateTime.add(NaiveDateTime.utc_now, 900)),
users: [%{user_id: users.admin.user_id, key_version: users.admin.key_version},
%{user_id: users.approver1.user_id, key_version: users.approver1.key_version},
%{user_id: users.approver2.user_id, key_version: users.approver2.key_version},
%{user_id: users.rando.user_id, key_version: 1}]},
timestamp: NaiveDateTime.to_iso8601(NaiveDateTime.utc_now),
expiration: NaiveDateTime.to_iso8601(NaiveDateTime.add(NaiveDateTime.utc_now, 900)),
protocol_version: 1} |> Poison.encode!()
If I remove one line from the list of users:
%{user_id: users.admin.user_id,
type: "export",
device_id: users.admin.device.id,
data: %{until: NaiveDateTime.to_iso8601(NaiveDateTime.add(NaiveDateTime.utc_now, 900)),
users: [%{user_id: users.admin.user_id, key_version: users.admin.key_version},
%{user_id: users.approver1.user_id, key_version: users.approver1.key_version},
%{user_id: users.approver2.user_id, key_version: users.approver2.key_version}]},
timestamp: NaiveDateTime.to_iso8601(NaiveDateTime.utc_now),
expiration: NaiveDateTime.to_iso8601(NaiveDateTime.add(NaiveDateTime.utc_now, 900)),
protocol_version: 1} |> Poison.encode!()
I get a bunch of errors like:
warning: incompatible types:
%{rando: var1} !~ %{rando: var2}
in expression:
# test/api/export_test.exs:364
users.rando
where "users" was given the type %{rando: %{user_id: var13, user_id: var13, user_id: var13, user_id: var13, sign_pair: var14, public_key: var15, key_version: integer(), optional(dynamic()) => dynamic()}, rando: var16, rando: var17, admin: %{user_id: var5, key_version: var6, user_id: var5, device: %{id: var7, id: var7, optional(dynamic()) => dynamic()}, user_id: var5, sign_pair: %{public: var8, secret: var9, optional(dynamic()) => dynamic()}, key_version: var6, key_version: var6, device: %{id: var7, id: var7, optional(dynamic()) => dynamic()}, user_id: var5, sign_pair: %{public: var8, secret: var9, optional(dynamic()) => dynamic()}, optional(dynamic()) => dynamic()}, admin: %{user_id: var5, key_version: var6, user_id: var5, device: %
I can get the test to work by updating the users
map via access methods:
rando_info = users.rando
rando_info = Map.replace(rando_info, :sign_pair, sign_pair)
|> Map.replace(:public_key, public_key)
|> Map.replace(:key_version, 1)
users = %{users | rando: rando_info}
users
is a map like:
%{
admin: %{
account_version: 0,
claim_return: %{...},
...
},
approver1: %{
account_version: 0,
claim_return: %{...},
...
},
approver2: %{
account_version: 0,
claim_return: %{...},
...
},
rando: %{
account_version: 0,
claim_return: %{...},
...
}
}
I just found it odd that’s all
Thanks