Version 2.1 #41

Merged
danieljsummers merged 123 commits from version-2.1 into main 2024-03-27 00:13:28 +00:00
9 changed files with 105 additions and 11 deletions
Showing only changes of commit 78c1c5e68e - Show all commits

View File

@ -314,7 +314,7 @@ type MarkupText =
/// An item of metadata
[<CLIMutable; NoComparison; NoEquality>]
[<CLIMutable>]
type MetaItem = {
/// The name of the metadata value
Name: string
@ -329,7 +329,7 @@ type MetaItem = {
/// A revision of a page or post
[<CLIMutable; NoComparison; NoEquality>]
[<CLIMutable>]
type Revision = {
/// When this revision was saved
AsOf: Instant

View File

@ -1,3 +1,6 @@
/// <summary>
/// Integration tests for <see cref="ICategoryData" /> implementations
/// </summary>
module CategoryDataTests
open Expecto

View File

@ -1,3 +1,6 @@
/// <summary>
/// Integration tests for <see cref="IPageData" /> implementations
/// </summary>
module PageDataTests
open System

View File

@ -0,0 +1,52 @@
/// <summary>
/// Integration tests for <see cref="IPostData" /> implementations
/// </summary>
module PostDataTests
open Expecto
open MyWebLog
open MyWebLog.Data
open NodaTime
/// The ID of the root web log
let rootId = WebLogId "uSitJEuD3UyzWC9jgOHc8g"
let ``Add succeeds`` (data: IData) = task {
let post =
{ Id = PostId "a-new-post"
WebLogId = WebLogId "test"
AuthorId = WebLogUserId "test-author"
Status = Published
Title = "A New Test Post"
Permalink = Permalink "2020/test-post.html"
PublishedOn = Some (Noda.epoch + Duration.FromMinutes 1L)
UpdatedOn = Noda.epoch + Duration.FromMinutes 3L
Template = Some "fancy"
Text = "<p>Test text here"
CategoryIds = [ CategoryId "a"; CategoryId "b" ]
Tags = [ "x"; "y"; "zed" ]
Episode = Some { Episode.Empty with Media = "test-ep.mp3" }
Metadata = [ { Name = "Meta"; Value = "Data" } ]
PriorPermalinks = [ Permalink "2020/test-post-a.html" ]
Revisions = [ { AsOf = Noda.epoch + Duration.FromMinutes 1L; Text = Html "<p>Test text here" } ] }
do! data.Post.Add post
let! stored = data.Post.FindFullById post.Id post.WebLogId
Expect.isSome stored "The added post should have been retrieved"
let it = stored.Value
Expect.equal it.Id post.Id "ID not saved properly"
Expect.equal it.WebLogId post.WebLogId "Web log ID not saved properly"
Expect.equal it.AuthorId post.AuthorId "Author ID not saved properly"
Expect.equal it.Status post.Status "Status not saved properly"
Expect.equal it.Title post.Title "Title not saved properly"
Expect.equal it.Permalink post.Permalink "Permalink not saved properly"
Expect.equal it.PublishedOn post.PublishedOn "Published On not saved properly"
Expect.equal it.UpdatedOn post.UpdatedOn "Updated On not saved properly"
Expect.equal it.Template post.Template "Template not saved properly"
Expect.equal it.Text post.Text "Text not saved properly"
Expect.equal it.CategoryIds post.CategoryIds "Category IDs not saved properly"
Expect.equal it.Tags post.Tags "Tags not saved properly"
Expect.equal it.Episode post.Episode "Episode not saved properly"
Expect.equal it.Metadata post.Metadata "Metadata items not saved properly"
Expect.equal it.PriorPermalinks post.PriorPermalinks "Prior permalinks not saved properly"
Expect.equal it.Revisions post.Revisions "Revisions not saved properly"
}

View File

@ -23,19 +23,19 @@ let mkData () =
/// The host for the PostgreSQL test database (defaults to localhost)
let testHost =
RethinkDbTests.env "PG_HOST" "localhost"
RethinkDbDataTests.env "PG_HOST" "localhost"
/// The database name for the PostgreSQL test database (defaults to postgres)
let testDb =
RethinkDbTests.env "PG_DB" "postgres"
RethinkDbDataTests.env "PG_DB" "postgres"
/// The user ID for the PostgreSQL test database (defaults to postgres)
let testUser =
RethinkDbTests.env "PG_USER" "postgres"
RethinkDbDataTests.env "PG_USER" "postgres"
/// The password for the PostgreSQL test database (defaults to postgres)
let testPw =
RethinkDbTests.env "PG_PW" "postgres"
RethinkDbDataTests.env "PG_PW" "postgres"
/// Create a fresh environment from the root backup
let freshEnvironment () = task {
@ -219,6 +219,15 @@ let pageTests = testList "Page" [
]
]
/// Integration tests for the Post implementation in PostgreSQL
let postTests = testList "Post" [
testTask "Add succeeds" {
// We'll need the root website categories restored for these tests
do! freshEnvironment ()
do! PostDataTests.``Add succeeds`` (mkData ())
}
]
/// Drop the throwaway PostgreSQL database
let environmentCleanUp = test "Clean Up" {
if db.IsSome then db.Value.Dispose()
@ -230,5 +239,6 @@ let all =
[ environmentSetUp
categoryTests
pageTests
postTests
environmentCleanUp ]
|> testSequenced

View File

@ -1,4 +1,4 @@
module RethinkDbTests
module RethinkDbDataTests
open System
open Expecto
@ -218,6 +218,15 @@ let pageTests = testList "Page" [
]
]
/// Integration tests for the Post implementation in RethinkDB
let postTests = testList "Post" [
testTask "Add succeeds" {
// We'll need the root website categories restored for these tests
do! freshEnvironment ()
do! PostDataTests.``Add succeeds`` data.Value
}
]
/// Drop the throwaway RethinkDB database
let environmentCleanUp = testTask "Clean Up" {
do! disposeData ()
@ -229,5 +238,6 @@ let all =
[ environmentSetUp
categoryTests
pageTests
postTests
environmentCleanUp ]
|> testSequenced

View File

@ -14,7 +14,7 @@ let ser = Json.configure (JsonSerializer.CreateDefault())
/// The test database name
let dbName =
RethinkDbTests.env "SQLITE_DB" "test-db.db"
RethinkDbDataTests.env "SQLITE_DB" "test-db.db"
/// Create a SQLiteData instance for testing
let mkData () =
@ -30,13 +30,17 @@ let dispose (data: IData) =
let freshEnvironment (data: IData option) = task {
let env =
match data with
| Some d -> d
| Some d ->
System.Console.WriteLine "Existing data"
d
| None ->
System.Console.WriteLine $"No data; deleting {dbName}"
File.Delete dbName
mkData ()
do! env.StartUp()
// This exercises Restore for all implementations; all tests are dependent on it working as expected
do! Maintenance.Backup.restoreBackup "root-weblog.json" None false false env
return env
}
/// Set up the environment for the SQLite tests
@ -284,6 +288,16 @@ let pageTests = testList "Page" [
]
]
/// Integration tests for the Post implementation in SQLite
let postTests = testList "Post" [
testTask "Add succeeds" {
// We'll need the root website categories restored for these tests
let! data = freshEnvironment None
try do! PostDataTests.``Add succeeds`` data
finally dispose data
}
]
/// Delete the SQLite database
let environmentCleanUp = test "Clean Up" {
File.Delete dbName
@ -296,5 +310,6 @@ let all =
[ environmentSetUp
categoryTests
pageTests
postTests
environmentCleanUp ]
|> testSequenced

View File

@ -12,7 +12,8 @@
<Compile Include="Data\UtilsTests.fs" />
<Compile Include="Data\CategoryDataTests.fs" />
<Compile Include="Data\PageDataTests.fs" />
<Compile Include="Data\RethinkDbTests.fs" />
<Compile Include="Data\PostDataTests.fs" />
<Compile Include="Data\RethinkDbDataTests.fs" />
<Compile Include="Data\SQLiteDataTests.fs" />
<Compile Include="Data\PostgresDataTests.fs" />
<Compile Include="Program.fs" />

View File

@ -5,7 +5,7 @@ let allTests = testList "MyWebLog" [
testList "Data" [
ConvertersTests.all
UtilsTests.all
RethinkDbTests.all
RethinkDbDataTests.all
SQLiteDataTests.all
PostgresDataTests.all
]