From 8d917b0e0e430dac5f9416fdd956e2099ec80b9c Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Fri, 21 Apr 2023 19:04:02 +0300 Subject: [PATCH] Media uploading preprocessor tests (#820) * Add sample files to use in the MediaUploadingPreprocessor unit tests * Add MediaUploadingPreprocessor unit tests --- .gitattributes | 1 + .github/workflows/unit_tests.yml | 1 + .../Resources/Media/landscape_test_image.jpg | 3 + .../Resources/Media/portrait_test_image.jpg | 3 + UnitTests/Resources/Media/test_audio.mp3 | 3 + UnitTests/Resources/Media/test_image.png | 3 + UnitTests/Resources/Media/test_pdf.pdf | 3 + UnitTests/Resources/Media/test_video.mov | 3 + UnitTests/Resources/test_image.png | Bin 6163 -> 0 bytes .../MediaProvider/MediaProviderTests.swift | 3 +- .../MediaUploadingPreprocessorTests.swift | 191 ++++++++++++++++++ 11 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 UnitTests/Resources/Media/landscape_test_image.jpg create mode 100644 UnitTests/Resources/Media/portrait_test_image.jpg create mode 100644 UnitTests/Resources/Media/test_audio.mp3 create mode 100644 UnitTests/Resources/Media/test_image.png create mode 100644 UnitTests/Resources/Media/test_pdf.pdf create mode 100644 UnitTests/Resources/Media/test_video.mov delete mode 100644 UnitTests/Resources/test_image.png create mode 100644 UnitTests/Sources/MediaUploadingPreprocessorTests.swift diff --git a/.gitattributes b/.gitattributes index 1d7dc2a24..b6757eeff 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ UITests/Sources/__Snapshots__/** filter=lfs diff=lfs merge=lfs -text +UnitTests/Resources/** filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 8295daba4..eb953e1ca 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -23,6 +23,7 @@ jobs: - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} + lfs: true - uses: actions/cache@v3 with: diff --git a/UnitTests/Resources/Media/landscape_test_image.jpg b/UnitTests/Resources/Media/landscape_test_image.jpg new file mode 100644 index 000000000..268d6c5a0 --- /dev/null +++ b/UnitTests/Resources/Media/landscape_test_image.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79da65d0e46d2d7520db60a9e39513484cab5f37b797d1745a921d8a7014aebb +size 2298757 diff --git a/UnitTests/Resources/Media/portrait_test_image.jpg b/UnitTests/Resources/Media/portrait_test_image.jpg new file mode 100644 index 000000000..1ed41e11e --- /dev/null +++ b/UnitTests/Resources/Media/portrait_test_image.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b618d6055c7d4fb53e5edb487a5c1a6fdee0fb966c7910df95e01b612c3b2ad +size 3059441 diff --git a/UnitTests/Resources/Media/test_audio.mp3 b/UnitTests/Resources/Media/test_audio.mp3 new file mode 100644 index 000000000..788335478 --- /dev/null +++ b/UnitTests/Resources/Media/test_audio.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa2820256f2cd3f2df03fa247d7b01e79d3fe794344aadcea08cee06bcce3c94 +size 764176 diff --git a/UnitTests/Resources/Media/test_image.png b/UnitTests/Resources/Media/test_image.png new file mode 100644 index 000000000..d29308618 --- /dev/null +++ b/UnitTests/Resources/Media/test_image.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3ff2e57850649f588516a1a2688be18df8cf8a0bb8850f8d943cf28659beca5 +size 6163 diff --git a/UnitTests/Resources/Media/test_pdf.pdf b/UnitTests/Resources/Media/test_pdf.pdf new file mode 100644 index 000000000..17bad3b57 --- /dev/null +++ b/UnitTests/Resources/Media/test_pdf.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60bdd13ea4827b8de375c79dc3ff847f83b55bd73b6461523fdf8f843b5a0d5b +size 7945 diff --git a/UnitTests/Resources/Media/test_video.mov b/UnitTests/Resources/Media/test_video.mov new file mode 100644 index 000000000..b75ddf156 --- /dev/null +++ b/UnitTests/Resources/Media/test_video.mov @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ff020aa426b7e49606dda50ef48812925f265e570456a09261932fff0d54c21 +size 1448367 diff --git a/UnitTests/Resources/test_image.png b/UnitTests/Resources/test_image.png deleted file mode 100644 index 85d7a6a012b81e4f774b0c8587634e20131c5b27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6163 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 diff --git a/UnitTests/Sources/MediaProvider/MediaProviderTests.swift b/UnitTests/Sources/MediaProvider/MediaProviderTests.swift index 1c561c839..8c481c601 100644 --- a/UnitTests/Sources/MediaProvider/MediaProviderTests.swift +++ b/UnitTests/Sources/MediaProvider/MediaProviderTests.swift @@ -166,8 +166,7 @@ final class MediaProviderTests: XCTestCase { } private func loadTestImage() throws -> UIImage { - let bundle = Bundle(for: classForCoder) - guard let path = bundle.path(forResource: "test_image", ofType: "png"), + guard let path = Bundle(for: Self.self).path(forResource: "test_image", ofType: "png"), let image = UIImage(contentsOfFile: path) else { throw MediaProviderTestsError.screenshotNotFound } diff --git a/UnitTests/Sources/MediaUploadingPreprocessorTests.swift b/UnitTests/Sources/MediaUploadingPreprocessorTests.swift new file mode 100644 index 000000000..4bb9c2c97 --- /dev/null +++ b/UnitTests/Sources/MediaUploadingPreprocessorTests.swift @@ -0,0 +1,191 @@ +// +// Copyright 2023 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest + +@testable import ElementX + +final class MediaUploadingPreprocessorTests: XCTestCase { + let mediaUploadingPreprocessor = MediaUploadingPreprocessor() + + func testAudioFileProcessing() async { + guard let url = Bundle(for: Self.self).url(forResource: "test_audio.mp3", withExtension: nil) else { + XCTFail("Failed retrieving test asset") + return + } + + guard case let .success(result) = await mediaUploadingPreprocessor.processMedia(at: url), + case let .audio(audioURL, audioInfo) = result else { + XCTFail("Failed processing asset") + return + } + + // Check that the file name is preserved + XCTAssertEqual(audioURL.lastPathComponent, "test_audio.mp3") + + XCTAssertEqual(audioInfo.mimetype, "audio/mpeg") + XCTAssertEqual(audioInfo.duration, 27252) + XCTAssertEqual(audioInfo.size, 764_176) + } + + func testVideoProcessing() async { + guard let url = Bundle(for: Self.self).url(forResource: "test_video.mov", withExtension: nil) else { + XCTFail("Failed retrieving test asset") + return + } + + guard case let .success(result) = await mediaUploadingPreprocessor.processMedia(at: url), + case let .video(videoURL, thumbnailURL, videoInfo) = result else { + XCTFail("Failed processing asset") + return + } + + // Check that the file name is preserved + XCTAssertEqual(videoURL.lastPathComponent, "test_video.mp4") + + // Check that the thumbnail is generated correctly + guard let thumbnailData = try? Data(contentsOf: thumbnailURL), + let thumbnail = UIImage(data: thumbnailData) else { + XCTFail("Invalid thumbnail") + return + } + + XCTAssert(thumbnail.size.width <= MediaUploadingPreprocessor.Constants.maximumThumbnailSize.width) + XCTAssert(thumbnail.size.height <= MediaUploadingPreprocessor.Constants.maximumThumbnailSize.height) + + // Check resulting video info + XCTAssertEqual(videoInfo.mimetype, "video/mp4") + XCTAssertEqual(videoInfo.blurhash, "K22PJZx^DgadWAbbMuRio$") + XCTAssertEqual(videoInfo.size, 1_431_959) + XCTAssertEqual(videoInfo.width, 1280) + XCTAssertEqual(videoInfo.height, 720) + XCTAssertEqual(videoInfo.duration, 30483) + + XCTAssertNotNil(videoInfo.thumbnailInfo) + XCTAssertEqual(videoInfo.thumbnailInfo?.mimetype, "image/jpeg") + XCTAssertEqual(videoInfo.thumbnailInfo?.size, 33949) + XCTAssertEqual(videoInfo.thumbnailInfo?.width, 800) + XCTAssertEqual(videoInfo.thumbnailInfo?.height, 450) + } + + func testLandscapeImageProcessing() async { + guard let url = Bundle(for: Self.self).url(forResource: "landscape_test_image.jpg", withExtension: nil) else { + XCTFail("Failed retrieving test asset") + return + } + + guard case let .success(result) = await mediaUploadingPreprocessor.processMedia(at: url), + case let .image(convertedImageURL, thumbnailURL, imageInfo) = result else { + XCTFail("Failed processing asset") + return + } + + compare(originalImageAt: url, toConvertedImageAt: convertedImageURL, withThumbnailAt: thumbnailURL) + + // Check resulting image info + XCTAssertEqual(imageInfo.mimetype, "image/jpeg") + XCTAssertEqual(imageInfo.blurhash, "K%I#.NofkC_4ayayxujsWB") + XCTAssertEqual(imageInfo.size, 3_305_795) + XCTAssertEqual(imageInfo.width, 6103) + XCTAssertEqual(imageInfo.height, 2621) + + XCTAssertNotNil(imageInfo.thumbnailInfo) + XCTAssertEqual(imageInfo.thumbnailInfo?.mimetype, "image/jpeg") + XCTAssertEqual(imageInfo.thumbnailInfo?.size, 52159) + XCTAssertEqual(imageInfo.thumbnailInfo?.width, 600) + XCTAssertEqual(imageInfo.thumbnailInfo?.height, 257) + } + + func testPortraitImageProcessing() async { + guard let url = Bundle(for: Self.self).url(forResource: "portrait_test_image.jpg", withExtension: nil) else { + XCTFail("Failed retrieving test asset") + return + } + + guard case let .success(result) = await mediaUploadingPreprocessor.processMedia(at: url), + case let .image(convertedImageURL, thumbnailURL, imageInfo) = result else { + XCTFail("Failed processing asset") + return + } + + compare(originalImageAt: url, toConvertedImageAt: convertedImageURL, withThumbnailAt: thumbnailURL) + + // Check resulting image info + XCTAssertEqual(imageInfo.mimetype, "image/jpeg") + XCTAssertEqual(imageInfo.blurhash, "KdE:ess+RP^-n*RP%hWAV@") + XCTAssertEqual(imageInfo.size, 4_414_666) + XCTAssertEqual(imageInfo.width, 3024) + XCTAssertEqual(imageInfo.height, 4032) + + XCTAssertNotNil(imageInfo.thumbnailInfo) + XCTAssertEqual(imageInfo.thumbnailInfo?.mimetype, "image/jpeg") + XCTAssertEqual(imageInfo.thumbnailInfo?.size, 156_948) + XCTAssertEqual(imageInfo.thumbnailInfo?.width, 450) + XCTAssertEqual(imageInfo.thumbnailInfo?.height, 600) + } + + // MARK: - Private + + private func compare(originalImageAt originalImageURL: URL, toConvertedImageAt convertedImageURL: URL, withThumbnailAt thumbnailURL: URL) { + guard let originalImageData = try? Data(contentsOf: originalImageURL), + let originalImage = UIImage(data: originalImageData), + let convertedImageData = try? Data(contentsOf: convertedImageURL), + let convertedImage = UIImage(data: convertedImageData) else { + fatalError() + } + + // Check that the file name is preserved + XCTAssertEqual(originalImageURL.lastPathComponent, convertedImageURL.lastPathComponent) + + // Check that new image is the same size as the original one + XCTAssertEqual(originalImage.size, convertedImage.size) + + // Check that the GPS data has been stripped + guard let imageSource = CGImageSourceCreateWithData(originalImageData as NSData, nil) else { + XCTFail("Invalid test asset") + return + } + + guard let originalMetadata: NSDictionary = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) else { + XCTFail("Test asset is expected to contain metadata") + return + } + + XCTAssertNotNil(originalMetadata.value(forKeyPath: "\(kCGImagePropertyGPSDictionary)")) + + guard let convertedImageSource = CGImageSourceCreateWithData(convertedImageData as NSData, nil) else { + XCTFail("Invalid converted asset") + return + } + + guard let convertedMetadata: NSDictionary = CGImageSourceCopyPropertiesAtIndex(convertedImageSource, 0, nil) else { + XCTFail("Test asset is expected to contain metadata") + return + } + + XCTAssertNil(convertedMetadata.value(forKeyPath: "\(kCGImagePropertyGPSDictionary)")) + + // Check that the thumbnail is generated correctly + guard let thumbnailData = try? Data(contentsOf: thumbnailURL), + let thumbnail = UIImage(data: thumbnailData) else { + XCTFail("Invalid thumbnail") + return + } + + XCTAssert(thumbnail.size.width <= MediaUploadingPreprocessor.Constants.maximumThumbnailSize.width) + XCTAssert(thumbnail.size.height <= MediaUploadingPreprocessor.Constants.maximumThumbnailSize.height) + } +}