66//! OpenAPI document. These are "blessed" documents that are checked into git
77//! and must remain stable across changes.
88
9- use anyhow:: Result ;
9+ use anyhow:: { Context , Result } ;
1010use dropshot_api_manager:: test_util:: { CheckResult , check_apis_up_to_date} ;
1111use integration_tests:: common:: {
1212 create_versioned_health_test_apis_incompatible,
@@ -21,18 +21,36 @@ fn test_versioned_generate_basic() -> Result<()> {
2121 let apis = create_versioned_health_test_apis ( ) ?;
2222
2323 // Initially, no documents should exist.
24- assert ! ( !env. versioned_local_document_exists( "versioned-health" , "1.0.0" ) ) ;
25- assert ! ( !env. versioned_local_document_exists( "versioned-health" , "2.0.0" ) ) ;
26- assert ! ( !env. versioned_local_document_exists( "versioned-health" , "3.0.0" ) ) ;
24+ assert ! (
25+ !env. versioned_local_document_exists( "versioned-health" , "1.0.0" )
26+ . unwrap( )
27+ ) ;
28+ assert ! (
29+ !env. versioned_local_document_exists( "versioned-health" , "2.0.0" )
30+ . unwrap( )
31+ ) ;
32+ assert ! (
33+ !env. versioned_local_document_exists( "versioned-health" , "3.0.0" )
34+ . unwrap( )
35+ ) ;
2736 assert ! ( !env. versioned_latest_document_exists( "versioned-health" ) ) ;
2837
2938 // Generate the documents.
3039 env. generate_documents ( & apis) ?;
3140
3241 // Now the version documents should exist.
33- assert ! ( env. versioned_local_document_exists( "versioned-health" , "1.0.0" ) ) ;
34- assert ! ( env. versioned_local_document_exists( "versioned-health" , "2.0.0" ) ) ;
35- assert ! ( env. versioned_local_document_exists( "versioned-health" , "3.0.0" ) ) ;
42+ assert ! (
43+ env. versioned_local_document_exists( "versioned-health" , "1.0.0" )
44+ . unwrap( )
45+ ) ;
46+ assert ! (
47+ env. versioned_local_document_exists( "versioned-health" , "2.0.0" )
48+ . unwrap( )
49+ ) ;
50+ assert ! (
51+ env. versioned_local_document_exists( "versioned-health" , "3.0.0" )
52+ . unwrap( )
53+ ) ;
3654 assert ! ( env. versioned_latest_document_exists( "versioned-health" ) ) ;
3755
3856 // Read and validate one of the documents is valid JSON.
@@ -135,15 +153,30 @@ fn test_multiple_versioned_apis() -> Result<()> {
135153
136154 // Check that documents exist for both APIs and all their versions.
137155 // Versioned health API (3 versions).
138- assert ! ( env. versioned_local_document_exists( "versioned-health" , "1.0.0" ) ) ;
139- assert ! ( env. versioned_local_document_exists( "versioned-health" , "2.0.0" ) ) ;
140- assert ! ( env. versioned_local_document_exists( "versioned-health" , "3.0.0" ) ) ;
156+ assert ! (
157+ env. versioned_local_document_exists( "versioned-health" , "1.0.0" )
158+ . unwrap( )
159+ ) ;
160+ assert ! (
161+ env. versioned_local_document_exists( "versioned-health" , "2.0.0" )
162+ . unwrap( )
163+ ) ;
164+ assert ! (
165+ env. versioned_local_document_exists( "versioned-health" , "3.0.0" )
166+ . unwrap( )
167+ ) ;
141168 assert ! ( env. versioned_latest_document_exists( "versioned-health" ) ) ;
142169
143170 // Versioned user API (3 versions).
144- assert ! ( env. versioned_local_document_exists( "versioned-user" , "1.0.0" ) ) ;
145- assert ! ( env. versioned_local_document_exists( "versioned-user" , "2.0.0" ) ) ;
146- assert ! ( env. versioned_local_document_exists( "versioned-user" , "3.0.0" ) ) ;
171+ assert ! (
172+ env. versioned_local_document_exists( "versioned-user" , "1.0.0" ) . unwrap( )
173+ ) ;
174+ assert ! (
175+ env. versioned_local_document_exists( "versioned-user" , "2.0.0" ) . unwrap( )
176+ ) ;
177+ assert ! (
178+ env. versioned_local_document_exists( "versioned-user" , "3.0.0" ) . unwrap( )
179+ ) ;
147180 assert ! ( env. versioned_latest_document_exists( "versioned-user" ) ) ;
148181
149182 // List all versioned documents for each API.
@@ -171,8 +204,13 @@ fn test_mixed_lockstep_and_versioned_apis() -> Result<()> {
171204 assert ! ( env. lockstep_document_exists( "counter" ) ) ;
172205
173206 // Check versioned APIs exist as version-specific files.
174- assert ! ( env. versioned_local_document_exists( "versioned-health" , "1.0.0" ) ) ;
175- assert ! ( env. versioned_local_document_exists( "versioned-user" , "1.0.0" ) ) ;
207+ assert ! (
208+ env. versioned_local_document_exists( "versioned-health" , "1.0.0" )
209+ . unwrap( )
210+ ) ;
211+ assert ! (
212+ env. versioned_local_document_exists( "versioned-user" , "1.0.0" ) . unwrap( )
213+ ) ;
176214
177215 // List all document files to verify proper structure.
178216 let all_files = env. list_document_files ( ) ?;
@@ -328,9 +366,27 @@ fn test_removing_api_version_fails_check() -> Result<()> {
328366 env. commit_documents ( ) ?;
329367
330368 // Verify all versions exist.
331- assert ! ( env. versioned_local_document_exists( "versioned-health" , "1.0.0" ) ) ;
332- assert ! ( env. versioned_local_document_exists( "versioned-health" , "2.0.0" ) ) ;
333- assert ! ( env. versioned_local_document_exists( "versioned-health" , "3.0.0" ) ) ;
369+ assert ! (
370+ env. versioned_local_and_blessed_document_exists(
371+ "versioned-health" ,
372+ "1.0.0"
373+ )
374+ . unwrap( )
375+ ) ;
376+ assert ! (
377+ env. versioned_local_and_blessed_document_exists(
378+ "versioned-health" ,
379+ "2.0.0"
380+ )
381+ . unwrap( )
382+ ) ;
383+ assert ! (
384+ env. versioned_local_and_blessed_document_exists(
385+ "versioned-health" ,
386+ "3.0.0"
387+ )
388+ . unwrap( )
389+ ) ;
334390
335391 // Create API with fewer versions (simulating version removal).
336392 let reduced_apis = create_versioned_health_test_apis_reduced_versions ( ) ?;
@@ -652,3 +708,68 @@ fn test_incompatible_blessed_api_change() -> Result<()> {
652708
653709 Ok ( ( ) )
654710}
711+
712+ /// Test BlessedVersionExtraLocalSpec problems.
713+ ///
714+ /// This test:
715+ ///
716+ /// * creates blessed versions
717+ /// * in a separate environment, creates another blessed version
718+ /// * copies over this extra version
719+ #[ test]
720+ fn test_blessed_version_extra_local_spec ( ) -> Result < ( ) > {
721+ let env = TestEnvironment :: new ( ) ?;
722+ let apis = create_versioned_health_test_apis ( ) ?;
723+
724+ // Generate and commit initial documents to make them blessed.
725+ env. generate_documents ( & apis) ?;
726+ env. commit_documents ( ) ?;
727+
728+ // Verify initial state is up-to-date.
729+ let result = check_apis_up_to_date ( env. environment ( ) , & apis) ?;
730+ assert_eq ! ( result, CheckResult :: Success ) ;
731+
732+ // Generate with the incompatible APIs.
733+ let env2 = TestEnvironment :: new ( ) ?;
734+ let incompatible_apis = create_versioned_health_test_apis_incompatible ( ) ?;
735+
736+ env2. generate_documents ( & incompatible_apis) ?;
737+
738+ // Ensure that the v3 documents are actually different between env and env2.
739+ let env_path = env
740+ . find_versioned_document_path ( "versioned-health" , "3.0.0" ) ?
741+ . expect ( "should find v3.0.0 document" ) ;
742+ let env2_path = env2
743+ . find_versioned_document_path ( "versioned-health" , "3.0.0" ) ?
744+ . expect ( "should find v3.0.0 document" ) ;
745+ assert_ne ! (
746+ env_path, env2_path,
747+ "incompatible APIs should lead to different hashes"
748+ ) ;
749+
750+ // Copy env2's document into env's documents directory.
751+ let src = env2. workspace_root ( ) . join ( & env2_path) ;
752+ let dst = env
753+ . documents_dir ( )
754+ . join ( "versioned-health" )
755+ . join ( env2_path. file_name ( ) . unwrap ( ) ) ;
756+
757+ std:: fs:: copy ( & src, & dst)
758+ . with_context ( || format ! ( "failed to copy {} to {}" , src, dst) ) ?;
759+ assert ! ( dst. exists( ) , "destination path {dst} exists" ) ;
760+
761+ let result = check_apis_up_to_date ( env. environment ( ) , & apis) ?;
762+ assert_eq ! ( result, CheckResult :: NeedsUpdate ) ;
763+
764+ // Regenerating documents should remove the file.
765+ env. generate_documents ( & apis) ?;
766+
767+ // After fix-up, should be up-to-date again.
768+ let result = check_apis_up_to_date ( env. environment ( ) , & apis) ?;
769+ assert_eq ! ( result, CheckResult :: Success ) ;
770+
771+ // The destination path should be missing now.
772+ assert ! ( !dst. exists( ) , "destination path {dst} no longer exists" ) ;
773+
774+ Ok ( ( ) )
775+ }
0 commit comments