public async Task Test(string url, AfCodeType type)
    {
        using var mocker = AutoMock.GetLoose();
        var service = mocker.Create <AfCodeService>();
        var bk      = new Bk
        {
            Url   = url,
            Title = "newbe.pro",
            Tags  = new List <string>
            {
                "newbe", "blog"
            }
        };

        mocker.Mock <IIndexedDbRepo <Bk, string> >()
        .Setup(x => x.GetAsync(url))
        .ReturnsAsync(bk);

        // act
        var code = await service.CreateAfCodeAsync(url, type);

        Console.WriteLine(code);

        var tryParseAsync = await service.TryParseAsync(code, out var result);

        tryParseAsync.Should().BeTrue();
        result !.Should().NotBeNull();
        result.Url.Should().Be(bk.Url);
        result.Title.Should().Be(bk.Title);
        result.Tags.Should().BeEquivalentTo(bk.Tags);
    }
예제 #2
0
    public async Task <string> CreateAfCodeAsync(string url, AfCodeType codeType)
    {
        var bk = await _bkRepository.GetAsync(url);

        if (bk == null)
        {
            return(string.Empty);
        }

        var code = new AfCode
        {
            Title = bk.Title,
            Url   = bk.Url,
            Tags  = bk.Tags?.ToArray() ?? Array.Empty <string>(),
        };

        switch (codeType)
        {
        case AfCodeType.JsonBase64:
        {
            var json         = JsonSerializer.Serialize(code);
            var base64String = Convert.ToBase64String(Encoding.UTF8.GetBytes(json));
            return(CreateCode(base64String));
        }

        case AfCodeType.CompressionJsonBase64:
        {
            var json           = JsonSerializer.Serialize(code);
            var input          = Encoding.UTF8.GetBytes(json).AsMemory();
            var readOnlyMemory = Compress(input);
            var base64String   = Convert.ToBase64String(readOnlyMemory.Span);
            return(CreateCode(base64String));
        }

        case AfCodeType.Cloud:
            throw new NotImplementedException();

        case AfCodeType.PlainText:
        {
            var json = JsonSerializer.Serialize(code);
            return(CreateCode(json));
        }

        default:
            throw new ArgumentOutOfRangeException(nameof(codeType), codeType, null);
        }

        string CreateCode(string payload)
        {
            return($"{Consts.AfCodeSchemaPrefix}{codeType:D}{payload}");
        }
    }