Skip to content

Commit a3035e2

Browse files
committed
Replace TempFolder test class with createTempFolder test function
1 parent db26074 commit a3035e2

File tree

10 files changed

+84
-139
lines changed

10 files changed

+84
-139
lines changed

Sources/SwiftDocCTestUtilities/FilesAndFolders.swift

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010

1111
import Foundation
12+
import XCTest
1213

1314
/*
1415
This file contains API for working with folder hierarchies, and is extensible to allow for testing
@@ -247,32 +248,16 @@ public struct DataFile: File, DataRepresentable {
247248
}
248249
}
249250

250-
/// A temporary folder which can write files to a temporary location on disk and
251-
/// will delete itself when its instance is released from memory.
252-
public class TempFolder: File {
253-
public let name: String
254-
public let url: URL
255-
256-
/// The files and sub folders that this folder contains.
257-
let content: [File]
258-
259-
public func write(to url: URL) throws {
260-
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: false, attributes: nil)
261-
for file in content {
262-
try file.write(inside: url)
263-
}
264-
}
265-
266-
public init(content: [File], atRoot root: URL) throws {
267-
self.content = content
268-
269-
url = root
270-
name = url.absoluteString
271-
272-
try write(to: url)
273-
}
274-
275-
deinit {
276-
try? FileManager.default.removeItem(at: url)
251+
extension XCTestCase {
252+
/// Creates a ``Folder`` and writes its content to a temporary location on disk.
253+
///
254+
/// - Parameters:
255+
/// - content: The files and subfolders to write to a temporary location
256+
/// - Returns: The temporary location where the temporary folder was written.
257+
public func createTempFolder(content: [File]) throws -> URL {
258+
let temporaryDirectory = try createTemporaryDirectory().appendingPathComponent("TempDirectory-\(ProcessInfo.processInfo.globallyUniqueString)")
259+
let folder = Folder(name: temporaryDirectory.lastPathComponent, content: content)
260+
try folder.write(to: temporaryDirectory)
261+
return temporaryDirectory
277262
}
278263
}

Tests/SwiftDocCTests/Infrastructure/DocumentationContext+RootPageTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import SwiftDocCTestUtilities
1515

1616
class DocumentationContext_RootPageTests: XCTestCase {
1717
func testNoSGFBundle() throws {
18-
let tempFolder = try TempFolder(content: [
18+
let tempFolderURL = try createTempFolder(content: [
1919
Folder(name: "no-sgf-test.docc", content: [
2020
// Root page for the collection
2121
TextFile(name: "ReleaseNotes.md", utf8Content: """
@@ -37,12 +37,12 @@ class DocumentationContext_RootPageTests: XCTestCase {
3737
"""),
3838
InfoPlist(displayName: "TestBundle", identifier: "com.test.example"),
3939
]),
40-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
40+
])
4141

4242
// Parse this test content
4343
let workspace = DocumentationWorkspace()
4444
let context = try DocumentationContext(dataProvider: workspace)
45-
let dataProvider = try LocalFileSystemDataProvider(rootURL: tempFolder.url.appendingPathComponent("no-sgf-test.docc"))
45+
let dataProvider = try LocalFileSystemDataProvider(rootURL: tempFolderURL.appendingPathComponent("no-sgf-test.docc"))
4646
try workspace.registerProvider(dataProvider)
4747

4848
// Verify all articles were loaded in the context
@@ -57,7 +57,7 @@ class DocumentationContext_RootPageTests: XCTestCase {
5757
}
5858

5959
func testWarnForSidecarRootPage() throws {
60-
let tempFolder = try TempFolder(content: [
60+
let tempFolderURL = try createTempFolder(content: [
6161
Folder(name: "no-sgf-test.docc", content: [
6262
// Root page for the collection
6363
TextFile(name: "ReleaseNotes.md", utf8Content: """
@@ -79,12 +79,12 @@ class DocumentationContext_RootPageTests: XCTestCase {
7979
"""),
8080
InfoPlist(displayName: "TestBundle", identifier: "com.test.example"),
8181
]),
82-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
82+
])
8383

8484
// Parse this test content
8585
let workspace = DocumentationWorkspace()
8686
let context = try DocumentationContext(dataProvider: workspace)
87-
let dataProvider = try LocalFileSystemDataProvider(rootURL: tempFolder.url.appendingPathComponent("no-sgf-test.docc"))
87+
let dataProvider = try LocalFileSystemDataProvider(rootURL: tempFolderURL.appendingPathComponent("no-sgf-test.docc"))
8888
try workspace.registerProvider(dataProvider)
8989

9090
// Verify that we emit a warning when trying to make a symbol a root page

Tests/SwiftDocCTests/Rendering/PlistSymbolTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,10 @@ class PlistSymbolTests: XCTestCase {
127127
let modifiedJSON = try String(contentsOf: plistSymbolURL)
128128
.replacingOccurrences(of: "\"ideTitle\": \"WiFi access\",", with: "")
129129

130-
let tempDir = try TempFolder(content: [
130+
let tempFolderURL = try createTempFolder(content: [
131131
TextFile(name: "missingIdeTitle.json", utf8Content: modifiedJSON),
132-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
133-
let symbol = try RenderNode.decode(fromJSON: try Data(contentsOf: tempDir.url.appendingPathComponent("missingIdeTitle.json")))
132+
])
133+
let symbol = try RenderNode.decode(fromJSON: try Data(contentsOf: tempFolderURL.appendingPathComponent("missingIdeTitle.json")))
134134

135135
//
136136
// Plist Details
@@ -153,10 +153,10 @@ class PlistSymbolTests: XCTestCase {
153153
let modifiedJSON = try String(contentsOf: plistSymbolURL)
154154
.replacingOccurrences(of: "\"title\": \"Possible Values\",", with: "")
155155

156-
let tempDir = try TempFolder(content: [
156+
let tempFolderURL = try createTempFolder(content: [
157157
TextFile(name: "missingPossibleValuesTitle.json", utf8Content: modifiedJSON),
158-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
159-
let symbol = try RenderNode.decode(fromJSON: try Data(contentsOf: tempDir.url.appendingPathComponent("missingPossibleValuesTitle.json")))
158+
])
159+
let symbol = try RenderNode.decode(fromJSON: try Data(contentsOf: tempFolderURL.appendingPathComponent("missingPossibleValuesTitle.json")))
160160

161161
//
162162
// Plist Details

Tests/SwiftDocCUtilitiesTests/ArgumentParsing/ConvertSubcommandTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,11 @@ class ConvertSubcommandTests: XCTestCase {
7777
// Test default template
7878
do {
7979
unsetenv(TemplateOption.environmentVariableKey)
80-
let tempDir = try createTemporaryDirectory()
81-
let doccExecutableLocation = tempDir
80+
let tempFolder = try createTemporaryDirectory()
81+
let doccExecutableLocation = tempFolder
8282
.appendingPathComponent("bin")
8383
.appendingPathComponent("docc-executable-name")
84-
let defaultTemplateDir = tempDir
84+
let defaultTemplateDir = tempFolder
8585
.appendingPathComponent("share")
8686
.appendingPathComponent("docc")
8787
.appendingPathComponent("render", isDirectory: true)

Tests/SwiftDocCUtilitiesTests/ArgumentParsing/PreviewSubcommandTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ class PreviewSubcommandTests: XCTestCase {
4848
// Test default template
4949
do {
5050
unsetenv(TemplateOption.environmentVariableKey)
51-
let tempDir = try createTemporaryDirectory()
52-
let doccExecutableLocation = tempDir
51+
let tempFolder = try createTemporaryDirectory()
52+
let doccExecutableLocation = tempFolder
5353
.appendingPathComponent("bin")
5454
.appendingPathComponent("docc-executable-name")
55-
let defaultTemplateDir = tempDir
55+
let defaultTemplateDir = tempFolder
5656
.appendingPathComponent("share")
5757
.appendingPathComponent("docc")
5858
.appendingPathComponent("render", isDirectory: true)

Tests/SwiftDocCUtilitiesTests/PreviewServer/PreviewHTTPHandlerTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ class PreviewHTTPHandlerTests: XCTestCase {
2222

2323
/// Tests the three different responses we offer: static file, default, and error.
2424
func testPreviewHandler() throws {
25-
let tempDir = try TempFolder(content: [
25+
let tempFolderURL = try createTempFolder(content: [
2626
TextFile(name: "index.html", utf8Content: "index"),
2727
Folder(name: "css", content: [
2828
TextFile(name: "test.css", utf8Content: "css"),
2929
])
30-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
30+
])
3131

3232
let channel = EmbeddedChannel()
33-
let channelHandler = PreviewHTTPHandler(fileIO: fileIO, rootURL: tempDir.url)
33+
let channelHandler = PreviewHTTPHandler(fileIO: fileIO, rootURL: tempFolderURL)
3434

3535
let response = Response()
3636

@@ -83,20 +83,20 @@ class PreviewHTTPHandlerTests: XCTestCase {
8383
}
8484

8585
func testPreviewAuthHandler() throws {
86-
let tempDir = try TempFolder(content: [
86+
let tempFolderURL = try createTempFolder(content: [
8787
TextFile(name: "index.html", utf8Content: "index"),
8888
Folder(name: "css", content: [
8989
TextFile(name: "test.css", utf8Content: "css"),
9090
])
91-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
91+
])
9292

9393
let channel = EmbeddedChannel()
9494
defer {
9595
// Close the test channel, ignore any leftovers
9696
_ = try? channel.finish()
9797
}
9898

99-
let channelHandler = PreviewHTTPHandler(fileIO: fileIO, rootURL: tempDir.url, credentials: (user: "user", pass: "pass"))
99+
let channelHandler = PreviewHTTPHandler(fileIO: fileIO, rootURL: tempFolderURL, credentials: (user: "user", pass: "pass"))
100100

101101
let response = Response()
102102

Tests/SwiftDocCUtilitiesTests/PreviewServer/PreviewServerTests.swift

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,21 @@ class PreviewServerTests {
3434
fatalError("This test is disabled by not conforming to XCTestCase. This helper is added here to make the code compile. This should never be called.")
3535
}
3636

37+
public func createTempFolder(content: [File]) throws -> URL {
38+
fatalError("This test is disabled by not conforming to XCTestCase. This helper is added here to make the code compile. This should never be called.")
39+
}
40+
3741
func testPreviewServerBeforeStarted() throws {
3842
// Create test content
39-
let tempFolder = try TempFolder(content: [
43+
let tempFolderURL = try createTempFolder(content: [
4044
TextFile(name: "index.html", utf8Content: "index"),
41-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
45+
])
4246

4347
let socketURL = try createTemporaryDirectory(pathComponents: "sock", createDirectoryForLastPathComponent: false)
4448

4549
// Run test server
4650
var log = LogHandle.none
47-
let server = try PreviewServer(contentURL: tempFolder.url, bindTo: .socket(path: socketURL.path), username: "username", password: "password", logHandle: &log)
51+
let server = try PreviewServer(contentURL: tempFolderURL, bindTo: .socket(path: socketURL.path), username: "username", password: "password", logHandle: &log)
4852

4953
// Assert server starts
5054
let expectationStarted = AsyncronousExpectation(description: "Server before start")
@@ -81,9 +85,9 @@ class PreviewServerTests {
8185
XCTAssertEqual(client.handler.statusCode, errorStatusCode, file: (file), line: line)
8286
}
8387

84-
private func makeTempFolder() throws -> TempFolder {
88+
private func makeTempFolder() throws -> URL {
8589
// Create test content
86-
try TempFolder(content: [
90+
try createTempFolder(content: [
8791
TextFile(name: "index.html", utf8Content: "index"),
8892
TextFile(name: "theme-settings.js", utf8Content: "java script content"),
8993
TextFile(name: "theme-settings.json", utf8Content: "JSON content"),
@@ -113,18 +117,18 @@ class PreviewServerTests {
113117
Folder(name: "downloads", content: [
114118
TextFile(name: "test.zip", utf8Content: "downloads content"),
115119
])
116-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
120+
])
117121
}
118122

119123
func testPreviewServerPaths() throws {
120-
let tempFolder = try makeTempFolder()
124+
let tempFolderURL = try makeTempFolder()
121125

122126
// Socket URL
123127
let socketURL = try createTemporaryDirectory(pathComponents: "sock", createDirectoryForLastPathComponent: false)
124128

125129
// Create the server
126130
var log = LogHandle.none
127-
let server = try PreviewServer(contentURL: tempFolder.url, bindTo: .socket(path: socketURL.path), username: "username", password: "password", logHandle: &log)
131+
let server = try PreviewServer(contentURL: tempFolderURL, bindTo: .socket(path: socketURL.path), username: "username", password: "password", logHandle: &log)
128132

129133
// Start the server
130134
let expectationStarted = AsyncronousExpectation(description: "Server before start")
@@ -164,14 +168,14 @@ class PreviewServerTests {
164168
}
165169

166170
func testConcurrentRequests() throws {
167-
let tempFolder = try makeTempFolder()
171+
let tempFolderURL = try makeTempFolder()
168172

169173
// Socket URL
170174
let socketURL = try createTemporaryDirectory(pathComponents: "sock", createDirectoryForLastPathComponent: false)
171175

172176
// Create the server
173177
var log = LogHandle.none
174-
let server = try PreviewServer(contentURL: tempFolder.url, bindTo: .socket(path: socketURL.path), username: "username", password: "password", logHandle: &log)
178+
let server = try PreviewServer(contentURL: tempFolderURL, bindTo: .socket(path: socketURL.path), username: "username", password: "password", logHandle: &log)
175179

176180
// Start the server
177181
let expectationStarted = AsyncronousExpectation(description: "Server before start")

Tests/SwiftDocCUtilitiesTests/PreviewServer/RequestHandler/DefaultRequestHandlerTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import NIOHTTP1
2020
class DefaultRequestHandlerTests: XCTestCase {
2121

2222
func testDefaultHandler() throws {
23-
let tempDir = try TempFolder(content: [
23+
let tempFolderURL = try createTempFolder(content: [
2424
TextFile(name: "index.html", utf8Content: "Hello!"),
25-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
25+
])
2626

2727
// Default handler should be invoked for any non-asset path
2828
let request = makeRequestHead(path: "/random-path")
29-
let factory = DefaultRequestHandler(rootURL: tempDir.url)
29+
let factory = DefaultRequestHandler(rootURL: tempFolderURL)
3030
let response = try responseWithPipeline(request: request, handler: factory)
3131

3232
// Expected content
@@ -42,14 +42,14 @@ class DefaultRequestHandlerTests: XCTestCase {
4242
}
4343

4444
func testDefaultHandlerForExistingPath() throws {
45-
let tempDir = try TempFolder(content: [
45+
let tempFolderURL = try createTempFolder(content: [
4646
TextFile(name: "index.html", utf8Content: "Hello!"),
4747
TextFile(name: "existing.html", utf8Content: "Existing!"),
48-
], atRoot: createTemporaryDirectory().appendingPathComponent("tempFolder"))
48+
])
4949

5050
// Default handler should handle even paths that do exist on disc
5151
let request = makeRequestHead(path: "/existing.html")
52-
let factory = DefaultRequestHandler(rootURL: tempDir.url)
52+
let factory = DefaultRequestHandler(rootURL: tempFolderURL)
5353
let response = try responseWithPipeline(request: request, handler: factory)
5454

5555
// Expected content

0 commit comments

Comments
 (0)