@@ -136,6 +136,40 @@ def test_board_pin_write_file_raises_error(board, tmp_path):
136136 board .pin_write (path , "cool_pin" , type = "file" )
137137
138138
139+ @pytest .mark .parametrize ("force_identical_write" , [True , False ])
140+ def test_board_pin_write_force_identical_write_pincount (board , force_identical_write ):
141+ df = pd .DataFrame ({"x" : [1 , 2 , 3 ]})
142+
143+ # 1min ago to avoid name collision
144+ one_min_ago = datetime .now () - timedelta (minutes = 1 )
145+ board .pin_write (df , "cool_pin" , type = "csv" , created = one_min_ago )
146+ board .pin_write (
147+ df , "cool_pin" , type = "csv" , force_identical_write = force_identical_write
148+ )
149+ versions = board .pin_versions ("cool_pin" )
150+ if force_identical_write :
151+ assert len (versions ) == 2
152+ else :
153+ assert len (versions ) == 1
154+
155+
156+ def test_board_pin_write_force_identical_write_msg (
157+ board , capfd : pytest .CaptureFixture [str ]
158+ ):
159+ df = pd .DataFrame ({"x" : [1 , 2 , 3 ]})
160+
161+ # 1min ago to avoid name collision
162+ one_min_ago = datetime .now () - timedelta (minutes = 1 )
163+ board .pin_write (df , "cool_pin" , type = "csv" , created = one_min_ago )
164+ board .pin_write (df , "cool_pin" , type = "csv" )
165+ versions = board .pin_versions ("cool_pin" )
166+
167+ _ , err = capfd .readouterr ()
168+ msg = 'The hash of pin "cool_pin" has not changed. Your pin will not be stored.'
169+ assert msg in err
170+ assert len (versions ) == 1
171+
172+
139173def test_board_pin_download (board_with_cache , tmp_path ):
140174 # create and save data
141175 df = pd .DataFrame ({"x" : [1 , 2 , 3 ]})
@@ -309,6 +343,32 @@ def test_board_pin_read_insecure_succeed_board_flag(board):
309343# pin_write with unversioned boards ===========================================
310344
311345
346+ @pytest .mark .parametrize ("versioned" , [None , False ])
347+ def test_board_unversioned_pin_write_unversioned_force_identical_write (
348+ versioned , board_unversioned
349+ ):
350+ # 1min ago to avoid name collision
351+ one_min_ago = datetime .now () - timedelta (minutes = 1 )
352+ board_unversioned .pin_write (
353+ {"a" : 1 },
354+ "test_pin" ,
355+ type = "json" ,
356+ versioned = versioned ,
357+ created = one_min_ago ,
358+ force_identical_write = True ,
359+ )
360+ board_unversioned .pin_write (
361+ {"a" : 2 },
362+ "test_pin" ,
363+ type = "json" ,
364+ versioned = versioned ,
365+ force_identical_write = True ,
366+ )
367+
368+ assert len (board_unversioned .pin_versions ("test_pin" )) == 1
369+ assert board_unversioned .pin_read ("test_pin" ) == {"a" : 2 }
370+
371+
312372@pytest .mark .parametrize ("versioned" , [None , False ])
313373def test_board_unversioned_pin_write_unversioned (versioned , board_unversioned ):
314374 board_unversioned .pin_write ({"a" : 1 }, "test_pin" , type = "json" , versioned = versioned )
@@ -346,9 +406,14 @@ def pin_name():
346406
347407@pytest .fixture
348408def pin_del (board , df , pin_name ):
349- meta_old = board .pin_write (df , pin_name , type = "csv" , title = "some title" )
350- sleep (1 )
351- meta_new = board .pin_write (df , pin_name , type = "csv" , title = "some title" )
409+ # 1min ago to avoid name collision
410+ one_min_ago = datetime .now () - timedelta (minutes = 1 )
411+ meta_old = board .pin_write (
412+ df , pin_name , type = "csv" , title = "some title" , created = one_min_ago
413+ )
414+ meta_new = board .pin_write (
415+ df , pin_name , type = "csv" , title = "some title" , force_identical_write = True
416+ )
352417
353418 assert len (board .pin_versions (pin_name )) == 2
354419 assert meta_old .version .version != meta_new .version .version
@@ -363,8 +428,22 @@ def pin_prune(board, df, pin_name):
363428 two_days_ago = today - timedelta (days = 2 , minutes = 1 )
364429
365430 board .pin_write (df , pin_name , type = "csv" , title = "some title" , created = today )
366- board .pin_write (df , pin_name , type = "csv" , title = "some title" , created = day_ago )
367- board .pin_write (df , pin_name , type = "csv" , title = "some title" , created = two_days_ago )
431+ board .pin_write (
432+ df ,
433+ pin_name ,
434+ type = "csv" ,
435+ title = "some title" ,
436+ created = day_ago ,
437+ force_identical_write = True ,
438+ )
439+ board .pin_write (
440+ df ,
441+ pin_name ,
442+ type = "csv" ,
443+ title = "some title" ,
444+ created = two_days_ago ,
445+ force_identical_write = True ,
446+ )
368447
369448 versions = board .pin_versions (pin_name , as_df = False )
370449 assert len (versions ) == 3
@@ -573,7 +652,9 @@ def test_board_pin_search_admin_user(df, board_short, fs_admin): # noqa
573652@pytest .mark .fs_rsc
574653def test_board_rsc_pin_write_title_update (df , board_short ):
575654 board_short .pin_write (df , "susan/some_df" , type = "csv" , title = "title a" )
576- board_short .pin_write (df , "susan/some_df" , type = "csv" , title = "title b" )
655+ board_short .pin_write (
656+ df , "susan/some_df" , type = "csv" , title = "title b" , force_identical_write = True
657+ )
577658
578659 content = board_short .fs .info ("susan/some_df" )
579660 assert content ["title" ] == "title b"
0 commit comments