mirror of
https://github.com/mas-cli/mas
synced 2025-02-16 12:38:30 +00:00
✅ Add tests to InfoCommandSpec
This commit is contained in:
parent
96b3fb04b9
commit
77c37c77be
3 changed files with 123 additions and 4 deletions
|
@ -13,12 +13,62 @@ import Nimble
|
||||||
|
|
||||||
class InfoCommandSpec: QuickSpec {
|
class InfoCommandSpec: QuickSpec {
|
||||||
override func spec() {
|
override func spec() {
|
||||||
|
let result = SearchResult(
|
||||||
|
bundleId: "",
|
||||||
|
currentVersionReleaseDate: "2019-01-07T18:53:13Z",
|
||||||
|
fileSizeBytes: "1024",
|
||||||
|
formattedPrice: "",
|
||||||
|
minimumOsVersion: "10.14",
|
||||||
|
price: 2.0,
|
||||||
|
sellerName: "Awesome Dev",
|
||||||
|
sellerUrl: "",
|
||||||
|
trackId: 1111,
|
||||||
|
trackCensoredName: "",
|
||||||
|
trackName: "Awesome App",
|
||||||
|
trackViewUrl: "https://awesome.app",
|
||||||
|
version: "1.0"
|
||||||
|
)
|
||||||
|
let storeSearch = StoreSearchMock()
|
||||||
|
let cmd = InfoCommand(storeSearch: storeSearch)
|
||||||
|
let expectedOutput = """
|
||||||
|
Awesome App 1.0 [2.0]
|
||||||
|
By: Awesome Dev
|
||||||
|
Released: Jan 7, 2019
|
||||||
|
Minimum OS: 10.14
|
||||||
|
Size: 1 KB
|
||||||
|
From: https://awesome.app
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
describe("Info command") {
|
describe("Info command") {
|
||||||
|
beforeEach {
|
||||||
|
storeSearch.reset()
|
||||||
|
}
|
||||||
|
it("fails to open app with invalid ID") {
|
||||||
|
let result = cmd.run(InfoCommand.Options(appId: "-999"))
|
||||||
|
expect(result).to(beFailure { error in
|
||||||
|
expect(error) == .searchFailed
|
||||||
|
})
|
||||||
|
}
|
||||||
|
it("can't find app with unknown ID") {
|
||||||
|
let result = cmd.run(InfoCommand.Options(appId: "999"))
|
||||||
|
expect(result).to(beFailure { error in
|
||||||
|
expect(error) == .noSearchResultsFound
|
||||||
|
})
|
||||||
|
}
|
||||||
it("displays app details") {
|
it("displays app details") {
|
||||||
let cmd = InfoCommand()
|
storeSearch.apps[result.trackId] = result
|
||||||
let result = cmd.run(InfoCommand.Options(appId: ""))
|
let output = OutputListener()
|
||||||
print(result)
|
output.openConsolePipe()
|
||||||
// expect(result).to(beSuccess())
|
|
||||||
|
let result = cmd.run(InfoCommand.Options(appId: result.trackId.description))
|
||||||
|
|
||||||
|
expect(result).to(beSuccess())
|
||||||
|
waitUntil { done in
|
||||||
|
print(output.contents)
|
||||||
|
expect(output.contents) == expectedOutput
|
||||||
|
done()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
65
MasKitTests/OutputListener.swift
Normal file
65
MasKitTests/OutputListener.swift
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
//
|
||||||
|
// OutputListener.swift
|
||||||
|
// MasKitTests
|
||||||
|
//
|
||||||
|
// Created by Ben Chatelain on 1/7/19.
|
||||||
|
// Copyright © 2019 mas-cli. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// https://medium.com/@thesaadismail/eavesdropping-on-swifts-print-statements-57f0215efb42
|
||||||
|
class OutputListener {
|
||||||
|
// open a new Pipe to consume the messages on STDOUT and STDERR
|
||||||
|
let inputPipe = Pipe()
|
||||||
|
|
||||||
|
// open another Pipe to output messages back to STDOUT
|
||||||
|
let outputPipe = Pipe()
|
||||||
|
|
||||||
|
var contents = ""
|
||||||
|
|
||||||
|
func openConsolePipe() {
|
||||||
|
let pipeReadHandle = inputPipe.fileHandleForReading
|
||||||
|
|
||||||
|
//from documentation
|
||||||
|
//dup2() makes newfd (new file descriptor) be the copy of oldfd (old file descriptor), closing newfd first if necessary.
|
||||||
|
|
||||||
|
//here we are copying the STDOUT file descriptor into our output pipe's file descriptor
|
||||||
|
//this is so we can write the strings back to STDOUT, so it can show up on the xcode console
|
||||||
|
dup2(STDOUT_FILENO, outputPipe.fileHandleForWriting.fileDescriptor)
|
||||||
|
|
||||||
|
//In this case, the newFileDescriptor is the pipe's file descriptor and the old file descriptor is STDOUT_FILENO and STDERR_FILENO
|
||||||
|
|
||||||
|
dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDOUT_FILENO)
|
||||||
|
dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDERR_FILENO)
|
||||||
|
|
||||||
|
//listen in to the readHandle notification
|
||||||
|
NotificationCenter.default.addObserver(self, selector: #selector(self.handlePipeNotification), name: FileHandle.readCompletionNotification, object: pipeReadHandle)
|
||||||
|
|
||||||
|
//state that you want to be notified of any data coming across the pipe
|
||||||
|
pipeReadHandle.readInBackgroundAndNotify()
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func handlePipeNotification(notification: Notification) {
|
||||||
|
//note you have to continuously call this when you get a message
|
||||||
|
//see this from documentation:
|
||||||
|
//Note that this method does not cause a continuous stream of notifications to be sent. If you wish to keep getting notified, you’ll also need to call readInBackgroundAndNotify() in your observer method.
|
||||||
|
inputPipe.fileHandleForReading.readInBackgroundAndNotify()
|
||||||
|
|
||||||
|
if let userInfo = notification.userInfo,
|
||||||
|
let data = userInfo[NSFileHandleNotificationDataItem] as? Data,
|
||||||
|
let str = String(data: data, encoding: String.Encoding.ascii) {
|
||||||
|
|
||||||
|
contents += str
|
||||||
|
|
||||||
|
//write the data back into the output pipe. the output pipe's write file descriptor points to STDOUT. this allows the logs to show up on the xcode console
|
||||||
|
outputPipe.fileHandleForWriting.write(data)
|
||||||
|
|
||||||
|
// `str` here is the log/contents of the print statement
|
||||||
|
//if you would like to route your print statements to the UI: make
|
||||||
|
//sure to subscribe to this notification in your VC and update the UITextView.
|
||||||
|
//Or if you wanted to send your print statements to the server, then
|
||||||
|
//you could do this in your notification handler in the app delegate.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,6 +38,7 @@
|
||||||
B576FE1D21E28EF70016B39D /* URLSessionDataTaskMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576FE1C21E28EF70016B39D /* URLSessionDataTaskMock.swift */; };
|
B576FE1D21E28EF70016B39D /* URLSessionDataTaskMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576FE1C21E28EF70016B39D /* URLSessionDataTaskMock.swift */; };
|
||||||
B576FE2821E423E60016B39D /* Dictionary+StringOrEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576FE2721E423E60016B39D /* Dictionary+StringOrEmpty.swift */; };
|
B576FE2821E423E60016B39D /* Dictionary+StringOrEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576FE2721E423E60016B39D /* Dictionary+StringOrEmpty.swift */; };
|
||||||
B576FE2A21E4240B0016B39D /* AppInfoFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576FE2921E4240B0016B39D /* AppInfoFormatter.swift */; };
|
B576FE2A21E4240B0016B39D /* AppInfoFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576FE2921E4240B0016B39D /* AppInfoFormatter.swift */; };
|
||||||
|
B576FE2C21E42A230016B39D /* OutputListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576FE2B21E42A230016B39D /* OutputListener.swift */; };
|
||||||
B5793E29219BDD4800135B39 /* JSON in Resources */ = {isa = PBXBuildFile; fileRef = B5793E28219BDD4800135B39 /* JSON */; };
|
B5793E29219BDD4800135B39 /* JSON in Resources */ = {isa = PBXBuildFile; fileRef = B5793E28219BDD4800135B39 /* JSON */; };
|
||||||
B588CE0221DC89490047D305 /* ExternalCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = B588CE0121DC89490047D305 /* ExternalCommand.swift */; };
|
B588CE0221DC89490047D305 /* ExternalCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = B588CE0121DC89490047D305 /* ExternalCommand.swift */; };
|
||||||
B588CE0421DC8AFB0047D305 /* TrashCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = B588CE0321DC8AFB0047D305 /* TrashCommand.swift */; };
|
B588CE0421DC8AFB0047D305 /* TrashCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = B588CE0321DC8AFB0047D305 /* TrashCommand.swift */; };
|
||||||
|
@ -219,6 +220,7 @@
|
||||||
B576FE1C21E28EF70016B39D /* URLSessionDataTaskMock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLSessionDataTaskMock.swift; sourceTree = "<group>"; };
|
B576FE1C21E28EF70016B39D /* URLSessionDataTaskMock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLSessionDataTaskMock.swift; sourceTree = "<group>"; };
|
||||||
B576FE2721E423E60016B39D /* Dictionary+StringOrEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+StringOrEmpty.swift"; sourceTree = "<group>"; };
|
B576FE2721E423E60016B39D /* Dictionary+StringOrEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+StringOrEmpty.swift"; sourceTree = "<group>"; };
|
||||||
B576FE2921E4240B0016B39D /* AppInfoFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfoFormatter.swift; sourceTree = "<group>"; };
|
B576FE2921E4240B0016B39D /* AppInfoFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfoFormatter.swift; sourceTree = "<group>"; };
|
||||||
|
B576FE2B21E42A230016B39D /* OutputListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutputListener.swift; sourceTree = "<group>"; };
|
||||||
B5793E28219BDD4800135B39 /* JSON */ = {isa = PBXFileReference; lastKnownFileType = folder; path = JSON; sourceTree = "<group>"; };
|
B5793E28219BDD4800135B39 /* JSON */ = {isa = PBXFileReference; lastKnownFileType = folder; path = JSON; sourceTree = "<group>"; };
|
||||||
B588CE0121DC89490047D305 /* ExternalCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalCommand.swift; sourceTree = "<group>"; };
|
B588CE0121DC89490047D305 /* ExternalCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalCommand.swift; sourceTree = "<group>"; };
|
||||||
B588CE0321DC8AFB0047D305 /* TrashCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrashCommand.swift; sourceTree = "<group>"; };
|
B588CE0321DC8AFB0047D305 /* TrashCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrashCommand.swift; sourceTree = "<group>"; };
|
||||||
|
@ -638,6 +640,7 @@
|
||||||
B576FE0A21E116470016B39D /* Network */,
|
B576FE0A21E116470016B39D /* Network */,
|
||||||
B576FE1821E28E460016B39D /* Nimble */,
|
B576FE1821E28E460016B39D /* Nimble */,
|
||||||
B576FE2621E29DD90016B39D /* SupportingFiles */,
|
B576FE2621E29DD90016B39D /* SupportingFiles */,
|
||||||
|
B576FE2B21E42A230016B39D /* OutputListener.swift */,
|
||||||
);
|
);
|
||||||
path = MasKitTests;
|
path = MasKitTests;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -932,6 +935,7 @@
|
||||||
B576FDF321E03B780016B39D /* MasStoreSearchSpec.swift in Sources */,
|
B576FDF321E03B780016B39D /* MasStoreSearchSpec.swift in Sources */,
|
||||||
B576FE0C21E116590016B39D /* NetworkManagerTests.swift in Sources */,
|
B576FE0C21E116590016B39D /* NetworkManagerTests.swift in Sources */,
|
||||||
B576FE1B21E28E8A0016B39D /* NetworkSessionMock.swift in Sources */,
|
B576FE1B21E28E8A0016B39D /* NetworkSessionMock.swift in Sources */,
|
||||||
|
B576FE2C21E42A230016B39D /* OutputListener.swift in Sources */,
|
||||||
B576FE1221E1D82D0016B39D /* NetworkSessionMockFromFile.swift in Sources */,
|
B576FE1221E1D82D0016B39D /* NetworkSessionMockFromFile.swift in Sources */,
|
||||||
B5DBF81321DEEC7C00F3B151 /* OpenCommandSpec.swift in Sources */,
|
B5DBF81321DEEC7C00F3B151 /* OpenCommandSpec.swift in Sources */,
|
||||||
B5DBF81721E02E3400F3B151 /* OpenSystemCommandMock.swift in Sources */,
|
B5DBF81721E02E3400F3B151 /* OpenSystemCommandMock.swift in Sources */,
|
||||||
|
|
Loading…
Add table
Reference in a new issue