ZipTests.swift 12.2 KB
Newer Older
Roy Marmelstein's avatar
Roy Marmelstein committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
//
//  ZipTests.swift
//  ZipTests
//
//  Created by Roy Marmelstein on 13/12/2015.
//  Copyright © 2015 Roy Marmelstein. All rights reserved.
//

import XCTest
@testable import Zip

class ZipTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
    }
    
    override func tearDown() {
        super.tearDown()
    }
    
22 23
    func testQuickUnzip() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
24
            let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
25
            let destinationURL = try Zip.quickUnzipFile(filePath)
26
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
27
            XCTAssertTrue(fileManager.fileExists(atPath: destinationURL.path))
28 29 30
        }
        catch {
            XCTFail()
Roy Marmelstein's avatar
Roy Marmelstein committed
31
        }
Roy Marmelstein's avatar
Roy Marmelstein committed
32 33 34 35
    }
    
    func testQuickUnzipNonExistingPath() {
        do {
36
            let filePathURL = Bundle(for: ZipTests.self).resourcePath
Roy Marmelstein's avatar
Roy Marmelstein committed
37
            let filePath = NSURL(string:"\(filePathURL!)/bb9.zip")
38 39
            let destinationURL = try Zip.quickUnzipFile(filePath! as URL)
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
40
            XCTAssertFalse(fileManager.fileExists(atPath:destinationURL.path))
Roy Marmelstein's avatar
Roy Marmelstein committed
41 42 43 44 45
        }
        catch {
            XCTAssert(true)
        }
    }
Justin Anderson's avatar
Justin Anderson committed
46
    
Roy Marmelstein's avatar
Roy Marmelstein committed
47 48
    func testQuickUnzipNonZipPath() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
49
            let filePath = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
50
            let destinationURL = try Zip.quickUnzipFile(filePath)
51
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
52
            XCTAssertFalse(fileManager.fileExists(atPath:destinationURL.path))
Roy Marmelstein's avatar
Roy Marmelstein committed
53 54 55 56
        }
        catch {
            XCTAssert(true)
        }
Roy Marmelstein's avatar
Roy Marmelstein committed
57 58
    }
    
Roy Marmelstein's avatar
Roy Marmelstein committed
59 60
    func testQuickUnzipProgress() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
61 62
            let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
            _ = try Zip.quickUnzipFile(filePath, progress: { (progress) -> () in
Roy Marmelstein's avatar
Roy Marmelstein committed
63 64 65 66 67 68 69
                XCTAssert(true)
            })
        }
        catch {
            XCTFail()
        }
    }
70
    
Roy Marmelstein's avatar
Roy Marmelstein committed
71
    func testQuickUnzipOnlineURL() {
72
        do {
Roy Marmelstein's avatar
Roy Marmelstein committed
73
            let filePath = NSURL(string: "http://www.google.com/google.zip")!
74 75
            let destinationURL = try Zip.quickUnzipFile(filePath as URL)
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
76
            XCTAssertFalse(fileManager.fileExists(atPath:destinationURL.path))
77 78 79 80 81
        }
        catch {
            XCTAssert(true)
        }
    }
Roy Marmelstein's avatar
Roy Marmelstein committed
82 83 84
    
    func testUnzip() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
85 86
            let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
            let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
Justin Anderson's avatar
Justin Anderson committed
87
            
88
            try Zip.unzipFile(filePath, destination: documentsFolder as URL, overwrite: true, password: "password", progress: { (progress) -> () in
Roy Marmelstein's avatar
Roy Marmelstein committed
89 90
                print(progress)
            })
Justin Anderson's avatar
Justin Anderson committed
91
            
92 93
            let fileManager = FileManager.default
            XCTAssertTrue(fileManager.fileExists(atPath:documentsFolder.path!))
Roy Marmelstein's avatar
Roy Marmelstein committed
94 95 96 97 98
        }
        catch {
            XCTFail()
        }
    }
99
    
Justin Anderson's avatar
Justin Anderson committed
100 101
    func testImplicitProgressUnzip() {
        do {
102
            let progress = Progress()
Justin Anderson's avatar
Justin Anderson committed
103 104
            progress.totalUnitCount = 1
            
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
105 106
            let filePath = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
            let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
Justin Anderson's avatar
Justin Anderson committed
107
            
108 109
            progress.becomeCurrent(withPendingUnitCount: 1)
            try Zip.unzipFile(filePath, destination: documentsFolder as URL, overwrite: true, password: "password", progress: nil)
Justin Anderson's avatar
Justin Anderson committed
110 111 112 113 114 115 116 117 118 119 120 121
            progress.resignCurrent()
            
            XCTAssertTrue(progress.totalUnitCount == progress.completedUnitCount)
        }
        catch {
            XCTFail()
        }
        
    }
    
    func testImplicitProgressZip() {
        do {
122
            let progress = Progress()
Justin Anderson's avatar
Justin Anderson committed
123 124
            progress.totalUnitCount = 1
            
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
125 126 127
            let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
            let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
            let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
128
            let zipFilePath = documentsFolder.appendingPathComponent("archive.zip")
Justin Anderson's avatar
Justin Anderson committed
129
            
130
            progress.becomeCurrent(withPendingUnitCount: 1)
131
            try Zip.zipFiles(paths: [imageURL1, imageURL2], zipFilePath: zipFilePath!, password: nil, progress: nil)
Justin Anderson's avatar
Justin Anderson committed
132 133 134 135 136 137 138 139 140 141
            progress.resignCurrent()
            
            XCTAssertTrue(progress.totalUnitCount == progress.completedUnitCount)
        }
        catch {
            XCTFail()
        }
    }
    
    
142 143
    func testQuickZip() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
144 145
            let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
            let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
146
            let destinationURL = try Zip.quickZipFiles([imageURL1, imageURL2], fileName: "archive")
147
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
148
            XCTAssertTrue(fileManager.fileExists(atPath:destinationURL.path))
149 150 151 152 153
        }
        catch {
            XCTFail()
        }
    }
Roy Marmelstein's avatar
Roy Marmelstein committed
154
    
Roy Marmelstein's avatar
Roy Marmelstein committed
155 156
    func testQuickZipFolder() {
        do {
157
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
158 159 160 161 162 163
            let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
            let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
            let folderURL = Bundle(for: ZipTests.self).bundleURL.appendingPathComponent("Directory")
            let targetImageURL1 = folderURL.appendingPathComponent("3crBXeO.gif")
            let targetImageURL2 = folderURL.appendingPathComponent("kYkLkPf.gif")
            if fileManager.fileExists(atPath:folderURL.path) {
164
                try fileManager.removeItem(at: folderURL)
Roy Marmelstein's avatar
Roy Marmelstein committed
165
            }
166 167 168
            try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: false, attributes: nil)
            try fileManager.copyItem(at: imageURL1, to: targetImageURL1)
            try fileManager.copyItem(at: imageURL2, to: targetImageURL2)
Roy Marmelstein's avatar
Roy Marmelstein committed
169
            let destinationURL = try Zip.quickZipFiles([folderURL], fileName: "directory")
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
170
            XCTAssertTrue(fileManager.fileExists(atPath:destinationURL.path))
Roy Marmelstein's avatar
Roy Marmelstein committed
171 172 173 174 175
        }
        catch {
            XCTFail()
        }
    }
Justin Anderson's avatar
Justin Anderson committed
176
    
Roy Marmelstein's avatar
Roy Marmelstein committed
177
    
Roy Marmelstein's avatar
Roy Marmelstein committed
178 179
    func testZip() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
180 181 182
            let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
            let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
            let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
183
            let zipFilePath = documentsFolder.appendingPathComponent("archive.zip")
184
            try Zip.zipFiles(paths: [imageURL1, imageURL2], zipFilePath: zipFilePath!, password: nil, progress: { (progress) -> () in
Roy Marmelstein's avatar
Roy Marmelstein committed
185 186
                print(progress)
            })
187
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
188
            XCTAssertTrue(fileManager.fileExists(atPath:(zipFilePath?.path)!))
Roy Marmelstein's avatar
Roy Marmelstein committed
189 190 191 192 193
        }
        catch {
            XCTFail()
        }
    }
194
    
195 196
    func testZipUnzipPassword() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
197 198 199
            let imageURL1 = Bundle(for: ZipTests.self).url(forResource: "3crBXeO", withExtension: "gif")!
            let imageURL2 = Bundle(for: ZipTests.self).url(forResource: "kYkLkPf", withExtension: "gif")!
            let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
200
            let zipFilePath = documentsFolder.appendingPathComponent("archive.zip")
201
            try Zip.zipFiles(paths: [imageURL1, imageURL2], zipFilePath: zipFilePath!, password: "password", progress: { (progress) -> () in
202 203
                print(progress)
            })
204
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
205
            XCTAssertTrue(fileManager.fileExists(atPath:(zipFilePath?.path)!))
206 207
            guard let fileExtension = zipFilePath?.pathExtension, let fileName = zipFilePath?.lastPathComponent else {
                throw ZipError.unzipFail
208
            }
209
            let directoryName = fileName.replacingOccurrences(of: ".\(fileExtension)", with: "")
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
210
            let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
211 212
            let destinationUrl = documentsUrl.appendingPathComponent(directoryName, isDirectory: true)
            try Zip.unzipFile(zipFilePath!, destination: destinationUrl!, overwrite: true, password: "password", progress: nil)
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
213
            XCTAssertTrue(fileManager.fileExists(atPath:(destinationUrl?.path)!))
214 215 216 217 218 219
        }
        catch {
            XCTFail()
        }
    }

220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
    func testUnzipPermissions() {
        do {
            let permissionsURL = Bundle(for: ZipTests.self).url(forResource: "permissions", withExtension: "zip")!
            let unzipDestination = try Zip.quickUnzipFile(permissionsURL)
            let fileManager = FileManager.default
            let permission777 = unzipDestination.appendingPathComponent("permission_777").appendingPathExtension("txt")
            let permission600 = unzipDestination.appendingPathComponent("permission_600").appendingPathExtension("txt")
            let permission604 = unzipDestination.appendingPathComponent("permission_604").appendingPathExtension("txt")
            
            do {
                let attributes777 = try fileManager.attributesOfItem(atPath: permission777.path)
                let attributes600 = try fileManager.attributesOfItem(atPath: permission600.path)
                let attributes604 = try fileManager.attributesOfItem(atPath: permission604.path)
                XCTAssertEqual(attributes777[.posixPermissions] as? Int, 0o777)
                XCTAssertEqual(attributes600[.posixPermissions] as? Int, 0o600)
                XCTAssertEqual(attributes604[.posixPermissions] as? Int, 0o604)
            } catch {
                XCTFail("Failed to get file attributes \(error)")
            }
        } catch {
            XCTFail("Failed extract permissions.zip")
        }
    }
243
    
244 245
    func testQuickUnzipSubDir() {
        do {
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
246
            let bookURL = Bundle(for: ZipTests.self).url(forResource: "bb8", withExtension: "zip")!
247
            let unzipDestination = try Zip.quickUnzipFile(bookURL)
248
            let fileManager = FileManager.default
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
249 250
            let subDir = unzipDestination.appendingPathComponent("subDir")
            let imageURL = subDir.appendingPathComponent("r2W9yu9").appendingPathExtension("gif")
251
            
Pavel Hlavnicka's avatar
Pavel Hlavnicka committed
252 253 254
            XCTAssertTrue(fileManager.fileExists(atPath:unzipDestination.path))
            XCTAssertTrue(fileManager.fileExists(atPath:subDir.path))
            XCTAssertTrue(fileManager.fileExists(atPath:imageURL.path))
255 256 257 258
        } catch {
            XCTFail()
        }
    }
Roy Marmelstein's avatar
Roy Marmelstein committed
259

260
    func testFileExtensionIsNotInvalidForValidUrl() {
261
        let fileUrl = NSURL(string: "file.cbz")
József Vesza's avatar
József Vesza committed
262
        let result = Zip.fileExtensionIsInvalid(fileUrl?.pathExtension)
263
        XCTAssertFalse(result)
József Vesza's avatar
József Vesza committed
264 265 266
    }
    
    func testFileExtensionIsInvalidForInvalidUrl() {
267
        let fileUrl = NSURL(string: "file.xyz")
József Vesza's avatar
József Vesza committed
268
        let result = Zip.fileExtensionIsInvalid(fileUrl?.pathExtension)
269
        XCTAssertTrue(result)
József Vesza's avatar
József Vesza committed
270
    }
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
    
    func testAddedCustomFileExtensionIsValid() {
        let fileExtension = "cstm"
        Zip.addCustomFileExtension(fileExtension)
        let result = Zip.isValidFileExtension(fileExtension)
        XCTAssertTrue(result)
        Zip.removeCustomFileExtension(fileExtension)
    }
    
    func testRemovedCustomFileExtensionIsInvalid() {
        let fileExtension = "cstm"
        Zip.addCustomFileExtension(fileExtension)
        Zip.removeCustomFileExtension(fileExtension)
        let result = Zip.isValidFileExtension(fileExtension)
        XCTAssertFalse(result)
    }
    
    func testDefaultFileExtensionsIsValid() {
        XCTAssertTrue(Zip.isValidFileExtension("zip"))
        XCTAssertTrue(Zip.isValidFileExtension("cbz"))
    }
    
    func testDefaultFileExtensionsIsNotRemoved() {
        Zip.removeCustomFileExtension("zip")
        Zip.removeCustomFileExtension("cbz")
        XCTAssertTrue(Zip.isValidFileExtension("zip"))
        XCTAssertTrue(Zip.isValidFileExtension("cbz"))
    }
    
Roy Marmelstein's avatar
Roy Marmelstein committed
300
}