class_docstr: Test ArtifactExtractor class 
class_docstr_tok: ["Test","ArtifactExtractor","class"]
docstr: ArtifactExtractor - Test run method extract zero artifact
docstr_tok: ["ArtifactExtractor","-","Test","run","method","extract","zero","artifact"]
code: def test_run_zero_artifact(self, logger_mock):
      """ArtifactExtractor - Test run method extract zero artifact"""
      self._artifact_extractor.run(generate_categorized_records())
      logger_mock.assert_has_calls(
          [
              call.debug(
                  "Extracting artifacts from %d %s logs",
                  2,
                  "log_type_01_sub_type_01",
              ),
              call.debug("Extracted %d artifact(s)", 0),
          ]
      )
  
      assert_equal(self._artifact_extractor._artifacts, list())
  
file_path: streamalert/tests/unit/streamalert/shared/test_artifact_extractor.py
imports: from mock import call, patch
  from nose.tools import assert_equal
  from streamalert.shared.artifact_extractor import Artifact, ArtifactExtractor
  from streamalert.shared.firehose import FirehoseClient
  from tests.unit.streamalert.shared.test_utils import generate_artifacts, generate_categorized_records, MOCK_RECORD_ID
label_desc: Use image node_id 3 for calling the TestArtifactExtractor obj's underlying member method code with example usage: obj.test_run_zero_artifact(logger_mock) without return types