Repository: OpenRefine/OpenRefine (java)

Issue:
Improve how to indicate the data source following data extension
Currently a default OpenRefine-to-Wikibase workflow works well if users only reconcile data against a single service, e.g. Wikidata, and then proceed towards schema building and data upload with this single service. However, in reality - with the introduction of the possibility to reconcile against and upload data edits to any arbitrary Wikibase (and Wikimedia Commons, too) - users may wish to work across several services at once. For example, enriching (or extending) a dataset from one Wikibase with data from another, in addition to also including data from various other authority control sources (e.g. GND, Getty’s ULAN, VIAF, etc). Currently, however, once a data extension operation is carried out — there is no easy visual cue to a user to specify what source each column has been pulled from and - depending on the data type - also reconciled against, leading easily to making mistakes during schema building when users only see column titles and a green bar.

If data is pulled from Wikidata via reconciled values - the data can be shown to be reconciled to Wikidata with a little logo as per suggestion in this issue: #4824, but there is no way to tell users the **source** was **also** Wikidata. For that users proposed that prefixes are added to the column headers.

### Proposed solution
Add prefixes to column names to indicate where the data was pulled from. E.g. wmc: for Wikimedia Commons; wd: for Wikidata; wb: for any other Wikibase, etc. 

Example where some artworks are reconciled with Wikidata and then the 'collection' property values are pulled from Wikidata via data extension:
![Screenshot 2022-07-30 at 12 04 19](https://user-images.githubusercontent.com/25489750/181905512-2e038b05-168c-4098-9015-62d2640a3f72.png)

Example with data pulled from Commons:
![Screenshot 2022-07-24 at 00 28 17](https://user-images.githubusercontent.com/25489750/181905361-f07fc6ac-042f-4ab1-b281-ef7bc511c969.png)

### Alternatives considered
Adding small service logos next to the reconciled status green bar, but that solution does not always translate 1:1 with the data extension use case. 

### Additional context
This feature request is most useful during schema building, so the prefixes should naturally be carried over to the drag / drop elements in that interface that contain the column names. 

Pull request description:
Improve how to indicate the data source following data extension#5130
Fixes #5130

Changes proposed in this pull request:
- Adds a variable sourceReconConfig that contains the information about the reconconfig of the column from which data is extended from
- Also updated the tests to test for sourceReconConfig
- Finally, a tooltip is added to the new column which contains the extended data.


Patch:
diff --git a/benchmark/pom.xml b/benchmark/pom.xml
index f8fcae8a2..5858d30a1 100644
--- a/benchmark/pom.xml
+++ b/benchmark/pom.xml
@@ -149,7 +149,7 @@
         </plugin>
         <plugin>
           <artifactId>maven-surefire-plugin</artifactId>
-          <version>3.2.3</version>
+          <version>3.2.5</version>
           <configuration>
             <skipTests>true</skipTests>
           </configuration>
diff --git a/extensions/database/pom.xml b/extensions/database/pom.xml
index 0a294e654..02c073747 100644
--- a/extensions/database/pom.xml
+++ b/extensions/database/pom.xml
@@ -105,7 +105,7 @@
     <dependency>
       <groupId>org.xerial</groupId>
       <artifactId>sqlite-jdbc</artifactId>
-      <version>3.44.1.0</version>
+      <version>3.45.0.0</version>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
diff --git a/extensions/gdata/module/langs/translation-he.json b/extensions/gdata/module/langs/translation-he.json
index 23ed5de78..cac098096 100644
--- a/extensions/gdata/module/langs/translation-he.json
+++ b/extensions/gdata/module/langs/translation-he.json
@@ -48,5 +48,7 @@
     "gdata-exporter/export-to-google-drive": "מיזם OpenRefine שומר בארכיון ל־Google Drive…",
     "gdata-import/re-sign-in-another": "כניסה עם חשבון אחר",
     "gdata-import/please-signin": "נא להיכנס כדי לאשר את הגישה לנתונים שלך ב־Google",
-    "gdata-parsing/disable-auto-preview": "השבתת תצוגה מקדימה אוטומטית"
+    "gdata-parsing/disable-auto-preview": "השבתת תצוגה מקדימה אוטומטית",
+    "gdata-import/please-name-project": "נא לתת שם למיזם.",
+    "gdata-import/errors": "שגיאות:\n $1"
 }
diff --git a/extensions/gdata/pom.xml b/extensions/gdata/pom.xml
index 2ed919c1b..159794763 100644
--- a/extensions/gdata/pom.xml
+++ b/extensions/gdata/pom.xml
@@ -84,7 +84,7 @@
     <dependency>
       <groupId>com.google.apis</groupId>
       <artifactId>google-api-services-drive</artifactId>
-      <version>v3-rev20231128-2.0.0</version>
+      <version>v3-rev20240110-2.0.0</version>
     </dependency>
     <dependency>
       <groupId>com.google.apis</groupId>
diff --git a/main/resources/com/google/refine/grel/ControlEvalError_he.properties b/main/resources/com/google/refine/grel/ControlEvalError_he.properties
index e69de29bb..5715cd62c 100644
--- a/main/resources/com/google/refine/grel/ControlEvalError_he.properties
+++ b/main/resources/com/google/refine/grel/ControlEvalError_he.properties
@@ -0,0 +1,15 @@
+expects_second_third_args_different={0} מצפה שהארגומנטים השני והשלישי יהיו שמות משתנים שונים
+foreach_index=הארגומנט הראשון ל־forEachIndex הוא לא מערך או עצם JSON
+filter=הארגומנט הראשון הוא לא מערך
+foreach=הארגומנט הראשון ל־forEach הוא לא מערך או עצם JSON
+
+
+# check arguments
+expects_one_arg={0} מצפה לארגומנט אחד
+expects_three_args={0} מצפה לשלושה ארגומנטים
+expects_four_args={0} מצפה לארבעה ארגומנטים
+expects_second_arg_var_name={0} מצפה שהארגומנט השני יהיה שם משתנה
+expects_second_arg_index_var_name={0} מצפה שהארגומנט השני יהיה שם המשתנה של המפתח
+for_range=הארגומנטים הראשון, השני והשלישי של forRange חייבים להיות מספרים
+expects_five_args={0} מצפה לחמישה ארגומנטים
+expects_third_arg_element_var_name={0} מצפה שהארגומנט השני יהיה שם המשתנה של הרכיב
diff --git a/main/src/com/google/refine/model/Column.java b/main/src/com/google/refine/model/Column.java
index 7c456cec6..7dd296055 100644
--- a/main/src/com/google/refine/model/Column.java
+++ b/main/src/com/google/refine/model/Column.java
@@ -55,6 +55,7 @@ public class Column {
     private ReconStats _reconStats;
 
     transient protected Map<String, Object> _precomputes;
+    private ReconConfig _sourceReconConfig;
 
     @JsonCreator
     public Column(
@@ -95,6 +96,17 @@ public class Column {
         return _reconConfig;
     }
 
+    @JsonProperty("sourceReconConfig")
+    public void setSourceReconConfig(ReconConfig sourceConfig) {
+        this._sourceReconConfig = sourceConfig;
+    }
+
+    @JsonProperty("sourceReconConfig")
+    @JsonInclude(Include.NON_NULL)
+    public ReconConfig getSourceReconConfig() {
+        return _sourceReconConfig;
+    }
+
     @JsonProperty("reconStats")
     public void setReconStats(ReconStats stats) {
         this._reconStats = stats;
diff --git a/main/src/com/google/refine/model/changes/DataExtensionChange.java b/main/src/com/google/refine/model/changes/DataExtensionChange.java
index 8adbcb9b7..1ba0366b5 100644
--- a/main/src/com/google/refine/model/changes/DataExtensionChange.java
+++ b/main/src/com/google/refine/model/changes/DataExtensionChange.java
@@ -220,6 +220,9 @@ public class DataExtensionChange implements Change {
                         _identifierSpace,
                         _schemaSpace,
                         columnType));
+                if (project.columnModel.getColumnByName(_baseColumnName) != null) {
+                    column.setSourceReconConfig(project.columnModel.getColumnByName(_baseColumnName).getReconConfig());
+                }
                 ReconStats reconStats = ReconStats.create(project, cellIndex);
                 if (reconStats.matchedTopics > 0) {
                     column.setReconStats(reconStats);
diff --git a/main/webapp/modules/core/langs/translation-en.json b/main/webapp/modules/core/langs/translation-en.json
index 2eec9bb9e..1c64feb83 100644
--- a/main/webapp/modules/core/langs/translation-en.json
+++ b/main/webapp/modules/core/langs/translation-en.json
@@ -463,6 +463,8 @@
     "core-views/create-topic-cell": "Create a new item for this cell",
     "core-views/create-topic": "Create new item",
     "core-views/search-match": "Search for match",
+    "core-views/see-more": "See more",
+    "core-views/see-less": "See less",
     "core-views/item-to-match": "Item to match",
     "core-views/not-valid-number": "Not a valid number.",
     "core-views/not-valid-date": "Not a valid date.",
@@ -524,6 +526,7 @@
     "core-views/warning-sel-judg": "Please select at least one kind of judgment to copy.",
     "core-views/start-recon": "Start reconciling…",
     "core-views/recon-text-fb": "Reconcile text in this column with items in another data source",
+    "core-views/data-extended-from" : "Data extended from $1",
     "core-views/facets": "Facets",
     "core-views/by-judg": "By judgment",
     "core-views/judgment": "$1: judgment",
diff --git a/main/webapp/modules/core/scripts/views/data-table/cell-renderers/recon-renderer.js b/main/webapp/modules/core/scripts/views/data-table/cell-renderers/recon-renderer.js
index 48a6df4b6..ac9d4e392 100644
--- a/main/webapp/modules/core/scripts/views/data-table/cell-renderers/recon-renderer.js
+++ b/main/webapp/modules/core/scripts/views/data-table/cell-renderers/recon-renderer.js
@@ -90,8 +90,13 @@ class ReconCellRenderer {
           var ul = $('<div></div>').addClass("data-table-recon-candidates").appendTo(divContentRecon);
           if ("c" in r && r.c.length > 0) {
             var candidates = r.c;
+            var visibleCandidates = 3;
             var renderCandidate = function(candidate, index) {
               var li = $('<div></div>').addClass("data-table-recon-candidate").appendTo(ul);
+              
+              if (index >= visibleCandidates) {
+                li.hide();
+              }
               var liSpan = $('<span></span>').appendTo(li);
 
               $('<a href="javascript:{}">&nbsp;</a>')
@@ -128,7 +133,29 @@ class ReconCellRenderer {
               }
               $('<span></span>').addClass("data-table-recon-score").text("(" + score + ")").appendTo(liSpan);
             };
-
+            var visibilityChoices = $('<div>').addClass("data-table-recon-visibility").appendTo(divContentRecon);
+            if (candidates.length > visibleCandidates) {
+              var isExpanded = false; // Variable to track visibility state
+              var seeMoreLink = $('<a href="javascript:{}"></a>')
+              .on('click', function(evt) {
+                var link = $(this);
+                isExpanded = !isExpanded; // Toggle visibility state
+                if (isExpanded) {
+                  ul.find('.data-table-recon-candidate').show(); // Show all candidates
+                  seeMoreLink.text($.i18n('core-views/see-less')); // Change link text to "See Less"
+
+                } 
+                else {
+                  ul.find('.data-table-recon-candidate:not(:lt(' + visibleCandidates + '))').hide();
+                  ul.find('.data-table-recon-candidate:last').show();
+                  seeMoreLink.text($.i18n('core-views/see-more')); // Change link text to "See More"
+                }
+                return false;  
+              })
+              .text($.i18n('core-views/see-more'))
+              .appendTo(visibilityChoices);
+              seeMoreLink.after(" | ");
+          }
             for (var i = 0; i < candidates.length; i++) {
               renderCandidate(candidates[i], i);
             }
@@ -165,8 +192,7 @@ class ReconCellRenderer {
             }
             addSuggest = true;
           }
-
-          var extraChoices = $('<div>').addClass("data-table-recon-extra").appendTo(divContentRecon);
+          var extraChoices = $('<div>').addClass("data-table-recon-extra").appendTo(visibilityChoices);
           if (addSuggest) {
             $('<a href="javascript:{}"></a>')
             .on('click',function(evt) {
diff --git a/main/webapp/modules/core/scripts/views/data-table/column-header-ui.js b/main/webapp/modules/core/scripts/views/data-table/column-header-ui.js
index 2356e9071..1c7f1191f 100644
--- a/main/webapp/modules/core/scripts/views/data-table/column-header-ui.js
+++ b/main/webapp/modules/core/scripts/views/data-table/column-header-ui.js
@@ -94,6 +94,18 @@ DataTableColumnHeaderUI.prototype._render = function() {
       .appendTo(whole);
     }
   }
+  if("sourceReconConfig" in this._column) {
+    if(this._column.sourceReconConfig.service){
+     var service = ReconciliationManager.getServiceFromUrl(this._column.sourceReconConfig.service);
+     var serviceName;
+     if(service) {
+       serviceName=service.name;
+     }
+     if(serviceName){
+      elmts.nameContainer.attr("title",$.i18n('core-views/data-extended-from',service.name));
+      }
+    }
+  }
 };
 
 DataTableColumnHeaderUI.prototype._createMenuForColumnHeader = function(elmt) {
diff --git a/main/webapp/modules/core/styles/views/data-table-view.css b/main/webapp/modules/core/styles/views/data-table-view.css
index 0b4e6fe43..86cff4279 100644
--- a/main/webapp/modules/core/styles/views/data-table-view.css
+++ b/main/webapp/modules/core/styles/views/data-table-view.css
@@ -279,21 +279,26 @@ a.data-table-recon-topic {
   margin: 0 0.5em;
 }
 
-a.data-table-recon-action, .data-table-recon-extra>a {
+a.data-table-recon-action, .data-table-recon-extra>a, .data-table-recon-visibility>a {
   text-decoration: none;
   color: var(--link-secondary);
 }
-.data-table-error-extra>a{
-  font-size: 0.8em;;
-  text-decoration: none;
-  color: var(--link-secondary);
+
+.data-table-recon-visibility{
+  font-size: 0.8em;
 }
-a.data-table-recon-action, .data-table-recon-extra {
+.data-table-recon-extra,.data-table-recon-visibily {
+  display: inline;
+  margin: 3px 0 0;
+}
+
+a.data-table-recon-action{
   font-size: 0.8em;
   display: block;
   margin: 3px 0 0;
 }
 
+
 a.data-table-recon-match, a.data-table-recon-match-similar {
   position: absolute;
   top: 0;
diff --git a/packaging/pom.xml b/packaging/pom.xml
index 1e93b7c17..b21c43a56 100644
--- a/packaging/pom.xml
+++ b/packaging/pom.xml
@@ -421,7 +421,7 @@
       <plugin>
         <groupId>com.akathist.maven.plugins.launch4j</groupId>
         <artifactId>launch4j-maven-plugin</artifactId>
-        <version>2.4.1</version>
+        <version>2.5.0</version>
         <executions>
           <execution>
             <id>l4j-clui-without-jre</id>
@@ -508,7 +508,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>3.2.3</version>
+        <version>3.2.5</version>
         <configuration>
           <skip>true</skip>
         </configuration>
diff --git a/pom.xml b/pom.xml
index 35cd2ef0b..e25b50f4e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -108,7 +108,7 @@
     <httpmime.version>4.5.14</httpmime.version>
     <owasp-encoder.version>1.2.3</owasp-encoder.version>
     <jasypt.version>1.9.3</jasypt.version>
-    <mockito.version>5.8.0</mockito.version>
+    <mockito.version>5.9.0</mockito.version>
 
     <!-- plugin versions -->
     <build-helper-maven-plugin.version>3.5.0</build-helper-maven-plugin.version>
@@ -118,7 +118,7 @@
     <maven-dependency-plugin.version>3.6.1</maven-dependency-plugin.version>
     <jacoco-maven-plugin.version>0.8.11</jacoco-maven-plugin.version>
     <coveralls-maven-plugin.version>4.3.0</coveralls-maven-plugin.version>
-    <surefire.version>3.2.3</surefire.version>
+    <surefire.version>3.2.5</surefire.version>
     <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
     <maven-clean-plugin.version>3.3.2</maven-clean-plugin.version>
     <git-commit-id-plugin.version>4.9.10</git-commit-id-plugin.version>
diff --git a/refine.bat b/refine.bat
index 3e6768dfd..2f4ce0bdc 100644
--- a/refine.bat
+++ b/refine.bat
@@ -171,7 +171,6 @@ set REFINE_LIB_DIR=server\target\lib
 :gotLibDir
 
 if not "%REFINE_VERBOSITY%" == "" goto gotVerbosity
-set REFINE_VERBOSITY=info
 :gotVerbosity
 set OPTS=%OPTS% -Drefine.verbosity=%REFINE_VERBOSITY%
 
diff --git a/server/src/com/google/refine/Refine.java b/server/src/com/google/refine/Refine.java
index e0b800616..f3c46efa1 100644
--- a/server/src/com/google/refine/Refine.java
+++ b/server/src/com/google/refine/Refine.java
@@ -53,7 +53,9 @@ import javax.swing.JFrame;
 
 import com.google.util.threads.ThreadPoolExecutorAdapter;
 import org.apache.commons.lang.SystemUtils;
-import org.apache.log4j.Level;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.config.Configurator;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.Server;
@@ -96,7 +98,10 @@ public class Refine {
         // System.setProperty("debug","true");
 
         // set the log verbosity level
-        org.apache.log4j.Logger.getRootLogger().setLevel(Level.toLevel(Configurations.get("refine.verbosity", "info")));
+        String logLevelArg = Configurations.get("refine.verbosity");
+        if (logLevelArg != null && !logLevelArg.isEmpty()) {
+            Configurator.setAllLevels(LogManager.getRootLogger().getName(), Level.toLevel(logLevelArg));
+        }
 
         port = Configurations.getInteger("refine.port", DEFAULT_PORT);
         iface = Configurations.get("refine.interface", DEFAULT_IFACE);


Test patch:
diff --git a/main/tests/cypress/cypress/e2e/project/grid/column/reconcile/actions/see-more-and-see-less.cy.js b/main/tests/cypress/cypress/e2e/project/grid/column/reconcile/actions/see-more-and-see-less.cy.js
new file mode 100644
index 000000000..754034602
--- /dev/null
+++ b/main/tests/cypress/cypress/e2e/project/grid/column/reconcile/actions/see-more-and-see-less.cy.js
@@ -0,0 +1,47 @@
+describe('Show more or less reconciliation candidates', () => {
+    afterEach(() => {
+        cy.addProjectForDeletion();
+    });
+    
+    it('Testing see more / see less', () => {
+        cy.visitOpenRefine();
+        cy.navigateTo('Import project');
+        cy.get('.grid-layout').should('to.contain', 'Locate an existing Refine project file');
+
+        //we're using here the "no automatch" project, so rows are reconciled and we have more than 3 matched candidates
+        cy.get('#project-tar-file-input').attachFile('reconciled-project-no-automatch.zip')
+        cy.get('#import-project-button').click();
+
+        //confirming that we have see more options
+        cy.getCell(0, 'species').find('.data-table-recon-visibility').should('to.contain', 'See more');
+        cy.getCell(1, 'species').find('.data-table-recon-visibility').should('to.contain', 'See more');
+        cy.getCell(2, 'species').find('.data-table-recon-visibility').should('to.contain', 'See more');
+        cy.getCell(3, 'species').find('.data-table-recon-visibility').should('to.contain', 'See more');
+        cy.getCell(4, 'species').find('.data-table-recon-visibility').should('to.contain', 'See more');
+        cy.getCell(5, 'species').find('.data-table-recon-visibility').should('to.contain', 'See more');
+
+        //confirming the initial no. of candidates
+        cy.getCell(0, 'species').find('.data-table-recon-candidate:visible').should('have.length', 4);
+
+        //clicking the see more option
+        cy.getCell(0, 'species').find('.data-table-recon-visibility').contains('See more').click();
+
+        //confirming the no. of candidates after we click on see more
+        cy.getCell(0, 'species').find('.data-table-recon-candidate:visible').should('have.length', 6);
+        
+        //verifying that the see more option has changed to see less
+        cy.getCell(0, 'species').find('.data-table-recon-visibility').should('to.contain', 'See less');
+
+        //clicking the see less option
+        cy.getCell(0, 'species').find('.data-table-recon-visibility').contains('See less').click();
+
+        //confirming the no. of candidates after we click on see less
+        cy.getCell(0, 'species').find('.data-table-recon-candidate:visible').should('have.length', 4);
+
+         
+        
+        
+    });
+});
+
+
diff --git a/main/tests/cypress/package.json b/main/tests/cypress/package.json
index 6251c1c73..4d986346e 100644
--- a/main/tests/cypress/package.json
+++ b/main/tests/cypress/package.json
@@ -16,7 +16,7 @@
         "lint": "prettier --check . && eslint ."
     },
     "dependencies": {
-        "cypress": "13.6.2",
+        "cypress": "13.6.3",
         "cypress-file-upload": "^5.0.8"
     },
     "devDependencies": {
@@ -24,6 +24,6 @@
         "eslint-config-google": "^0.14.0",
         "eslint-config-prettier": "^9.1.0",
         "eslint-plugin-cypress": "^2.15.1",
-        "prettier": "3.1.1"
+        "prettier": "3.2.4"
     }
 }
diff --git a/main/tests/cypress/yarn.lock b/main/tests/cypress/yarn.lock
index 37db221b3..429daccc9 100644
--- a/main/tests/cypress/yarn.lock
+++ b/main/tests/cypress/yarn.lock
@@ -116,7 +116,7 @@
   resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz"
   integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
 
-"@types/node@*", "@types/node@^18.17.5":
+"@types/node@*":
   version "18.17.15"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.15.tgz#31301a273b9ca7d568fe6d1c35ae52e0fb3f8d6a"
   integrity sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==
@@ -436,14 +436,13 @@ cypress-file-upload@^5.0.8:
   resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1"
   integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==
 
-cypress@13.6.2:
-  version "13.6.2"
-  resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.6.2.tgz#c70df09db0a45063298b3cecba2fa21109768e08"
-  integrity sha512-TW3bGdPU4BrfvMQYv1z3oMqj71YI4AlgJgnrycicmPZAXtvywVFZW9DAToshO65D97rCWfG/kqMFsYB6Kp91gQ==
+cypress@13.6.3:
+  version "13.6.3"
+  resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.6.3.tgz#54f03ca07ee56b2bc18211e7bd32abd2533982ba"
+  integrity sha512-d/pZvgwjAyZsoyJ3FOsJT5lDsqnxQ/clMqnNc++rkHjbkkiF2h9s0JsZSyyH4QXhVFW3zPFg82jD25roFLOdZA==
   dependencies:
     "@cypress/request" "^3.0.0"
     "@cypress/xvfb" "^1.2.4"
-    "@types/node" "^18.17.5"
     "@types/sinonjs__fake-timers" "8.1.1"
     "@types/sizzle" "^2.3.2"
     arch "^2.2.0"
@@ -1309,10 +1308,10 @@ prelude-ls@^1.2.1:
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz"
   integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
 
-prettier@3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848"
-  integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==
+prettier@3.2.4:
+  version "3.2.4"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283"
+  integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==
 
 pretty-bytes@^5.6.0:
   version "5.6.0"
diff --git a/main/tests/server/src/com/google/refine/model/ColumnTests.java b/main/tests/server/src/com/google/refine/model/ColumnTests.java
index 0d34c1cef..7aa7c2523 100644
--- a/main/tests/server/src/com/google/refine/model/ColumnTests.java
+++ b/main/tests/server/src/com/google/refine/model/ColumnTests.java
@@ -60,6 +60,19 @@ public class ColumnTests {
                 + "      {\"column\":\"organization_id\",\"propertyName\":\"SPARQL: P3500|P2427\",\"propertyID\":\"P3500|P2427\"}"
                 + "    ],"
                 + "    \"limit\":0},"
+                + "\"sourceReconConfig\":{"
+                + "   \"mode\":\"standard-service\","
+                + "   \"service\":\"https://tools.wmflabs.org/openrefine-wikidata/en/api\","
+                + "   \"identifierSpace\":\"http://www.wikidata.org/entity/\","
+                + "   \"schemaSpace\":\"http://www.wikidata.org/prop/direct/\","
+                + "   \"type\":{\"id\":\"Q43229\",\"name\":\"organization\"},"
+                + "   \"autoMatch\":true,"
+                + "   \"batchSize\":10,"
+                + "   \"columnDetails\":["
+                + "      {\"column\":\"organization_country\",\"propertyName\":\"SPARQL: P17/P297\",\"propertyID\":\"P17/P297\"},"
+                + "      {\"column\":\"organization_id\",\"propertyName\":\"SPARQL: P3500|P2427\",\"propertyID\":\"P3500|P2427\"}"
+                + "    ],"
+                + "    \"limit\":0},"
                 + "\"reconStats\":{"
                 + "    \"nonBlanks\":299,"
                 + "    \"newTopics\":0,"
diff --git a/main/tests/server/src/com/google/refine/operations/recon/ExtendDataOperationTests.java b/main/tests/server/src/com/google/refine/operations/recon/ExtendDataOperationTests.java
index b7e191ba0..b3067160d 100644
--- a/main/tests/server/src/com/google/refine/operations/recon/ExtendDataOperationTests.java
+++ b/main/tests/server/src/com/google/refine/operations/recon/ExtendDataOperationTests.java
@@ -68,6 +68,7 @@ import com.google.refine.model.Project;
 import com.google.refine.model.Recon;
 import com.google.refine.model.ReconCandidate;
 import com.google.refine.model.Row;
+import com.google.refine.model.recon.DataExtensionReconConfig;
 import com.google.refine.model.recon.ReconciledDataExtensionJob;
 import com.google.refine.model.recon.ReconciledDataExtensionJob.DataExtensionConfig;
 import com.google.refine.operations.EngineDependentOperation;
@@ -154,6 +155,9 @@ public class ExtendDataOperationTests extends RefineTest {
     public void SetUp() throws IOException, ModelException {
         OperationRegistry.registerOperation(getCoreModule(), "extend-reconciled-data", ExtendDataOperation.class);
         project = createProjectWithColumns("DataExtensionTests", "country");
+        project.columnModel.getColumnByName("country").setReconConfig(new DataExtensionReconConfig(RECON_SERVICE,
+                RECON_IDENTIFIER_SPACE,
+                RECON_SCHEMA_SPACE, null));
 
         options = mock(Properties.class);
         engine = new Engine(project);
@@ -284,6 +288,9 @@ public class ExtendDataOperationTests extends RefineTest {
 
             // Make sure we did not create any recon stats for that column (no reconciled value)
             Assert.assertTrue(project.columnModel.getColumnByName("ISO 3166-1 alpha-2 code").getReconStats() == null);
+            // adding an assertion for sourceReconConfig
+            Assert.assertTrue(project.columnModel.getColumnByName("ISO 3166-1 alpha-2 code").getSourceReconConfig() != null);
+
         }
     }