code: def test_side_data_errors(self):
      # This test makes sure that passing in a column name as the
      # observation_data that was originally part of the side data
      # causes an error.
  
      X = tc.SFrame()
  
      X["user_id"] = [1231, 1232]
      X["item_id"] = [131, 1232]
      X["side_info"] = [111, 111]
      X["rating"] = [12, 13]
  
      from copy import copy
  
      X2 = copy(X)
  
      # Add in one that overlaps the item hair in the field below
      X2["item_hair"] = [1342, 24233]
      del X2["item_id"]
  
      user_side = tc.SFrame()
      user_side["user_id"] = [1231, 1232]
      user_side["user_hair"] = ["big", "bigger"]
  
      item_side = tc.SFrame()
      item_side["item_id"] = [1231, 1232]
      item_side["item_hair"] = ["big", "bigger"]
  
      for mod in [
          tc.recommender.item_similarity_recommender,
          tc.recommender.factorization_recommender,
          tc.recommender.ranking_factorization_recommender,
          tc.recommender.popularity_recommender,
      ]:
          m = mod.create(
              X,
              "user_id",
              "item_id",
              "rating",
              user_data=user_side,
              item_data=item_side,
          )
  
          self.assertRaises(Exception, lambda: m.recommend(X2))
  
file_path: turicreate/src/python/turicreate/test/test_recsys_api.py
imports: from __future__ import print_function
  from __future__ import division
  from __future__ import absolute_import
  import unittest
  import sys
  import turicreate
label_desc: Use image node_id 8 for calling the AdditionalDataTest obj's underlying member method code with example usage: obj.test_side_data_errors() without return types