Testing Virtual Fields returning nil in Phoenix












0















I have a basic user schema that contains password_digest to be saved in db and virtual fields password that user will input, hashed, saved as password_digest.



The problem is when testing, I am getting password as nil on one side of comparison while the other I have them as non-nil. I am not sure what the best practice is when testing virtual fields.



Error msg:



...
Assertion with == failed
code: assert Accounts.get_user!(user.id()) == user
left: ... username: "some username", password: nil}
right: ... username: "some username", password: "some password"}

schema "users" do
field :email, :string
field :password_digest, :string
field :username, :string

timestamps()

field :password, :string, virtual: true
end


Here is the relevant codes:



def changeset(user, attrs) do
user
|> cast(attrs, [:username, :email, :password])
|> hash_password
|> validate_required([:username, :email, :password, :password_digest])
end

defp hash_password(changeset) do
if password = get_change(changeset, :password) do
changeset
|> put_change(:password_digest, hashpwsalt(password))
else
changeset
end
end


Inside the test, I have these:



@valid_attrs %{email: "some email", password: "some password", username: "some username"}


def user_fixture(attrs \ %{}) do
{:ok, user} =
attrs
|> Enum.into(@valid_attrs)
|> Accounts.create_user()

user
end

...

test "get_user!/1 returns the user with given id" do
user = user_fixture()
assert Accounts.get_user!(user.id) == user
end


Btw, get_user is straight from generator: def get_user!(id), do: Repo.get!(User, id)



What is the proper way to test virtual field?










share|improve this question



























    0















    I have a basic user schema that contains password_digest to be saved in db and virtual fields password that user will input, hashed, saved as password_digest.



    The problem is when testing, I am getting password as nil on one side of comparison while the other I have them as non-nil. I am not sure what the best practice is when testing virtual fields.



    Error msg:



    ...
    Assertion with == failed
    code: assert Accounts.get_user!(user.id()) == user
    left: ... username: "some username", password: nil}
    right: ... username: "some username", password: "some password"}

    schema "users" do
    field :email, :string
    field :password_digest, :string
    field :username, :string

    timestamps()

    field :password, :string, virtual: true
    end


    Here is the relevant codes:



    def changeset(user, attrs) do
    user
    |> cast(attrs, [:username, :email, :password])
    |> hash_password
    |> validate_required([:username, :email, :password, :password_digest])
    end

    defp hash_password(changeset) do
    if password = get_change(changeset, :password) do
    changeset
    |> put_change(:password_digest, hashpwsalt(password))
    else
    changeset
    end
    end


    Inside the test, I have these:



    @valid_attrs %{email: "some email", password: "some password", username: "some username"}


    def user_fixture(attrs \ %{}) do
    {:ok, user} =
    attrs
    |> Enum.into(@valid_attrs)
    |> Accounts.create_user()

    user
    end

    ...

    test "get_user!/1 returns the user with given id" do
    user = user_fixture()
    assert Accounts.get_user!(user.id) == user
    end


    Btw, get_user is straight from generator: def get_user!(id), do: Repo.get!(User, id)



    What is the proper way to test virtual field?










    share|improve this question

























      0












      0








      0








      I have a basic user schema that contains password_digest to be saved in db and virtual fields password that user will input, hashed, saved as password_digest.



      The problem is when testing, I am getting password as nil on one side of comparison while the other I have them as non-nil. I am not sure what the best practice is when testing virtual fields.



      Error msg:



      ...
      Assertion with == failed
      code: assert Accounts.get_user!(user.id()) == user
      left: ... username: "some username", password: nil}
      right: ... username: "some username", password: "some password"}

      schema "users" do
      field :email, :string
      field :password_digest, :string
      field :username, :string

      timestamps()

      field :password, :string, virtual: true
      end


      Here is the relevant codes:



      def changeset(user, attrs) do
      user
      |> cast(attrs, [:username, :email, :password])
      |> hash_password
      |> validate_required([:username, :email, :password, :password_digest])
      end

      defp hash_password(changeset) do
      if password = get_change(changeset, :password) do
      changeset
      |> put_change(:password_digest, hashpwsalt(password))
      else
      changeset
      end
      end


      Inside the test, I have these:



      @valid_attrs %{email: "some email", password: "some password", username: "some username"}


      def user_fixture(attrs \ %{}) do
      {:ok, user} =
      attrs
      |> Enum.into(@valid_attrs)
      |> Accounts.create_user()

      user
      end

      ...

      test "get_user!/1 returns the user with given id" do
      user = user_fixture()
      assert Accounts.get_user!(user.id) == user
      end


      Btw, get_user is straight from generator: def get_user!(id), do: Repo.get!(User, id)



      What is the proper way to test virtual field?










      share|improve this question














      I have a basic user schema that contains password_digest to be saved in db and virtual fields password that user will input, hashed, saved as password_digest.



      The problem is when testing, I am getting password as nil on one side of comparison while the other I have them as non-nil. I am not sure what the best practice is when testing virtual fields.



      Error msg:



      ...
      Assertion with == failed
      code: assert Accounts.get_user!(user.id()) == user
      left: ... username: "some username", password: nil}
      right: ... username: "some username", password: "some password"}

      schema "users" do
      field :email, :string
      field :password_digest, :string
      field :username, :string

      timestamps()

      field :password, :string, virtual: true
      end


      Here is the relevant codes:



      def changeset(user, attrs) do
      user
      |> cast(attrs, [:username, :email, :password])
      |> hash_password
      |> validate_required([:username, :email, :password, :password_digest])
      end

      defp hash_password(changeset) do
      if password = get_change(changeset, :password) do
      changeset
      |> put_change(:password_digest, hashpwsalt(password))
      else
      changeset
      end
      end


      Inside the test, I have these:



      @valid_attrs %{email: "some email", password: "some password", username: "some username"}


      def user_fixture(attrs \ %{}) do
      {:ok, user} =
      attrs
      |> Enum.into(@valid_attrs)
      |> Accounts.create_user()

      user
      end

      ...

      test "get_user!/1 returns the user with given id" do
      user = user_fixture()
      assert Accounts.get_user!(user.id) == user
      end


      Btw, get_user is straight from generator: def get_user!(id), do: Repo.get!(User, id)



      What is the proper way to test virtual field?







      testing phoenix-framework






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 22 '18 at 16:51









      IggyIggy

      1,45821944




      1,45821944
























          1 Answer
          1






          active

          oldest

          votes


















          0














          That is an expected behavior because Accounts.get_user!(user.id) will not fill the virtual attribute. It is only changed on changeset and you are not doing any change.



          In this case, I think that what is relevant for you is test if password_digest was set.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435378%2ftesting-virtual-fields-returning-nil-in-phoenix%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            That is an expected behavior because Accounts.get_user!(user.id) will not fill the virtual attribute. It is only changed on changeset and you are not doing any change.



            In this case, I think that what is relevant for you is test if password_digest was set.






            share|improve this answer




























              0














              That is an expected behavior because Accounts.get_user!(user.id) will not fill the virtual attribute. It is only changed on changeset and you are not doing any change.



              In this case, I think that what is relevant for you is test if password_digest was set.






              share|improve this answer


























                0












                0








                0







                That is an expected behavior because Accounts.get_user!(user.id) will not fill the virtual attribute. It is only changed on changeset and you are not doing any change.



                In this case, I think that what is relevant for you is test if password_digest was set.






                share|improve this answer













                That is an expected behavior because Accounts.get_user!(user.id) will not fill the virtual attribute. It is only changed on changeset and you are not doing any change.



                In this case, I think that what is relevant for you is test if password_digest was set.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 23 '18 at 11:55









                Marcos TapajósMarcos Tapajós

                1915




                1915
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435378%2ftesting-virtual-fields-returning-nil-in-phoenix%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                    Alcedinidae

                    Origin of the phrase “under your belt”?