11//
2- // File .swift
3- //
2+ // UnitTests .swift
3+ // CodeEdit
44//
55// Created by Marco Carnevali on 16/03/22.
66//
7- @ testable import WorkspaceClient
7+ import Combine
88import Foundation
9+ @testable import WorkspaceClient
910import XCTest
1011
1112final class WorkspaceClientUnitTests : XCTestCase {
12-
1313 let typeOfExtensions = [ " json " , " txt " , " swift " , " js " , " py " , " md " ]
14-
14+
1515 func testListFile( ) throws {
1616 let directory = try FileManager . default. url ( for: . developerApplicationDirectory, in: . userDomainMask, appropriateFor: nil , create: true )
1717 . appendingPathComponent ( " CodeEdit " , isDirectory: true )
1818 . appendingPathComponent ( " WorkspaceClientTests " , isDirectory: true )
1919 try FileManager . default. createDirectory ( at: directory, withIntermediateDirectories: true )
20-
21- let randomCount = Int . random ( in: 1 ... 2 )
20+
21+ var cancellable : AnyCancellable ?
22+ let expectation = expectation ( description: " wait for files " )
23+ let randomCount = Int . random ( in: 1 ... 100 )
2224 let files = generateRandomFiles ( amount: randomCount)
2325 try files. forEach {
2426 let fakeData = " fake string " . data ( using: . utf8)
@@ -31,11 +33,73 @@ final class WorkspaceClientUnitTests: XCTestCase {
3133 folderURL: directory,
3234 ignoredFilesAndFolders: [ ]
3335 )
34- print ( " file: " , files. count, " 2: " , client. getFiles ( ) . count)
35- XCTAssertEqual ( files, client. getFiles ( ) . map ( \. url. lastPathComponent) )
36+
37+ var newFiles : [ WorkspaceClient . FileItem ] = [ ]
38+
39+ cancellable = client
40+ . getFiles
41+ . sink { files in
42+ newFiles = files
43+ expectation. fulfill ( )
44+ }
45+
46+ waitForExpectations ( timeout: 0.5 )
47+
48+ XCTAssertEqual ( files. count, newFiles. count)
49+ try FileManager . default. removeItem ( at: directory)
50+ cancellable? . cancel ( )
51+ }
52+
53+ func testDirectoryChanges( ) throws {
54+ let directory = try FileManager . default. url ( for: . developerApplicationDirectory, in: . userDomainMask, appropriateFor: nil , create: true )
55+ . appendingPathComponent ( " CodeEdit " , isDirectory: true )
56+ . appendingPathComponent ( " WorkspaceClientTests " , isDirectory: true )
57+ try FileManager . default. createDirectory ( at: directory, withIntermediateDirectories: true )
58+
59+ var cancellable : AnyCancellable ?
60+ let expectation = expectation ( description: " wait for files " )
61+ expectation. expectedFulfillmentCount = 2
62+
63+ let randomCount = Int . random ( in: 1 ... 100 )
64+ var files = generateRandomFiles ( amount: randomCount)
65+ try files. forEach {
66+ let fakeData = " fake string " . data ( using: . utf8)
67+ let fileUrl = directory
68+ . appendingPathComponent ( $0)
69+ try fakeData!. write ( to: fileUrl)
70+ }
71+
72+ let client : WorkspaceClient = try . default(
73+ fileManager: . default,
74+ folderURL: directory,
75+ ignoredFilesAndFolders: [ ]
76+ )
77+
78+ var newFiles : [ WorkspaceClient . FileItem ] = [ ]
79+
80+ cancellable = client
81+ . getFiles
82+ . sink { files in
83+ newFiles = files
84+ expectation. fulfill ( )
85+ }
86+
87+ let nextBatchOfFiles = generateRandomFiles ( amount: 1 )
88+ files. append ( contentsOf: nextBatchOfFiles)
89+ try files. forEach {
90+ let fakeData = " fake string " . data ( using: . utf8)
91+ let fileUrl = directory
92+ . appendingPathComponent ( $0)
93+ try fakeData!. write ( to: fileUrl)
94+ }
95+
96+ waitForExpectations ( timeout: 1.5 )
97+
98+ XCTAssertEqual ( files. count, newFiles. count)
3699 try FileManager . default. removeItem ( at: directory)
100+ cancellable? . cancel ( )
37101 }
38-
102+
39103 func generateRandomFiles( amount: Int ) -> [ String ] {
40104 [ String] ( repeating: " " , count: amount)
41105 . map { _ in
@@ -44,9 +108,9 @@ final class WorkspaceClientUnitTests: XCTestCase {
44108 return " \( fileName) . \( fileExtension) "
45109 }
46110 }
47-
111+
48112 func randomString( length: Int ) -> String {
49113 let letters = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
50- return String ( ( 0 ..< length) . map { _ in letters. randomElement ( ) ! } )
114+ return String ( ( 0 ..< length) . map { _ in letters. randomElement ( ) ! } )
51115 }
52116}
0 commit comments