Add integration tests to the init command

This commit is contained in:
Pedro Piñera 2018-07-21 00:04:41 -04:00 committed by Pedro Piñera Buendía
parent c58776bf3b
commit 99dfcab558
3 changed files with 49 additions and 12 deletions

View File

@ -14,9 +14,9 @@ enum InitCommandError: FatalError {
var description: String {
switch self {
case let .alreadyExists(path):
return "\(path.asString) already exists"
return "\(path.asString) already exists."
case let .ungettableProjectName(path):
return "Couldn't infer the project name from path \(path.asString)"
return "Couldn't infer the project name from path \(path.asString)."
}
}
}
@ -30,6 +30,7 @@ class InitCommand: NSObject, Command {
let platformArgument: OptionArgument<String>
let productArgument: OptionArgument<String>
let pathArgument: OptionArgument<String>
let nameArgument: OptionArgument<String>
let fileHandler: FileHandling
let printer: Printing
let infoplistProvisioner: InfoPlistProvisioning
@ -69,6 +70,11 @@ class InitCommand: NSObject, Command {
kind: String.self,
usage: "The path to the folder where the project will be generated.",
completion: .filename)
nameArgument = subParser.add(option: "--name",
shortName: "-n",
kind: String.self,
usage: "The name of the project.",
completion: .filename)
self.fileHandler = fileHandler
self.printer = printer
self.infoplistProvisioner = infoplistProvisioner
@ -78,7 +84,7 @@ class InitCommand: NSObject, Command {
let product = try self.product(arguments: arguments)
let platform = try self.platform(arguments: arguments)
let path = try self.path(arguments: arguments)
let name = try self.name(path: path)
let name = try self.name(arguments: arguments, path: path)
try generateProjectSwift(name: name, platform: platform, product: product, path: path)
try generateSources(name: name, platform: platform, product: product, path: path)
try generateTests(name: name, path: path)
@ -228,8 +234,10 @@ class InitCommand: NSObject, Command {
try content.write(to: path.appending(component: "\(name)Tests.swift").url, atomically: true, encoding: .utf8)
}
fileprivate func name(path: AbsolutePath) throws -> String {
if let name = path.components.last {
fileprivate func name(arguments: ArgumentParser.Result, path: AbsolutePath) throws -> String {
if let name = arguments.get(nameArgument) {
return name
} else if let name = path.components.last {
return name
} else {
throw InitCommandError.ungettableProjectName(AbsolutePath.current)

View File

@ -5,16 +5,45 @@ import XCTest
@testable import xpmkit
final class InitTests: XCTestCase {
var subject: InitCommand!
var initCommand: InitCommand!
var generateCommand: GenerateCommand!
var parser: ArgumentParser!
var directory: TemporaryDirectory!
override func setUp() {
parser = ArgumentParser(usage: "test", overview: "test")
subject = InitCommand(parser: parser)
directory = try! TemporaryDirectory(removeTreeOnDeinit: true)
initCommand = InitCommand(parser: parser)
generateCommand = GenerateCommand(parser: parser)
}
func test_init_when_ios_application() throws {
let result = try parser.parse(["init", "--product", "application", "--platform", "ios"])
try subject.run(with: result)
func test_init_when_ios_framework() throws {
let name = "Test"
let workspacePath = directory.path.appending(component: "\(name).xcworkspace")
let initResult = try parser.parse(["init", "--name", name, "--product", "framework", "--platform", "ios", "--path", directory.path.asString])
try initCommand.run(with: initResult)
let generateResult = try parser.parse(["generate", "--path", directory.path.asString])
try generateCommand.run(with: generateResult)
try Process.checkNonZeroExit(arguments: ["xcodebuild", "-workspace", workspacePath.asString, "-scheme", name, "clean", "build"])
}
func test_init_when_macos_framework() throws {
let name = "Test"
let workspacePath = directory.path.appending(component: "\(name).xcworkspace")
let initResult = try parser.parse(["init", "--name", name, "--product", "framework", "--platform", "macos", "--path", directory.path.asString])
try initCommand.run(with: initResult)
let generateResult = try parser.parse(["generate", "--path", directory.path.asString])
try generateCommand.run(with: generateResult)
try Process.checkNonZeroExit(arguments: ["xcodebuild", "-workspace", workspacePath.asString, "-scheme", name, "clean", "build"])
}
func test_init_when_macos_application() throws {
let name = "Test"
let workspacePath = directory.path.appending(component: "\(name).xcworkspace")
let initResult = try parser.parse(["init", "--name", name, "--product", "application", "--platform", "macos", "--path", directory.path.asString])
try initCommand.run(with: initResult)
let generateResult = try parser.parse(["generate", "--path", directory.path.asString])
try generateCommand.run(with: generateResult)
try Process.checkNonZeroExit(arguments: ["xcodebuild", "-workspace", workspacePath.asString, "-scheme", name, "clean", "build"])
}
}

View File

@ -7,8 +7,8 @@ import XCTest
final class InitCommandErrorTests: XCTestCase {
func test_description() {
XCTAssertEqual(InitCommandError.alreadyExists(AbsolutePath("/path")).description, "/path already exists")
XCTAssertEqual(InitCommandError.ungettableProjectName(AbsolutePath("/path")).description, "Couldn't infer the project name from path /path")
XCTAssertEqual(InitCommandError.alreadyExists(AbsolutePath("/path")).description, "/path already exists.")
XCTAssertEqual(InitCommandError.ungettableProjectName(AbsolutePath("/path")).description, "Couldn't infer the project name from path /path.")
}
func test_type() {