app-store
App Store optimization and marketing skills for descriptions, screenshots, keywords, review responses, and comprehensive promotional strategy. Use when user…
Generate cross-module test harness with mock servers, in-memory stores, and test configuration. Use when testing networking + persistence + business logic together.
$ npx -y skills add rshankras/claude-code-apple-skills --skill integration-test-scaffold --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/integration-test-scaffoldContext preview
The summary Claude sees to decide when to auto-load this skill.
Generate cross-module test harness with mock servers, in-memory stores, and test configuration. Use when testing networking + persistence + business logic together.
name: integration-test-scaffold description: Generate cross-module test harness with mock servers, in-memory stores, and test configuration. Use when testing networking + persistence + business logic together. allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion] last_verified: 2026-07-16 review_by: 2027-06-22
Generate test infrastructure for testing multiple modules working together — networking + persistence + business logic — without hitting real servers or databases.
Use this skill when the user:
Unit tests: Test ONE thing in isolation (fast, focused)
Integration tests: Test MULTIPLE things together (realistic, catches wiring bugs)
Unit test passes: PriceCalculator works alone ✅
Integration test: PriceCalculator + API + Cache work together ✅
(Catches: wrong data format, missing mapping, race conditions)Identify what modules interact:
Grep: "import |@testable import" to find module dependencies Read: source files to understand data flow
Common integration boundaries:
Ask via AskUserQuestion:
1. **What layers to integrate?**
2. **Mock strategy?**
// Tests/Infrastructure/MockURLProtocol.swift
final class MockURLProtocol: URLProtocol {
/// Map of URL path → (status code, response data)
static var mockResponses: [String: (Int, Data)] = [:]
/// Captured requests for verification
static var capturedRequests: [URLRequest] = []
/// Simulated delay
static var responseDelay: TimeInterval = 0
static func reset() {
mockResponses = [:]
capturedRequests = []
responseDelay = 0
}
override class func canInit(with request: URLRequest) -> Bool {
true // Intercept all requests
}
override class func canonicalRequest(for request: URLRequest) -> URLRequest {
request
}
override func startLoading() {
Self.capturedRequests.append(request)
let path = request.url?.path ?? ""
let (statusCode, data) = Self.mockResponses[path] ?? (404, Data())
let response = HTTPURLResponse(
url: request.url!,
statusCode: statusCode,
httpVersion: nil,
headerFields: ["Content-Type": "application/json"]
)!
if Self.responseDelay > 0 {
Thread.sleep(forTimeInterval: Self.responseDelay)
}
client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)
client?.urlProtocol(self, didLoad: data)
client?.urlProtocolDidFinishLoading(self)
}
override func stopLoading() {}
}// Tests/Infrastructure/MockServer.swift
struct MockServer {
/// Register a successful JSON response for a path
static func respondWith<T: Encodable>(
_ value: T,
for path: String,
statusCode: Int = 200
) {
let data = try! JSONEncoder().encode(value)
MockURLProtocol.mockResponses[path] = (statusCode, data)
}
/// Register a raw data response
static func respondWith(
data: Data,
for path: String,
statusCode: Int = 200
) {
MockURLProtocol.mockResponses[path] = (statusCode, data)
}
/// Register an error response
static func respondWithError(
for path: String,
statusCode: Int = 500
) {
let error = ["error": "Server Error"]
let data = try! JSONEncoder().encode(error)
MockURLProtocol.mockResponses[path] = (statusCode, data)
}
/// Create a URLSession configured to use mock responses
static func session() -> URLSession {
let config = URLSessionConfiguration.ephemeral
config.protocolClasses = [MockURLProtocol.self]
return URLSession(configuration: config)
}
}// Tests/Infrastructure/InMemoryModelContainer.swift
import SwiftData
enum TestModelContainer {
@MainActor
static func create(for types: any PersistentModel.Type...) -> ModelContainer {
let schema = Schema(types)
let config = ModelConfiguration(isStoredInMemoryOnly: true)
return try! ModelContainer(for: schema, configurations: config)
}
}
// Usage in tests:
@Test("saves and fetches items")
@MainActor
func savesAndFetches() async throws {
let container = TestModelContainer.create(for: Item.self)
let context = container.mainContext
let item = Item(title: "Test")
context.insert(item)
try context.save()
let fetched = try context.fetch(FetchDescriptor<Item>())
#expect(fetched.count == 1)
}// Tests/Infrastructure/MockUserDefaults.swift
final class MockUserDefaults: UserDefaults {
private var storage: [String: Any] = [:]
override func object(forKey defaultName: String) -> Any? {
storage[defaultName]
}
override func set(_ value: Any?, forKey defaultName: StringA collection of Claude Code skills for iOS, macOS, watchOS, visionOS, and Apple platform development. These skills help you plan and build apps, maintain code quality, ensure HIG compliance, and guide you from idea to App Store.
Repo: rshankras/claude-code-apple-skills
App Store optimization and marketing skills for descriptions, screenshots, keywords, review responses, and comprehensive promotional strategy. Use when user…
Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under…
Generate compelling App Store descriptions that convert browsers into users. Use when writing initial descriptions, improving existing copy, or drafting…
Apple Search Ads campaign strategy for indie developers — paid acquisition, keyword bidding, budget planning, and ROAS optimization. Use when user asks about…
Take a one-time in-app purchase from MISSING_METADATA to READY_TO_SUBMIT in App Store Connect — set its price schedule and localized display name/description…
Optimize app title, subtitle, and keywords for maximum App Store discoverability. Use when launching a new app, improving search rankings, entering new…