From ec857a8108a2886b11343c1b83ecf794badc47ce Mon Sep 17 00:00:00 2001 From: root Date: Sat, 28 Feb 2026 12:10:19 +0530 Subject: [PATCH 1/7] added duplicate clause in move.py --- wp1/logic/move.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wp1/logic/move.py b/wp1/logic/move.py index f2fdff6d0..cecf2de0b 100644 --- a/wp1/logic/move.py +++ b/wp1/logic/move.py @@ -33,6 +33,9 @@ def insert(wp10db, move): VALUES (%(m_timestamp)s, %(m_old_namespace)s, %(m_old_article)s, %(m_new_namespace)s, %(m_new_article)s) + ON DUPLICATE KEY UPDATE + m_new_namespace = %(m_new_namespace)s, + m_new_article = %(m_new_article)s """, attr.asdict(move), ) From 079e70c5082980bb386d7df929414ae35173cefc Mon Sep 17 00:00:00 2001 From: Balaji Date: Fri, 6 Mar 2026 00:17:47 +0530 Subject: [PATCH 2/7] Add failing test for the added ON DUPLICATE clause --- wp1/logic/move_test.py | 54 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 wp1/logic/move_test.py diff --git a/wp1/logic/move_test.py b/wp1/logic/move_test.py new file mode 100644 index 000000000..2d2d80f5c --- /dev/null +++ b/wp1/logic/move_test.py @@ -0,0 +1,54 @@ +import unittest + +from wp1.base_db_test import BaseWpOneDbTest +from wp1.logic import move as logic_move +from wp1.models.wp10.move import Move + + +class LogicMoveTest(BaseWpOneDbTest): + + def setUp(self): + super().setUp() + self.move1 = Move( + m_timestamp=b"20200101000000\x00\x00\x00\x00\x00\x00", + m_old_namespace=0, + m_old_article=b"Old_Article_1", + m_new_namespace=0, + m_new_article=b"New_Article_1", + ) + + def test_insert_duplicate_key_update(self): + logic_move.insert(self.wp10db, self.move1) + self.wp10db.commit() + + inserted_move = logic_move.get_move( + self.wp10db, + self.move1.m_timestamp, + self.move1.m_old_namespace, + self.move1.m_old_article, + ) + self.assertIsNotNone(inserted_move) + self.assertEqual(inserted_move.m_new_namespace, 0) + self.assertEqual(inserted_move.m_new_article, b"New_Article_1") + + #add duplicate row + move2 = Move( + m_timestamp=self.move1.m_timestamp, + m_old_namespace=self.move1.m_old_namespace, + m_old_article=self.move1.m_old_article, + m_new_namespace=1, + m_new_article=b"Different_Article", + ) + logic_move.insert(self.wp10db, move2) + self.wp10db.commit() + + # Verify the record was updated, not duplicated + updated_move = logic_move.get_move( + self.wp10db, + self.move1.m_timestamp, + self.move1.m_old_namespace, + self.move1.m_old_article, + ) + self.assertIsNotNone(updated_move) + self.assertEqual(updated_move.m_new_namespace, 1) + self.assertEqual(updated_move.m_new_article, b"Different_Article") From 51d26738394752d7e3f39fe4c4d829218fcb785c Mon Sep 17 00:00:00 2001 From: Balaji Arunachalam Date: Mon, 23 Mar 2026 19:22:29 +0530 Subject: [PATCH 3/7] fixed tests --- wp1/logic/move_test.py | 58 ++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/wp1/logic/move_test.py b/wp1/logic/move_test.py index 2d2d80f5c..e6e876fe6 100644 --- a/wp1/logic/move_test.py +++ b/wp1/logic/move_test.py @@ -7,35 +7,24 @@ class LogicMoveTest(BaseWpOneDbTest): - def setUp(self): - super().setUp() - self.move1 = Move( - m_timestamp=b"20200101000000\x00\x00\x00\x00\x00\x00", - m_old_namespace=0, - m_old_article=b"Old_Article_1", - m_new_namespace=0, - m_new_article=b"New_Article_1", - ) - def test_insert_duplicate_key_update(self): - logic_move.insert(self.wp10db, self.move1) + # Insert initial data using raw SQL + with self.wp10db.cursor() as cursor: + cursor.execute( + """INSERT INTO moves + (m_timestamp, m_old_namespace, m_old_article, + m_new_namespace, m_new_article) + VALUES (%s, %s, %s, %s, %s)""", + (b"20200101000000\x00\x00\x00\x00\x00\x00", + 0, b"Old_Article_1", 0, b"New_Article_1"), + ) self.wp10db.commit() - inserted_move = logic_move.get_move( - self.wp10db, - self.move1.m_timestamp, - self.move1.m_old_namespace, - self.move1.m_old_article, - ) - self.assertIsNotNone(inserted_move) - self.assertEqual(inserted_move.m_new_namespace, 0) - self.assertEqual(inserted_move.m_new_article, b"New_Article_1") - - #add duplicate row + # Insert duplicate row using the code under test move2 = Move( - m_timestamp=self.move1.m_timestamp, - m_old_namespace=self.move1.m_old_namespace, - m_old_article=self.move1.m_old_article, + m_timestamp=b"20200101000000\x00\x00\x00\x00\x00\x00", + m_old_namespace=0, + m_old_article=b"Old_Article_1", m_new_namespace=1, m_new_article=b"Different_Article", ) @@ -43,12 +32,15 @@ def test_insert_duplicate_key_update(self): self.wp10db.commit() # Verify the record was updated, not duplicated - updated_move = logic_move.get_move( - self.wp10db, - self.move1.m_timestamp, - self.move1.m_old_namespace, - self.move1.m_old_article, - ) + with self.wp10db.cursor() as cursor: + cursor.execute( + """SELECT * FROM moves + WHERE m_timestamp = %s + AND m_old_namespace = %s + AND m_old_article = %s""", + (b"20200101000000\x00\x00\x00\x00\x00\x00", 0, b"Old_Article_1"), + ) + updated_move = cursor.fetchone() self.assertIsNotNone(updated_move) - self.assertEqual(updated_move.m_new_namespace, 1) - self.assertEqual(updated_move.m_new_article, b"Different_Article") + self.assertEqual(updated_move["m_new_namespace"], 1) + self.assertEqual(updated_move["m_new_article"], b"Different_Article") From 8125390241cabeeb688e1b20bdde0f44ce681590 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 28 Feb 2026 12:10:19 +0530 Subject: [PATCH 4/7] added duplicate clause in move.py --- wp1/logic/move.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wp1/logic/move.py b/wp1/logic/move.py index f2fdff6d0..cecf2de0b 100644 --- a/wp1/logic/move.py +++ b/wp1/logic/move.py @@ -33,6 +33,9 @@ def insert(wp10db, move): VALUES (%(m_timestamp)s, %(m_old_namespace)s, %(m_old_article)s, %(m_new_namespace)s, %(m_new_article)s) + ON DUPLICATE KEY UPDATE + m_new_namespace = %(m_new_namespace)s, + m_new_article = %(m_new_article)s """, attr.asdict(move), ) From c917f3153a41b72b8352c0cfcf644b9ff03feb56 Mon Sep 17 00:00:00 2001 From: Balaji Date: Fri, 6 Mar 2026 00:17:47 +0530 Subject: [PATCH 5/7] Add failing test for the added ON DUPLICATE clause --- wp1/logic/move_test.py | 54 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 wp1/logic/move_test.py diff --git a/wp1/logic/move_test.py b/wp1/logic/move_test.py new file mode 100644 index 000000000..2d2d80f5c --- /dev/null +++ b/wp1/logic/move_test.py @@ -0,0 +1,54 @@ +import unittest + +from wp1.base_db_test import BaseWpOneDbTest +from wp1.logic import move as logic_move +from wp1.models.wp10.move import Move + + +class LogicMoveTest(BaseWpOneDbTest): + + def setUp(self): + super().setUp() + self.move1 = Move( + m_timestamp=b"20200101000000\x00\x00\x00\x00\x00\x00", + m_old_namespace=0, + m_old_article=b"Old_Article_1", + m_new_namespace=0, + m_new_article=b"New_Article_1", + ) + + def test_insert_duplicate_key_update(self): + logic_move.insert(self.wp10db, self.move1) + self.wp10db.commit() + + inserted_move = logic_move.get_move( + self.wp10db, + self.move1.m_timestamp, + self.move1.m_old_namespace, + self.move1.m_old_article, + ) + self.assertIsNotNone(inserted_move) + self.assertEqual(inserted_move.m_new_namespace, 0) + self.assertEqual(inserted_move.m_new_article, b"New_Article_1") + + #add duplicate row + move2 = Move( + m_timestamp=self.move1.m_timestamp, + m_old_namespace=self.move1.m_old_namespace, + m_old_article=self.move1.m_old_article, + m_new_namespace=1, + m_new_article=b"Different_Article", + ) + logic_move.insert(self.wp10db, move2) + self.wp10db.commit() + + # Verify the record was updated, not duplicated + updated_move = logic_move.get_move( + self.wp10db, + self.move1.m_timestamp, + self.move1.m_old_namespace, + self.move1.m_old_article, + ) + self.assertIsNotNone(updated_move) + self.assertEqual(updated_move.m_new_namespace, 1) + self.assertEqual(updated_move.m_new_article, b"Different_Article") From 22e5bde5fddb0aa00c2dab13bd76beb2f6429b5e Mon Sep 17 00:00:00 2001 From: Balaji Arunachalam Date: Mon, 23 Mar 2026 19:22:29 +0530 Subject: [PATCH 6/7] fixed tests --- wp1/logic/move_test.py | 58 ++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/wp1/logic/move_test.py b/wp1/logic/move_test.py index 2d2d80f5c..e6e876fe6 100644 --- a/wp1/logic/move_test.py +++ b/wp1/logic/move_test.py @@ -7,35 +7,24 @@ class LogicMoveTest(BaseWpOneDbTest): - def setUp(self): - super().setUp() - self.move1 = Move( - m_timestamp=b"20200101000000\x00\x00\x00\x00\x00\x00", - m_old_namespace=0, - m_old_article=b"Old_Article_1", - m_new_namespace=0, - m_new_article=b"New_Article_1", - ) - def test_insert_duplicate_key_update(self): - logic_move.insert(self.wp10db, self.move1) + # Insert initial data using raw SQL + with self.wp10db.cursor() as cursor: + cursor.execute( + """INSERT INTO moves + (m_timestamp, m_old_namespace, m_old_article, + m_new_namespace, m_new_article) + VALUES (%s, %s, %s, %s, %s)""", + (b"20200101000000\x00\x00\x00\x00\x00\x00", + 0, b"Old_Article_1", 0, b"New_Article_1"), + ) self.wp10db.commit() - inserted_move = logic_move.get_move( - self.wp10db, - self.move1.m_timestamp, - self.move1.m_old_namespace, - self.move1.m_old_article, - ) - self.assertIsNotNone(inserted_move) - self.assertEqual(inserted_move.m_new_namespace, 0) - self.assertEqual(inserted_move.m_new_article, b"New_Article_1") - - #add duplicate row + # Insert duplicate row using the code under test move2 = Move( - m_timestamp=self.move1.m_timestamp, - m_old_namespace=self.move1.m_old_namespace, - m_old_article=self.move1.m_old_article, + m_timestamp=b"20200101000000\x00\x00\x00\x00\x00\x00", + m_old_namespace=0, + m_old_article=b"Old_Article_1", m_new_namespace=1, m_new_article=b"Different_Article", ) @@ -43,12 +32,15 @@ def test_insert_duplicate_key_update(self): self.wp10db.commit() # Verify the record was updated, not duplicated - updated_move = logic_move.get_move( - self.wp10db, - self.move1.m_timestamp, - self.move1.m_old_namespace, - self.move1.m_old_article, - ) + with self.wp10db.cursor() as cursor: + cursor.execute( + """SELECT * FROM moves + WHERE m_timestamp = %s + AND m_old_namespace = %s + AND m_old_article = %s""", + (b"20200101000000\x00\x00\x00\x00\x00\x00", 0, b"Old_Article_1"), + ) + updated_move = cursor.fetchone() self.assertIsNotNone(updated_move) - self.assertEqual(updated_move.m_new_namespace, 1) - self.assertEqual(updated_move.m_new_article, b"Different_Article") + self.assertEqual(updated_move["m_new_namespace"], 1) + self.assertEqual(updated_move["m_new_article"], b"Different_Article") From 0eda03a7238fea505d41e5ae4e1031702ab2dd18 Mon Sep 17 00:00:00 2001 From: Balaji Arunachalam Date: Tue, 24 Mar 2026 12:29:56 +0530 Subject: [PATCH 7/7] added black formatting --- wp1/logic/move_test.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/wp1/logic/move_test.py b/wp1/logic/move_test.py index e6e876fe6..b93db1063 100644 --- a/wp1/logic/move_test.py +++ b/wp1/logic/move_test.py @@ -15,8 +15,13 @@ def test_insert_duplicate_key_update(self): (m_timestamp, m_old_namespace, m_old_article, m_new_namespace, m_new_article) VALUES (%s, %s, %s, %s, %s)""", - (b"20200101000000\x00\x00\x00\x00\x00\x00", - 0, b"Old_Article_1", 0, b"New_Article_1"), + ( + b"20200101000000\x00\x00\x00\x00\x00\x00", + 0, + b"Old_Article_1", + 0, + b"New_Article_1", + ), ) self.wp10db.commit()