< Summary

Information
Class: Syki.Shared.StringExtensions
Assembly: Shared
File(s): /home/runner/work/syki/syki/Shared/Extensions/StringExtensions.cs
Tag: 22_11348620282
Line coverage
78%
Covered lines: 32
Uncovered lines: 9
Coverable lines: 41
Total lines: 118
Line coverage: 78%
Branch coverage
96%
Covered branches: 25
Total branches: 26
Branch coverage: 96.1%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
IsEmpty(...)100%22100%
IsIn(...)100%66100%
HasValue(...)100%11100%
OnlyNumbers(...)100%44100%
ToSnakeCase(...)75%44100%
ToMfaToken(...)100%11100%
ToBase64(...)100%11100%
Format(...)100%11100%
Format(...)100%210%
IsValidEmail(...)100%22100%
.cctor()100%11100%
Serialize(...)100%11100%
GenerateQrCodeBytes(...)100%210%
MinutesToString(...)100%88100%

File(s)

/home/runner/work/syki/syki/Shared/Extensions/StringExtensions.cs

#LineLine coverage
 1using OtpNet;
 2using QRCoder;
 3using Newtonsoft.Json;
 4using System.Globalization;
 5using Newtonsoft.Json.Converters;
 6using System.Text.RegularExpressions;
 7
 8namespace Syki.Shared;
 9
 10public static class StringExtensions
 11{
 12    public static bool IsEmpty(this string? text)
 13    {
 150014        return string.IsNullOrEmpty(text) || string.IsNullOrWhiteSpace(text);
 15    }
 16
 17    public static bool IsIn(this string? text, params string[] others)
 18    {
 3519        if (text.IsEmpty())
 320            return true;
 21
 15022        foreach (var other in others)
 23        {
 5124            if (other.Contains(text!, StringComparison.OrdinalIgnoreCase))
 1625                return true;
 26        }
 27
 1628        return false;
 29    }
 30
 31    public static bool HasValue(this string? text)
 32    {
 151933        return !string.IsNullOrEmpty(text);
 34    }
 35
 36    public static string OnlyNumbers(this string text)
 37    {
 151938        if (text.HasValue())
 39        {
 151040            return new string(text.Where(char.IsDigit).ToArray());
 41        }
 42
 943        return "";
 44    }
 45
 46    public static string ToSnakeCase(this string input)
 47    {
 16148        if (input.IsEmpty()) { return ""; }
 49
 15550        var startUnderscores = Regex.Match(input, @"^_+");
 15551        return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToLower();
 52    }
 53
 54    public static string ToMfaToken(this string key)
 55    {
 556        var totp = new Totp(Base32Encoding.ToBytes(key));
 557        return totp.ComputeTotp();
 58    }
 59
 60    public static string ToBase64(this string value)
 61    {
 262        var bytes = System.Text.Encoding.UTF8.GetBytes(value);
 263        return Convert.ToBase64String(bytes);
 64    }
 65
 66    public static string Format(this decimal value)
 67    {
 568        return value.ToString("0.00", CultureInfo.InvariantCulture);
 69    }
 70
 71    public static string Format(this int value)
 72    {
 073        return value.ToString("N0", CultureInfo.CreateSpecificCulture("pt-BR"));
 74    }
 75
 76    public static bool IsValidEmail(this string email)
 77    {
 92878        if (email.IsEmpty()) return false;
 91279        return Regex.IsMatch(email, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?
 80    }
 81
 182  private static JsonSerializerSettings _settings = new()
 183  {
 184    Converters = [new StringEnumConverter()],
 185  };
 86
 87  public static string Serialize(this object obj)
 88  {
 858989    return JsonConvert.SerializeObject(obj, _settings);
 90  }
 91
 92    public static Byte[] GenerateQrCodeBytes(this string key, string email)
 93    {
 94        const string provider = "Syki";
 95
 096        using var qrGenerator = new QRCodeGenerator();
 097        using var qrCodeData = qrGenerator.CreateQrCode(
 098            $"otpauth://totp/{provider}:{email}?secret={key}&issuer={provider}",
 099            QRCodeGenerator.ECCLevel.Q
 0100        );
 101
 0102        var qrCode = new PngByteQRCode(qrCodeData);
 103
 0104        return qrCode.GetGraphic(20);
 0105    }
 106
 107    public static string MinutesToString(this int value)
 108    {
 17109        var hours = value / 60;
 17110        var minutes = value % 60;
 111
 18112        if (hours == 0 && minutes == 0) return "0";
 19113        if (hours == 0) return $"{minutes}min";
 22114        if (minutes == 0) return $"{hours}h";
 115
 4116        return $"{hours}h e {minutes}min";
 117    }
 118}