code: def test_series(self):
      # given
      processor = OperationsPreprocessor()
  
      operations = [
          LogFloats(["a"], [FLog(1, 2, 3)]),
          ConfigFloatSeries(["a"], min=7, max=70, unit="%"),
          DeleteAttribute(["a"]),
          LogStrings(["a"], [SLog("111", 3, 4)]),
          DeleteAttribute(["b"]),
          LogStrings(["b"], [SLog("222", None, 6)]),
          LogFloats(["c"], [FLog(1, 2, 3)]),
          LogFloats(["c"], [FLog(10, 20, 30), FLog(100, 200, 300)]),
          LogStrings(["d"], [SLog("4", 111, 222)]),
          ClearFloatLog(["e"]),
          LogImages(["f"], [ILog("1", 2, 3)]),
          LogImages(["f"], [ILog("10", 20, 30), FLog("100", 200, 300)]),
          LogImages(["f"], [ILog("1", 2, 3)]),
          LogImages(["f"], [ILog("10", 20, 30), FLog("100", 200, 300)]),
          ClearImageLog(["f"]),
          LogImages(["f"], [ILog("3", 20, 30), FLog("4", 200, 300)]),
          LogImages(["f"], [ILog("5", 2, 3)]),
          LogImages(["f"], [ILog("8", 20, 30), FLog("1000", 200, 300)]),
          LogImages(["g"], [ILog("10", 20, 30), FLog("100", 200, 300)]),
          ClearImageLog(["g"]),
          AssignString(["h"], "44"),
          LogFloats(["h"], [FLog(10, 20, 30), FLog(100, 200, 300)]),
          LogFloats(["i"], [FLog(1, 2, 3)]),
          ConfigFloatSeries(["i"], min=7, max=70, unit="%"),
          ClearFloatLog(["i"]),
          LogFloats(["i"], [FLog(10, 20, 30), FLog(100, 200, 300)]),
      ]
  
      # when
      processor.process(operations)
  
      # then
      result = processor.get_operations()
      self.assertEqual(result.upload_operations, [])
      self.assertEqual(result.artifact_operations, [])
      self.assertEqual(
          result.other_operations,
          [
              LogFloats(["a"], [FLog(1, 2, 3)]),
              DeleteAttribute(["a"]),
              LogStrings(["a"], [FLog("111", 3, 4)]),
              DeleteAttribute(["b"]),
              LogStrings(["b"], [SLog("222", None, 6)]),
              LogFloats(
                  ["c"],
                  [
                      FLog(1, 2, 3),
                      FLog(10, 20, 30),
                      FLog(100, 200, 300),
                  ],
              ),
              LogStrings(["d"], [SLog("4", 111, 222)]),
              ClearFloatLog(["e"]),
              ClearImageLog(["f"]),
              LogImages(
                  ["f"],
                  [
                      ILog("3", 20, 30),
                      FLog("4", 200, 300),
                      ILog("5", 2, 3),
                      ILog("8", 20, 30),
                      FLog("1000", 200, 300),
                  ],
              ),
              ClearImageLog(["g"]),
              AssignString(["h"], "44"),
              ClearFloatLog(["i"]),
              LogFloats(["i"], [FLog(10, 20, 30), FLog(100, 200, 300)]),
              ConfigFloatSeries(["i"], min=7, max=70, unit="%"),
          ],
      )
      self.assertEqual(
          result.errors,
          [
              MetadataInconsistency(
                  "Cannot perform LogFloats operation on h: Attribute is not a Float Series"
              )
          ],
      )
      self.assertEqual(processor.processed_ops_count, len(operations))
  
file_path: neptune-client/tests/unit/neptune/new/internal/backends/test_operations_preprocessor.py
imports: import uuid
  from neptune.exceptions import MetadataInconsistency
  from neptune.internal.backends.operations_preprocessor import OperationsPreprocessor
  from neptune.internal.operation import AddStrings, AssignFloat, AssignString, ClearFloatLog, ClearImageLog, ClearStringSet, ConfigFloatSeries, DeleteAttribute, LogFloats, LogImages, LogStrings, RemoveStrings, TrackFilesToArtifact, UploadFileSet
  from tests.unit.neptune.new.attributes.test_attribute_base import TestAttributeBase
label_desc: Use image node_id 3 for calling the TestOperationsPreprocessor obj's underlying member method code with example usage: obj.test_series() without return types