Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ struct CustomPostEditorServiceTests {

// MARK: - New Post Tests

@Test("applyLocally updates PostCreateParams for new posts")
func applyLocallyUpdatesCreateParamsForNewPost() throws {
@Test("applyLocally updates settings for new posts")
func applyLocallyUpdatesSettingsForNewPost() throws {
// Given
let context = ContextManager.forTesting().mainContext
let blog = BlogBuilder(context).build()
Expand Down Expand Up @@ -151,29 +151,20 @@ struct CustomPostEditorServiceTests {
#expect(service.hasSettingsChanges == true)
}

// MARK: - initialParams Tests
// MARK: - initialSettings Tests

@Test("init with initialParams uses provided params instead of defaults")
func initWithInitialParamsUsesProvidedParams() throws {
@Test("init with initialSettings uses provided settings instead of defaults")
func initWithInitialSettingsUsesProvidedSettings() throws {
let context = ContextManager.forTesting().mainContext
let blog = BlogBuilder(context).build()

var params = PostCreateParams(meta: nil)
params.status = .draft
params.title = "Copied Title"
params.content = "Copied Content"
params.categories = [TermId(5)]
var settings = PostSettings()
settings.categoryIDs = [5]

let service = try makeService(blog: blog, post: nil, initialParams: params)
let service = try makeService(blog: blog, post: nil, initialSettings: settings)

// PostSettings does not store title/content (those are managed by the
// Gutenberg editor), so verify via categoryIDs which PostSettings does map.
#expect(service.settings.categoryIDs == [5])
// Also verify via the test-only inspection method that the full params
// are stored, including title and content.
let storedParams = service.inspectCreateParams()
#expect(storedParams?.title == "Copied Title")
#expect(storedParams?.content == "Copied Content")
#expect(service.inspectNewPostSettings()?.categoryIDs == [5])
}
}

Expand All @@ -182,7 +173,7 @@ struct CustomPostEditorServiceTests {
private func makeService(
blog: Blog,
post: AnyPostWithEditContext?,
initialParams: PostCreateParams? = nil
initialSettings: PostSettings? = nil
) throws -> CustomPostEditorService {
let api = try WordPressAPI(
urlSession: .shared,
Expand All @@ -204,7 +195,7 @@ private func makeService(
details: makePostTypeDetails(),
client: client,
wpService: wpService,
initialParams: initialParams
initialSettings: initialSettings
)
}

Expand Down
134 changes: 28 additions & 106 deletions Tests/KeystoneTests/Tests/Features/Posts/PostSettingsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -869,17 +869,15 @@ struct PostSettingsTests {
#expect(term1 != term3, "Same id 0, different name — different unresolved term")
}

// MARK: - PostCreateParams Custom Terms Tests
// MARK: - makeCreateParameters Tests

@Test("makeCreateParameters includes custom taxonomy terms in additionalFields")
func testMakeCreateParametersIncludesCustomTerms() {
// Given
let taxonomies = [
SiteTaxonomy.makeTaxonomy(slug: "genre", restBase: "genre")
]
let existing = PostCreateParams(meta: nil)

var settings = PostSettings(from: existing, taxonomies: taxonomies)
var settings = PostSettings()
settings.otherTerms = [
"genre": [
PostSettings.Term(id: 10, name: "fiction"),
Expand All @@ -888,123 +886,47 @@ struct PostSettingsTests {
]

// When
let params = settings.makeCreateParameters(from: existing, taxonomies: taxonomies)
let params = settings.makeCreateParameters(taxonomies: taxonomies)

// Then
let termIds = params.additionalFields?.termIdsForKey(key: "genre") ?? []
#expect(Set(termIds) == Set([TermId(10), TermId(20)]))
}

@Test("init(from: PostCreateParams) populates otherTerms from additionalFields")
func testInitFromCreateParamsReadsCustomTerms() {
// Given
let taxonomies = [
SiteTaxonomy.makeTaxonomy(slug: "genre", restBase: "genre")
]
let termMap: [String: [TermId]] = ["genre": [TermId(10), TermId(20)]]
let params = PostCreateParams(
meta: nil,
additionalFields: WpAdditionalFields.fromTermIdMap(map: termMap)
)

// When
let settings = PostSettings(from: params, taxonomies: taxonomies)

// Then
#expect(
settings.otherTerms["genre"] == [
PostSettings.Term(id: 10, name: ""),
PostSettings.Term(id: 20, name: "")
]
)
}

@Test("init(from: PostCreateParams) populates parentPageID")
func testInitFromCreateParamsReadsParent() {
// Given
var params = PostCreateParams(meta: nil)
params.parent = PostId(42)

// When
let settings = PostSettings(from: params)

// Then
#expect(settings.parentPageID == 42)
}

@Test("PostCreateParams parent survives round-trip through PostSettings")
func testParentRoundTripThroughPostSettings() {
// Given
var params = PostCreateParams(meta: nil)
params.parent = PostId(42)

// When
let settings = PostSettings(from: params)
let outputParams = settings.makeCreateParameters(from: .init(meta: nil), taxonomies: [])
// MARK: - defaults(from: Blog) Tests

// Then
#expect(outputParams.parent == PostId(42))
}

@Test("init(from: PostCreateParams) defaults status to draft when nil")
func testInitFromCreateParamsDefaultsStatusToDraft() {
// Given
let params = PostCreateParams(meta: nil)

// When
let settings = PostSettings(from: params)

// Then
#expect(settings.status == .draft)
#expect(settings.publishDate == nil)
}

@Test("init(from: PostCreateParams) reads scheduled status and date")
func testInitFromCreateParamsReadsScheduledStatus() {
// Given
var params = PostCreateParams(meta: nil)
params.status = .future
let scheduledDate = Date(timeIntervalSince1970: 2_000_000_000)
params.dateGmt = scheduledDate
@Test("defaults inherits site discussion defaults (closed)")
func testDefaultsInheritsClosedDiscussion() {
let context = ContextManager.forTesting().mainContext
let blog = BlogBuilder(context).with(siteName: "Test").build()
blog.settings?.commentsAllowed = false
blog.settings?.pingbackInboundEnabled = false

// When
let settings = PostSettings(from: params)
let settings = PostSettings.defaults(from: blog)
let params = settings.makeCreateParameters(taxonomies: [])

// Then
#expect(settings.status == .scheduled)
#expect(settings.publishDate == scheduledDate)
#expect(!settings.allowComments)
#expect(!settings.allowPings)
#expect(params.commentStatus == .closed)
#expect(params.pingStatus == .closed)
}

@Test("init(from: PostCreateParams) reads pending status with nil date")
func testInitFromCreateParamsReadsPendingStatus() {
// Given
var params = PostCreateParams(meta: nil)
params.status = .pending
@Test("defaults inherits site discussion defaults (open)")
func testDefaultsInheritsOpenDiscussion() {
let context = ContextManager.forTesting().mainContext
let blog = BlogBuilder(context).with(siteName: "Test").build()
blog.settings?.commentsAllowed = true
blog.settings?.pingbackInboundEnabled = true

// When
let settings = PostSettings(from: params)
let settings = PostSettings.defaults(from: blog)
let params = settings.makeCreateParameters(taxonomies: [])

// Then
#expect(settings.status == .pending)
#expect(settings.publishDate == nil)
#expect(settings.allowComments)
#expect(settings.allowPings)
#expect(params.commentStatus == .open)
#expect(params.pingStatus == .open)
}

@Test("PostCreateParams status and date survive round-trip through PostSettings")
func testStatusAndDateRoundTripThroughPostSettings() {
// Given
var params = PostCreateParams(meta: nil)
params.status = .future
let scheduledDate = Date(timeIntervalSince1970: 2_000_000_000)
params.dateGmt = scheduledDate

// When
let settings = PostSettings(from: params)
let outputParams = settings.makeCreateParameters(from: .init(meta: nil), taxonomies: [])

// Then
#expect(outputParams.status == .future)
#expect(outputParams.dateGmt == scheduledDate)
}
}

// MARK: - Test Helpers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ struct CustomPostEditor: View {
let post: AnyPostWithEditContext?
let details: PostTypeDetailsWithEditContext
let blog: Blog
let initialParams: PostCreateParams?
let initialSettings: PostSettings?
let initialContent: EditorContent?

var body: some View {
ViewControllerWrapper(
Expand All @@ -20,7 +21,8 @@ struct CustomPostEditor: View {
post: post,
details: details,
blog: blog,
initialParams: initialParams
initialSettings: initialSettings,
initialContent: initialContent
)
.ignoresSafeArea()
}
Expand All @@ -32,7 +34,8 @@ private struct ViewControllerWrapper: UIViewControllerRepresentable {
let post: AnyPostWithEditContext?
let details: PostTypeDetailsWithEditContext
let blog: Blog
let initialParams: PostCreateParams?
let initialSettings: PostSettings?
let initialContent: EditorContent?

@Environment(\.dismiss)
var dismiss: DismissAction
Expand All @@ -44,7 +47,8 @@ private struct ViewControllerWrapper: UIViewControllerRepresentable {
client: client,
post: post,
details: details,
initialParams: initialParams
initialSettings: initialSettings,
initialContent: initialContent
) {
dismiss()
}
Expand Down
Loading