andrebaltieri / Flunt

Validations and Notifications
https://github.com/andrebaltieri/flunt
MIT License
624 stars 162 forks source link

O valor deve ser menor ou igual o seu comparador, só deve adicionar n… #91

Closed DanielCFreitas closed 3 years ago

DanielCFreitas commented 3 years ago

O valor que está sendo testado deve ser menor ou igual ao que está sendo comparado, da forma como estava, o valor que está sendo testado se fosse menor que o comparador estava adicionando notificação

andrebaltieri commented 3 years ago

@DanielCFreitas pode fornecer os testes que comprovem isto? Só ocorre nos decimais?

DanielCFreitas commented 3 years ago

Sim o problema só ocorre com os decimais, para os outros tipos está funcionando normalmente.

O val que é o que está sendo testado ele precisa ser menor ou igual ao comparer, porém a notificação está sendo adicionada quando ele justamente é menor que o comparer, aqui é como está a lógica atualmente:

if (val < comparer) AddNotification(key, message);

andrebaltieri commented 3 years ago

Boas @DanielCFreitas como vai?

Este é o teste que temos hoje para verificar se o IsLowerOrEqualsThan funciona: https://github.com/andrebaltieri/Flunt/blob/main/Flunt.Tests/DecimalValidationTests.cs#L149

O que é experado neste teste é que ele adicione uma notificação se (E somente se) o valor for MAIOR que 10 (Neste caso de teste).

O métodos IsLowerOrEqualsThan requer que um decimal seja menor ou igual a um valor, não ao contrário! Faz sentido?

Logo, para o cenário abaixo, temos 5 seções, cada uma com 6 asserções, sendo que duas são maiores e diferentes de 10, que devem falhar.

var contract = new Contract<SampleEntity>()
                .Requires()
                .IsLowerOrEqualsThan((decimal)0, (int)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)0, (int)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)10, (int)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)10, (int)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)20, (int)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)20, (int)10, "Decimal", "Custom message here")

                .IsLowerOrEqualsThan((decimal)0, (float)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)0, (float)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)10, (float)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)10, (float)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)20, (float)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)20, (float)10, "Decimal", "Custom message here")

                .IsLowerOrEqualsThan((decimal)0, (double)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)0, (double)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)10, (double)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)10, (double)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)20, (double)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)20, (double)10, "Decimal", "Custom message here")

                .IsLowerOrEqualsThan((decimal)0, (long)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)0, (long)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)10, (long)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)10, (long)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)20, (long)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)20, (long)10, "Decimal", "Custom message here")

                .IsLowerOrEqualsThan((decimal)0, (decimal)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)0, (decimal)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)10, (decimal)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)10, (decimal)10, "Decimal", "Custom message here")
                .IsLowerOrEqualsThan((decimal)20, (decimal)10, "Decimal")
                .IsLowerOrEqualsThan((decimal)20, (decimal)10, "Decimal", "Custom message here");

Como resultado, podemos esperar 10 notificações (2 para cada sessão):

Assert.AreEqual(contract.Notifications.Count, 10);

Rodei os testes aqui e todos passaram! ![Uploading image.png…]()

Faz sentido?

DanielCFreitas commented 3 years ago

Opa, tudo bem?

O que é experado neste teste é que ele adicione uma notificação se (E somente se) o valor for MAIOR que 10 (Neste caso de teste).

Então, mas na lógica do código a notificação está sendo adicionada quando o valor é Menor, segue o código: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/DecimalValidationContract.cs#L364

public Contract<T> IsLowerOrEqualsThan(decimal val, decimal comparer, string key, string message)
        {
            if (val < comparer)
                AddNotification(key, message);

            return this;
        }

Logo, para o cenário abaixo, temos 5 seções, cada uma com 6 asserções, sendo que duas são maiores e diferentes de 10, que devem falhar.

No teste, se comparar com ">" ou "<" no código acima, o teste acaba passando para os dois casos, troquei a condicional e executei os testes:

Codigo

andrebaltieri commented 3 years ago

Perfeito @DanielCFreitas! Queria só garantir que os testes estavam passando... Realmente passou este sinal, vou gerar uma versáo nova do pacote!