public async Task ThrowsArgumentNullExceptionIfKeyIsNull()
            {
                var blobCache = new InMemoryBlobCache();
                var artworkCache = new ArtworkCache(blobCache);

                await Helpers.ThrowsAsync<ArgumentNullException>(() => artworkCache.Retrieve(null, 100, 100));
            }
            public async Task FailedRequestThrowsException()
            {
                var fetcher = Substitute.For<IArtworkFetcher>();
                fetcher.RetrieveAsync(Arg.Any<string>(), Arg.Any<string>()).Returns(Observable.Throw<Uri>(new ArtworkFetchException(String.Empty, null)).ToTask());
                var blobCache = new InMemoryBlobCache();
                var fixture = new ArtworkCache(blobCache, fetcher);

                await Helpers.ThrowsAsync<ArtworkCacheException>(() => fixture.FetchOnline("A", "B"));
            }
            public async Task NotFoundRequestReturnsNull()
            {
                var fetcher = Substitute.For<IArtworkFetcher>();
                fetcher.RetrieveAsync(Arg.Any<string>(), Arg.Any<string>()).Returns(Task.FromResult<Uri>(null));
                var blobCache = new InMemoryBlobCache();
                var fixture = new ArtworkCache(blobCache, fetcher);

                string returned = await fixture.FetchOnline("A", "B");

                Assert.Null(returned);
            }
            public async Task NotFoundRequestIsMarked()
            {
                var fetcher = Substitute.For<IArtworkFetcher>();
                fetcher.RetrieveAsync(Arg.Any<string>(), Arg.Any<string>()).Returns(Task.FromResult<Uri>(null));
                var blobCache = new InMemoryBlobCache();
                var fixture = new ArtworkCache(blobCache, fetcher);
                string artist = "A";
                string album = "B";
                string lookupKey = BlobCacheKeys.GetKeyForOnlineArtwork(artist, album);

                await fixture.FetchOnline(artist, album);

                Assert.Equal("FAILED", await blobCache.GetObject<string>(lookupKey));
            }
            public async Task PullsSearchesFromCache()
            {
                string artist = "A";
                string album = "B";
                string key = BlobCacheKeys.GetKeyForOnlineArtwork(artist, album);
                var fetcher = Substitute.For<IArtworkFetcher>();
                var blobCache = new InMemoryBlobCache();
                await blobCache.InsertObject(key, "TestArtworkKey");
                var fixture = new ArtworkCache(blobCache, fetcher);

                string returned = await fixture.FetchOnline(artist, album);

                Assert.Equal("TestArtworkKey", returned);
                fetcher.DidNotReceiveWithAnyArgs().RetrieveAsync(null, null);
            }
Exemple #6
0
            public async Task PullsSearchesFromCache()
            {
                string artist    = "A";
                string album     = "B";
                string key       = BlobCacheKeys.GetKeyForOnlineArtwork(artist, album);
                var    fetcher   = Substitute.For <IArtworkFetcher>();
                var    blobCache = new InMemoryBlobCache();
                await blobCache.InsertObject(key, "TestArtworkKey");

                var fixture = new ArtworkCache(blobCache, fetcher);

                string returned = await fixture.FetchOnline(artist, album);

                Assert.Equal("TestArtworkKey", returned);
                fetcher.DidNotReceiveWithAnyArgs().RetrieveAsync(null, null);
            }
Exemple #7
0
            public void CanStoreMulipleArtworksIfArtworksExistsInCache()
            {
                var    blobCache = new InMemoryBlobCache();
                var    data      = new byte[] { 0, 1 };
                string key       = BlobCacheKeys.GetKeyForArtwork(data);

                blobCache.Insert(key, data);
                var fixture = new ArtworkCache(blobCache);

                Task firstTask  = fixture.Store(key, data);
                Task secondTask = fixture.Store(key, data);
                Task thrirdTask = fixture.Store(key, data);

                Assert.True(firstTask.IsCompleted);
                Assert.True(secondTask.IsCompleted);
                Assert.True(thrirdTask.IsCompleted);
            }
Exemple #8
0
            public void SameKeysWaitOnFirstToFinish()
            {
                var signal    = new AsyncSubject <Unit>();
                var blobCache = Substitute.For <IBlobCache>();

                blobCache.Insert(Arg.Any <string>(), Arg.Any <byte[]>(), Arg.Any <DateTimeOffset?>()).Returns(signal);
                var    fixture = new ArtworkCache(blobCache);
                var    data    = new byte[] { 0, 1 };
                string key     = BlobCacheKeys.GetKeyForArtwork(data);

                Task firstTask = fixture.Store(key, data);

                Task secondTask = fixture.Store(key, data);

                Assert.False(firstTask.IsCompleted);
                Assert.False(secondTask.IsCompleted);

                signal.OnNext(Unit.Default);
                signal.OnCompleted();

                Assert.True(firstTask.IsCompleted);
                Assert.True(secondTask.IsCompleted);
            }
            public void CanStoreMulipleArtworksIfArtworksExistsInCache()
            {
                var blobCache = new InMemoryBlobCache();
                var data = new byte[] { 0, 1 };
                string key = BlobCacheKeys.GetKeyForArtwork(data);
                blobCache.Insert(key, data);
                var fixture = new ArtworkCache(blobCache);

                Task firstTask = fixture.Store(key, data);
                Task secondTask = fixture.Store(key, data);
                Task thrirdTask = fixture.Store(key, data);

                Assert.True(firstTask.IsCompleted);
                Assert.True(secondTask.IsCompleted);
                Assert.True(thrirdTask.IsCompleted);
            }
            public async Task ThrowsArgumentOutOfRangeExceptionIfSizeIsLessThanZero()
            {
                var blobCache = new InMemoryBlobCache();
                var artworkCache = new ArtworkCache(blobCache);

                await Helpers.ThrowsAsync<ArgumentOutOfRangeException>(() => artworkCache.Retrieve("somekey", -1, 0));
                await Helpers.ThrowsAsync<ArgumentOutOfRangeException>(() => artworkCache.Retrieve("somekey", 0, -1));
            }
            public async Task StoresArtworkInBlobCache()
            {
                var blobCache = new InMemoryBlobCache();
                var artworkCache = new ArtworkCache(blobCache);

                var data = new byte[] { 0, 1 };
                string key = BlobCacheKeys.GetKeyForArtwork(data);

                await artworkCache.Store(key, data);

                Assert.Equal(data, await blobCache.Get(key));
            }
            public void SameKeysWaitOnFirstToFinish()
            {
                var signal = new AsyncSubject<Unit>();
                var blobCache = Substitute.For<IBlobCache>();
                blobCache.Insert(Arg.Any<string>(), Arg.Any<byte[]>(), Arg.Any<DateTimeOffset?>()).Returns(signal);
                var fixture = new ArtworkCache(blobCache);
                var data = new byte[] { 0, 1 };
                string key = BlobCacheKeys.GetKeyForArtwork(data);

                Task firstTask = fixture.Store(key, data);

                Task secondTask = fixture.Store(key, data);

                Assert.False(firstTask.IsCompleted);
                Assert.False(secondTask.IsCompleted);

                signal.OnNext(Unit.Default);
                signal.OnCompleted();

                Assert.True(firstTask.IsCompleted);
                Assert.True(secondTask.IsCompleted);
            }
            public async Task NullDataThrowsArgumentNullException()
            {
                var blobCache = new InMemoryBlobCache();
                var artworkCache = new ArtworkCache(blobCache);

                await Helpers.ThrowsAsync<ArgumentNullException>(() => artworkCache.Store("yaddakey", null));
            }
            public async Task DoesntStoreArtworkIfAlreadyInLocalCache()
            {
                var blobCache = Substitute.For<IBlobCache>();
                var artworkCache = new ArtworkCache(blobCache);
                var data = new byte[] { 0, 1 };
                string key = BlobCacheKeys.GetKeyForArtwork(data);

                await artworkCache.Store(key, data);

                blobCache.GetCreatedAt(Arg.Any<string>()).Returns(Observable.Return(new DateTimeOffset?(DateTimeOffset.MaxValue)));

                await artworkCache.Store(key, data);

                blobCache.Received(1).Insert(Arg.Any<string>(), Arg.Any<byte[]>());
            }
Exemple #15
0
            public async Task StoresArtworkInBlobCache()
            {
                var blobCache = new TestBlobCache();
                var artworkCache = new ArtworkCache(blobCache);

                var data = new byte[] { 0, 1 };

                string key = await artworkCache.Store(data);

                Assert.Equal(data, await blobCache.GetAsync(key));
            }